AudioKit如何给同一输入安装多个tap实现AudioKitUI+语音识别
问题解决方案
你遇到的崩溃错误-10868对应kAudioUnitErr_TapExists,本质是违反了AVAudioNode的原生限制:同一节点同一bus上只能安装一个tap,和AudioKit源码注释的说明完全吻合:
// 同一时间一个节点只能安装一个tap,请确保所有之前的tap都已移除。我们假设之前的tap(如果存在)和我们的bus变量安装在同一个bus上。
核心解决思路
不需要绕过单tap限制,只需复用同一个tap做数据分发即可,比多节点分流的方案性能更高、同步性更好。
具体实现步骤
- 放弃FFTView自动绑定音频节点的初始化方法,使用支持手动传入音频数据的调用方式
- 仅在麦克风节点上安装1个全局tap,在tap回调中同步分发数据到两个业务逻辑:
- 把
AVAudioPCMBuffer传给语音识别请求 - 把
AVAudioPCMBuffer同步传给FFTView做频谱渲染
- 把
示例代码如下:
// 先清空目标bus上已有的tap,避免残留冲突 audioManager.mic.avAudioNode.removeTap(onBus: 0) // 全局仅安装一个tap audioManager.mic.avAudioNode.installTap(onBus: 0, bufferSize: 1024, format: inputFormat) { [weak self] buffer, when in guard let self = self else { return } // 业务1:语音识别数据输入 self.recognitionRequest?.append(buffer) // 业务2:手动更新FFTView(不同AudioKitUI版本方法名可能略有差异,常见为update/ pushBuffer) self.fftView.update(with: buffer) }
备选兼容方案
如果你使用的AudioKitUI版本没有公开FFTView的手动更新方法,可自行实例化AudioKit内置的FFT计算工具,在tap回调中完成FFT计算后,再把频谱数据传给FFTView渲染即可。
内容的提问来源于stack exchange,提问作者Maximilian
相关产品推荐
相关产品推荐

