在iOS上访问麦克风

时间:2015-03-06 09:03:30

标签: ios audio avfoundation microphone

我只需要知道用户何时开始对着麦克风讲话。我不会做任何语音处理或任何花哨的事情,只是检测麦克风何时拾取任何东西。我一直在找一个小时,找不到那么简单的东西。有人能指出我正确的方向吗?

更新1

我很抱歉这是多晚了;我一直有连接问题。这是我一直在使用的代码:

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    let audioEngine = AVAudioEngine()
    let inputNode = audioEngine.inputNode
    let bus = 0
    inputNode.installTapOnBus(bus, bufferSize: 8192, format:inputNode.inputFormatForBus(bus)) {
        (buffer: AVAudioPCMBuffer!, time: AVAudioTime!) -> Void in
        println("Speech detected.")
    }

    audioEngine.prepare()
    audioEngine.startAndReturnError(nil)

}

1 个答案:

答案 0 :(得分:0)

您传递给installTapOnBus的回调将被来自麦克风的每个音频块调用。上面的代码检测到您的应用已经开始聆听 - 沉默或其他任何事情 - 而不是是否有人在对着麦克风说话。

为了实际识别语音的开始,您需要查看缓冲区中的数据。

这个简单版本类似于PA系统中使用的音频噪声门:选择幅度阈值和持续时间阈值,一旦满足两者,就称之为语音。由于手机,麦克风和环境各不相同,您可能需要自适应地确定幅度阈值以获得良好的性能。

即使有自适应阈值,持续的响亮声音仍将被视为“语音”。如果您还需要对这些进行除草,那么您将需要查看某种频率分析(例如,FFT)并在语音频率中识别出足够的幅度和随时间的变化。或者你可以将缓冲区传递给语音识别引擎(例如,SFSpeechRecognizer)并查看它是否识别出任何东西,从而捎带Apple的信号处理工作。但如果你经常这样做,那就非常重要。