我正在开发一个既有SFSpeechRecognizer又有AVSpeechSythesizer的应用程序,对我来说
.setCategory(.playAndRecord, mode: .default)
很好,这是我们需要的最好的分类,
according to Apple
.speak()
以及为什么
.multiRoute
分类工作:我想这是一个问题
AVAudioInputNode
. 如果你在控制台看到这样的错误
或者像这样
由于未捕获的异常“com.apple.coreaudio.avfaudio”而终止应用程序,原因:“必需的条件为false:nullptr==Tap()
,或确保输入节点的抽头
.多路径
能够重用相同的输入节点
its nature
使用不同的音频流和路由。
我留下下面的逻辑,我用我的程序遵循苹果的
WWDC session
:
override func viewDidLoad() { //or init() or when necessarily
super.viewDidLoad()
try? AVAudioSession.sharedInstance().setCategory(.playAndRecord, mode: .default)
}
验证/权限
func shouldProcessSpeechRecognition() {
guard AVAudioSession.sharedInstance().recordPermission == .granted,
speechRecognizerAuthorizationStatus == .authorized,
let speechRecognizer = speechRecognizer, speechRecognizer.isAvailable else { return }
//Continue only if we have authorization and recognizer is available
startSpeechRecognition()
}
启动STT
func startSpeechRecognition() {
let format = audioEngine.inputNode.outputFormat(forBus: 0)
audioEngine.inputNode.installTap(onBus: 0, bufferSize: 1024, format: format) { [unowned self] (buffer, _) in
self.recognitionRequest.append(buffer)
}
audioEngine.prepare()
do {
try audioEngine.start()
recognitionTask = speechRecognizer!.recognitionTask(with: recognitionRequest, resultHandler: {...}
} catch {...}
}
func endSpeechRecognition() {
recognitionTask?.finish()
stopAudioEngine()
}
取消STT
func cancelSpeechRecognition() {
recognitionTask?.cancel()
stopAudioEngine()
}
停止音频引擎
func stopAudioEngine() {
audioEngine.stop()
audioEngine.inputNode.removeTap(onBus: 0)
recognitionRequest.endAudio()
}
AVSpeechSynthesizer
引用并说出一句话。