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来动态分配内存来处理。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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框架的用法!