Xcode12.4运行MFCC转Wekinator示例报AddInstanceForFactory错误
问题排查与解决方案
1. AddInstanceForFactory 报错说明
该报错为Xcode编译旧版本openFrameworks项目时触发的macOS音频组件兼容警告,对应的CFUUID是系统内置的AUDynamicProcessor音效组件,不会影响核心音频采集逻辑,无需针对性修复,不属于MFCC无数值的诱因。
2. MFCC无数值的修复步骤
- 修复单声道音频读取逻辑错误
你当前配置的是单声道输入(ofSoundStreamSetup第二个参数为1),但audioReceived中按双声道交错格式读取输入buffer,属于越界访问,无法拿到正确的音频数据,修改为如下逻辑:
void ofApp::audioReceived (float * input, int bufferSize, int nChannels){ for (int i = 0; i < bufferSize; i++){ lAudioIn[i] = input[i]; rAudioIn[i] = input[i]; } }
- 修复音频输出缓冲区操作错误
你将memset清空输出缓冲区的逻辑放在了audioRequested的采样循环内部,每处理一个采样点就清空整个缓冲区,同时没有把输出数据写入系统音频buffer,部分旧版本OF会因此导致音频流中断,修改为如下逻辑:
void ofApp::audioRequested (float * output, int bufferSize, int nChannels){ for (int i = 0; i < bufferSize; i++){ wave = lAudioIn[i]; if (mfft.process(wave)) { mfft.magsToDB(); oct.calculate(mfft.magnitudesDB); mfcc.mfcc(mfft.magnitudes, mfccs); } output[i*2] = lAudioOut[i]; output[i*2+1] = rAudioOut[i]; } memset(lAudioOut, 0, initialBufferSize * sizeof(float)); memset(rAudioOut, 0, initialBufferSize * sizeof(float)); }
- 可选:手动指定音频输入设备
若修改后仍无数据,可在setup中调用ofSoundStreamSetup前添加如下代码,确认麦克风设备被正确识别并指定使用:
ofSoundStreamListDevices(); // 替换为控制台打印出的麦克风设备对应的ID ofSoundStreamSetDevice(0);
- 可选:初始化MFCC数组默认值
为避免启动时出现异常随机柱状条,在malloc申请mfccs内存后添加初始化逻辑:
mfccs = (double*) malloc(sizeof(double) * 13); memset(mfccs, 0, sizeof(double)*13);
完成上述修改后重新编译运行,即可正常采集音频计算MFCC,柱状条会随声音输入正常跳动。
内容的提问来源于stack exchange,提问作者夏磊蕾
相关产品推荐
相关产品推荐

