Ios 未取消Swift SFSpeechRecognition任务
我正在Swift中使用语音识别,在取消Ios 未取消Swift SFSpeechRecognition任务,ios,swift,speech-recognition,sfspeechrecognizer,Ios,Swift,Speech Recognition,Sfspeechrecognizer,我正在Swift中使用语音识别,在取消SFSpeechRecognitionTask时遇到问题 我实现了以下逻辑: 我有一个麦克风按钮 按下按钮时正在识别语音 释放麦克风按钮时,我需要完成语音识别,以在完成块中获得结果(recognitionTask用于识别)。为此,我使用了stopRecording()函数。此功能正常工作 当我执行一些其他逻辑时,我还需要取消recognitionTask。因此,我需要recognitionTask立即停止完成处理程序,并返回错误或结果。为此,我编写了can
SFSpeechRecognitionTask
时遇到问题
我实现了以下逻辑:
- 我有一个麦克风按钮
- 按下按钮时正在识别语音
- 释放麦克风按钮时,我需要完成语音识别,以在完成块中获得结果(
用于识别)。为此,我使用了recognitionTask
函数。此功能正常工作stopRecording()
- 当我执行一些其他逻辑时,我还需要取消
。因此,我需要recognitionTask
立即停止完成处理程序,并返回错误或结果。为此,我编写了recognitionTask
。我尝试过这个函数的不同变体,但都不起作用。问题是,当应用程序在互联网连接缓慢的情况下运行时(例如edge),我总是会在一些延迟后完成李>cancelTask()
recognitionTask.iscancelled
就在recognitionTask?之后。cancel()
这个属性总是false
。你知道为什么这不起作用吗
func startRecording() throws {
guard speechRecogniser.isAvailable else {
// Speech recognition is unavailable, so do not attempt to start.
return
}
if let recognitionTask = recognitionTask {
// We have a recognition task still running, so cancel it before starting a new one.
recognitionTask.cancel()
self.recognitionTask = nil
}
guard SFSpeechRecognizer.authorizationStatus() == .authorized else {
SFSpeechRecognizer.requestAuthorization({ _ in })
return
}
let audioSession = AVAudioSession.sharedInstance()
try audioSession.setCategory(AVAudioSessionCategoryRecord)
try audioSession.setMode(AVAudioSessionModeMeasurement)
try audioSession.setActive(true, with: .notifyOthersOnDeactivation)
recognitionRequest = SFSpeechAudioBufferRecognitionRequest()
let inputNode = audioEngine.inputNode
guard let recognitionRequest = recognitionRequest else {
throw SpeechControllerError.noAudioInput
}
recognitionTask = speechRecogniser.recognitionTask(with: recognitionRequest) { [unowned self] result, error in
if let result = result {
self.delegate?.speechController(self, didRecogniseText: result.bestTranscription.formattedString)
}
if result?.isFinal ?? (error != nil) {
inputNode.removeTap(onBus: SpeechController.inputNodeBus)
}
}
let recordingFormat = inputNode.outputFormat(forBus: SpeechController.inputNodeBus)
inputNode.installTap(onBus: SpeechController.inputNodeBus, bufferSize: 1024, format: recordingFormat) { (buffer: AVAudioPCMBuffer, when: AVAudioTime) in
self.recognitionRequest?.append(buffer)
}
audioEngine.prepare()
try audioEngine.start()
}
/// Ends the current speech recording session.
func stopRecording() {
audioEngine.stop()
recognitionRequest?.endAudio()
}
func cancelTask() {
audioEngine.inputNode.removeTap(onBus: 0)
audioEngine.stop()
recognitionRequest?.endAudio()
recognitionTask?.cancel()
recognitionTask = nil
speechRecognizer = nil
recognitionRequest = nil
}
我没有看到任何对
cancelTask
@anderamugnani的调用,正如我写的那样cancelTask
在我执行其他逻辑时被调用,例如,按下另一个按钮,您是否尝试查看SFSpeechRecognitionTaskDelegate
?@anderamugnanii您的意思是什么SFSpeechRecognitionTaskDelegate
没有取消的方法SFSpeechRecognitionTask
,它只会向您发送结果。我的意思是,您可能需要查看它。您有一个名为func speechrecognitiontaskwascelected(u任务:SFSpeechRecognitionTask)
的回调,这可能会让您了解recognitionTask