malloc&&fread

复制代码
   const char *wavePath = [_filePath UTF8String];
    FILE *fh;
    int16_t * adbuf;
    fh =  fopen(wavePath, "rb");
    if (fh == NULL) {
        NSLog(@"Unable to open input file ");
    }
    
    //模型需要每16个bit的特征信息
    // 获得wav文件的字节数/2,前面44bytes是wav的文件头,去掉

    //定位到文件结尾
    fseek(fh, 0, SEEK_END);

    // 获取文件长度 最后的舍弃
    int flen =(int)(ftell(fh)-44)/2 - 1;

    // 重新定位到开头,准备读入文件内容
    fseek(fh, 44, SEEK_SET);

    
    // 申请空间存储读入内容
   //代表初始化了flen个16bit即两个byte的内存空间
adbuf = (int16_t *)malloc(sizeof(int16_t)*flen);
  //然后每16 16个bit这样读进去,读的次数为flen fread(adbuf,
sizeof(int16_t), flen, fh); // 获得特征信息 csf_float* feature; NSLog(@"flex:%d",flen); int number_frames = csf_logfbank(adbuf, flen, 16000, 0.02, 0.01, 40, 512, 0, 8000, 0.97, NULL, &feature, NULL); printf("Number of frames: %d \n", number_frames); for (int i = 0; i< 40*(number_frames - 1); i++){ // 舍弃最后几个ms的特征值 [array1 addObject:[NSNumber numberWithFloat:feature[i]]]; } // 释放内存 free(adbuf); adbuf = NULL;
复制代码

 

目的是将录好的wave文件转成CoreMLmodel可以识别的数据。

最后的array1就是wave文件提取的特征值

因为我们提前不知道wave文件有多大,所以用malloc来动态分配内存来处理。

 

posted @   小师傅啊小师傅  阅读(388)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示