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 @ 2019-06-18 18:38  小师傅啊小师傅  阅读(384)  评论(0编辑  收藏  举报