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

时间:2019-06-06 05:09:56

标签: ios swift sfspeechrecognizer

标题中描述的方案将产生以下错误:

  

由于未捕获的异常而终止应用程序   'com.apple.coreaudio.avfaudio',原因:'所需条件为假:   IsFormatSampleRateAndChannelCountValid(format)

在那之后,我被遗弃到应用程序委托中,而在发生问题的过程中得不到太多帮助。

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

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

1 个答案:

答案 0 :(得分:0)

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

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)
}