如果我设置
Error Domain=kAFAssistantErrorDomain Code=1101
,我收到下一个错误:SFSpeechAudioBufferRecognitionRequest.requiresOnDeviceRecognition = true
。
为了测试它,您可以从这里下载 Apple Scrumdinger 项目:
https://developer.apple.com/tutorials/app-dev-training/transcribing-speech-to-text
唯一需要更新的是SpeechRecognizer.swift,将prepareEngine函数更改为如下所示:
private static func prepareEngine() throws -> (AVAudioEngine, SFSpeechAudioBufferRecognitionRequest) {
let audioEngine = AVAudioEngine()
let request = SFSpeechAudioBufferRecognitionRequest()
request.shouldReportPartialResults = true
request.requiresOnDeviceRecognition = true
let audioSession = AVAudioSession.sharedInstance()
try audioSession.setCategory(.record, mode: .measurement, options: .duckOthers)
try audioSession.setActive(true, options: .notifyOthersOnDeactivation)
let inputNode = audioEngine.inputNode
let recordingFormat = inputNode.outputFormat(forBus: 0)
inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { (buffer: AVAudioPCMBuffer, when: AVAudioTime) in
request.append(buffer)
}
audioEngine.prepare()
try audioEngine.start()
return (audioEngine, request)
}
唯一改变的是我添加了这一行:
request.requiresOnDeviceRecognition = true
当然你可以更进一步,在 init 中测试
SFSpeechRecognizer
看看它是否 supportsOnDeviceRecognition
,但对我来说返回 true。
我正在物理设备上进行测试:带有 iOS 16.0.2 的 iPhone X。
我能够让它发挥作用。我正在使用 iPhone 11 硬件使用 iOS 16.3.1。
由于您使用的是接近 16 (16.0.2) 的版本,因此众所周知,该版本往往存在错误(因为 iOS 16 会有与之相关的产品交付截止日期)。
但是,该应用程序运行得不太好(我的转录体验很差)。
通过控制台应用程序研究操作系统和应用程序行为揭示了系统级别的协作。
假设该应用程序的进程ID为6984,则启动另一个进程6985,这是本地监听器。我有:
info 14:10:48.846966+0000 localspeechrecognition -[LSRConnection initializeWithSandboxExtensions:]_block_invoke Successfully consumed sandbox extensions
本地语音识别是您所需设置的目的,该过程提供了这样的服务。我注意到它需要一些沙箱权利才能继续。
我认为将 iPhone 升级到最新的 iOS 版本可能是最简单的解决方案。我对您从 iPhone 操作系统的控制台应用程序日志记录中得到的错误感兴趣,因为这将是您的 API 错误的上游原因。我怀疑您不会看到本地语音识别服务正在运行,但您可能会看到一个信息性错误。
如果升级手机没有帮助,请分享任何诊断信息,以便我们进一步了解问题。
错误代码=1101与您设备上的离线听写设置不正确/不完整有关。
如果您设置
request.requiresOnDeviceRecognition = true
,识别过程将使用 Apple 的听写服务。
听写服务仅在以下情况下才能离线工作:
Enable Dictation
切换了 On
和 Dictation Language
已被系统下载。如果不满足上述条件,您将看到1101错误。
示例:
如果您想要
„de-DE“
(德国地区的德语)离线听写,您需要安装这样的键盘。
在设备的 Setting / General / Keyboard / Keyboards
中……请确保为您的语言 + 区域语音识别安装了一个键盘(在我们的示例中为“德语(德国)”)。
再往下,在 General / Keyboard
打开 Enable Dictation
。
如果启用听写,您会在下面看到另一个名为 Dictation Languages
的条目。打开它以确保听写语言已下载(您会看到有关状态的注释)。
下载听写语言后,使用
request.requiresOnDeviceRecognition = true
进行的语音识别应该适用于该语言/区域。