Ios 未取消Swift SFSpeechRecognition任务

Ios 未取消Swift SFSpeechRecognition任务,ios,swift,speech-recognition,sfspeechrecognizer,Ios,Swift,Speech Recognition,Sfspeechrecognizer,我正在Swift中使用语音识别,在取消SFSpeechRecognitionTask时遇到问题 我实现了以下逻辑: 我有一个麦克风按钮 按下按钮时正在识别语音 释放麦克风按钮时,我需要完成语音识别,以在完成块中获得结果(recognitionTask用于识别)。为此,我使用了stopRecording()函数。此功能正常工作 当我执行一些其他逻辑时,我还需要取消recognitionTask。因此,我需要recognitionTask立即停止完成处理程序,并返回错误或结果。为此,我编写了can

我正在Swift中使用语音识别,在取消
SFSpeechRecognitionTask
时遇到问题

我实现了以下逻辑:

  • 我有一个麦克风按钮
  • 按下按钮时正在识别语音
  • 释放麦克风按钮时,我需要完成语音识别,以在完成块中获得结果(
    recognitionTask
    用于识别)。为此,我使用了
    stopRecording()
    函数。此功能正常工作
  • 当我执行一些其他逻辑时,我还需要取消
    recognitionTask
    。因此,我需要
    recognitionTask
    立即停止完成处理程序,并返回错误或结果。为此,我编写了
    cancelTask()
    。我尝试过这个函数的不同变体,但都不起作用。问题是,当应用程序在互联网连接缓慢的情况下运行时(例如edge),我总是会在一些延迟后完成
我已经选中了
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