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来动态分配内存来处理。