2017-02-03 13 views
2

これは初めてSwiftでSFSpeechRecognizerを使用しており、1つの機能が動作しません。 audioButtonPressedボタンを押すと認識がうまく始まり、もう一度押すと停止します。認識を再開するためにもう一度押すと、認識が機能せず、空白のテキスト表示が表示されます。私はこれをどのようにするべきですか?Swift SFSpeechRecognizerが2回動作しない

がここに呼ばれている私のコード私が最初にプレスaudiobutton、録画を開始

@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") 
    } 
} 

だとそれが呼ばれて、それが再び録画を停止押すと、完璧に動作し、正常に動作しますが、その後認識開始をしないもう一度押しますもう一度....アイデア?

+0

2回目に録画開始ボタンを押すと、あなたのメソッド 'startRecording'が再び呼び出されますか? –

答えて

2

stopRecording関数でタスクをdeallocする前に、recognitionTask.cancel()が見つからないと思います。

関連する問題