2017-02-03 2 views
2

Dies ist das erste Mal, dass ich SFSpeechRecognizer in Swift verwende und ein Teil der Funktionalität nicht funktioniert. Wenn ich den Knopf audioButtonPressed drücke, scheint die Erkennung gut zu beginnen, und wenn ich sie erneut drücke, wird sie gestoppt. Wenn ich es erneut drücke, um die Erkennung erneut zu starten, funktioniert die Erkennung nicht und hinterlässt eine leere Textansicht. Wie soll ich das machen?Swift SFSpeechRecognizer funktioniert nicht zweimal

Hier ist mein Code

@IBAction func audioButtonPressed(_ sender: Any) { 
    if isRecording { 
     stopRecording() 
     delegate?.speechRecognitionComplete(query: query) 
     audioButton.backgroundColor = UIColor.red 
     isRecording = false 
    } else { 
     startRecording() 
     audioButton.backgroundColor = UIColor.green 
     isRecording = true 
    } 
} 

func stopRecording() { 
    audioEngine.stop() 
    audioEngine.inputNode?.removeTap(onBus: 0) 
    recognitionRequest = nil 
    recognitionTask = nil 
} 

func startRecording() { 
    recognitionRequest = SFSpeechAudioBufferRecognitionRequest() 
    guard let recognitionRequest = recognitionRequest else { 
     return 
    } 
    recognitionRequest.shouldReportPartialResults = true 
    recognitionTask = speechRecognizer?.recognitionTask(with: recognitionRequest, resultHandler: { (result, error) in 
     var isFinal = false 
     if result != nil { 
      self.query = result?.bestTranscription.formattedString 
      self.audioTextField.text = self.query 
      isFinal = (result?.isFinal)! 
     } 
     if error != nil || isFinal { 
      self.stopRecording() 
     } 
    }) 
    let audioSession = AVAudioSession.sharedInstance() 
    do { 
     try audioSession.setCategory(AVAudioSessionCategoryRecord) 
     try audioSession.setMode(AVAudioSessionModeMeasurement) 
     try audioSession.setActive(true, with: .notifyOthersOnDeactivation) 
    } catch { 
     print("the audio session isn't configured correctly") 
    } 
    let recordingFormat = audioEngine.inputNode?.outputFormat(forBus: 0) 
    audioEngine.inputNode?.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { (buffer, time) in 
     self.recognitionRequest?.append(buffer) 
    } 
    audioEngine.prepare() 
    do { 
     try audioEngine.start() 
     audioTextField.text = "How may I help you" 
    } catch { 
     print("audio engine failed to start") 
    } 
} 

Als ich zum ersten Mal drücken audiobutton, starten Sie die Aufnahme aufgerufen wird und es funktioniert perfekt, drücken sie wieder die Aufnahme stoppen aufgerufen und funktioniert gut, aber dann wieder drücken nicht die Anerkennung Anfang machen wieder .... Ideen?

+0

Ihre Methode 'startRecording' wird erneut aufgerufen, wenn Sie die Aufnahmetaste zum zweiten Mal drücken? –

Antwort

2

Ich denke, Sie fehlen recognitionTask.cancel() bevor Sie Aufgabe in StopRecording-Funktion zu delalloc.