在 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)
}
标题描述的场景会产生如下错误:
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)
}