You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MacOS下AudioKit麦克风输入异常:PitchTap无法采集音频数据

解决AudioKit中PitchTap无法获取麦克风采样数据的问题

我用AudioKit搭建了AudioEngine,MIDISampler可以正常播放音符,但PitchTap连接麦克风时无法获取有效采样数据,始终输出Frequency 100.0 – Amplitude 2.4266092e-05,将PitchTap连接到sampler则能正常工作。相关代码如下:

final class AudioGraph {
    let engine = AudioEngine()
    let sampler = MIDISampler(name: "sampler")
    let pitchTracker: PitchTap

    init(file: SamplerFile? = nil) throws {
        let mic = engine.input!

        engine.output = Mixer(
            sampler, 
            Fader(mic, gain: 0.000)
        )

        /// Hooking ``PitchTap`` to ``sampler`` works. Yay. Why not the ``mic`` input?
        pitchTracker = PitchTap(mic) { f, a in
            guard let f = f.first, let a = a.first else { return }
            print("Frequency \(f) – Amplitude \(a)")
        }

        if let file {
            try setFile(file)
        }
    }

    func setFile(_ file: SamplerFile) throws {
        try sampler.loadInstrument(url: file.url)
    }
}

// MARK: -

extension AudioGraph: NotePlayer {
    func startAudioEngine() throws {
        print("### Start engine")
        try engine.start()
        pitchTracker.start()
    }
}

问题原因分析

  1. 麦克风信号被完全静音:代码中给麦克风添加的Fader增益设为0.000,导致麦克风输入信号被彻底消除,PitchTap自然采集不到有效数据。
  2. 权限缺失:iOS/macOS平台下,应用访问麦克风需要提前申请权限,若未配置权限,麦克风输入会被系统拦截。
  3. 输入路由问题:强制解包engine.input!可能忽略了麦克风不可用的情况,且启动顺序可能导致麦克风输入未被正确激活。

解决方案

1. 修复麦克风增益设置

如果不需要麦克风声音输出到扬声器,可将麦克风单独给PitchTap处理,不混入主输出:

init(file: SamplerFile? = nil) throws {
    guard let mic = engine.input else {
        throw NSError(domain: "AudioGraph", code: -1, userInfo: [NSLocalizedDescriptionKey: "麦克风输入不可用"])
    }

    // 主输出仅保留sampler的声音
    engine.output = sampler

    pitchTracker = PitchTap(mic) { f, a in
        guard let f = f.first, let a = a.first else { return }
        print("Frequency \(f) – Amplitude \(a)")
    }

    if let file {
        try setFile(file)
    }
}

若需要麦克风声音输出,将Fader增益调整为合理值(如1.0)即可。

2. 配置麦克风权限

在Info.plist中添加权限描述:

  • iOS:添加NSMicrophoneUsageDescription,值为申请麦克风权限的说明文本(如"需要访问麦克风以采集音频")
  • macOS:添加NSMicrophoneUsageDescription,同样填写权限说明

3. 优化启动逻辑

确保麦克风输入已激活后再启动PitchTap:

func startAudioEngine() throws {
    print("### Start engine")
    try engine.start()
    
    guard let mic = engine.input else { return }
    mic.isEnabled = true
    
    pitchTracker.start()
}

内容的提问来源于stack exchange,提问作者Benjohn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 19:01:05