在 phone 通话或 Facetime session 中,尝试使用 SpeechRecognizer 会使应用程序崩溃

While in a phone call or Facetime session, attempting to use SpeechRecognizer crashes app

标题描述的场景会产生如下错误:

Terminating app due to uncaught exception 'com.apple.coreaudio.avfaudio', reason: 'required condition is false: IsFormatSampleRateAndChannelCountValid(format)

在那之后,我被扔进了 app delegate 并且没有得到太多帮助来解决问题。

我熟悉正确结束音频 session 的需要,但在我的特殊情况下,这会在开始 session 时发生,特别是这里:

node.installTap(onBus: bus, bufferSize: 1024, format: recordingFormat) { buffer, _ in
    request.append(buffer)
}

这里的罪魁祸首可以通过将我的函数一步步追溯到这一行来看出:

let recordingFormat = node.outputFormat(forBus: bus)

由于麦克风已分配给另一个应用程序(在我的情况下是 Facetime),因此无法访问发生崩溃的问题中发布的功能。

我发现通过监控采样率,我可以确定我是否有独占访问权。

if recordingFormat.sampleRate == 0.0 {
    throw(MyAwesomeError.audioInUse)
}

当值为0.0时,表示正在使用中。当值为44100.0时,我就在做生意。

通过将上述检查放在 node.installTap(...) 函数之前,我可以安全地避免崩溃,然后使用我现有的错误处理代码将情况通知用户。

把所有东西放在一起,看起来像这样:

let recordingFormat = node.outputFormat(forBus: bus)
if recordingFormat.sampleRate == 0.0 {
    throw(MyAwesomeError.audioInUse)
}
node.installTap(onBus: bus, bufferSize: 1024, format: recordingFormat) { buffer, _ in
    request.append(buffer)
}