You need to enable JavaScript to run this app. AudioKit如何给同一输入安装多个tap实现AudioKitUI+语音识别
优惠活动
大模型
产品
解决方案
定价
更多

AudioKit如何给同一输入安装多个tap实现AudioKitUI+语音识别

问题解决方案

你遇到的崩溃错误-10868对应kAudioUnitErr_TapExists,本质是违反了AVAudioNode的原生限制:同一节点同一bus上只能安装一个tap,和AudioKit源码注释的说明完全吻合:

// 同一时间一个节点只能安装一个tap,请确保所有之前的tap都已移除。我们假设之前的tap(如果存在)和我们的bus变量安装在同一个bus上。

核心解决思路

不需要绕过单tap限制,只需复用同一个tap做数据分发即可,比多节点分流的方案性能更高、同步性更好。

具体实现步骤

  • 放弃FFTView自动绑定音频节点的初始化方法,使用支持手动传入音频数据的调用方式
  • 仅在麦克风节点上安装1个全局tap,在tap回调中同步分发数据到两个业务逻辑:
    1. 把AVAudioPCMBuffer传给语音识别请求
    2. 把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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 09:36:10