2017-02-14 54 views
1

我不知道爲什麼我有這個錯誤。我得到的錯誤是AVSpeechRecognizer:所需條件爲false:_recordingTap ==無錯誤Swift3

終止應用程序由於未捕獲的異常 'com.apple.coreaudio.avfaudio',理由是: '要求的條件是假的:_recordingTap ==零'

UPDATE

實際上,這種方式很有效,但幾次後,突然按鈕被禁用,話筒不再起作用。然後它會導致錯誤並崩潰。

你能幫我解決嗎?

class ViewController: UIViewController, SFSpeechRecognizerDelegate, UITextViewDelegate, AVSpeechSynthesizerDelegate { 

@IBOutlet weak var myTextView: UITextView! 
@IBOutlet weak var microphoneButton: UIButton! 

private let speechRecognizer = SFSpeechRecognizer(locale: Locale.init(identifier: "en-US"))! 
private var recognitionRequest: SFSpeechAudioBufferRecognitionRequest? 
private var recognitionTask: SFSpeechRecognitionTask? 
private let audioEngine = AVAudioEngine() 

var rightButton = UIBarButtonItem() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    microphoneButton.isEnabled = false 
    speechRecognizer.delegate = self 
    speechRecognizerFunc() 

    myTextView.delegate = self 
    myTextView.isUserInteractionEnabled = false 

} 



@IBAction func cancelButton(_ sender: UIBarButtonItem) { 
    self.dismiss(animated: true, completion: nil) 
} 


func speechRecognizerFunc(){ 
    SFSpeechRecognizer.requestAuthorization { 
     (authStatus) in 
     var isButtonEnabled = false 

     switch authStatus { 

     case .authorized: 
      isButtonEnabled = true 

     case .denied: 
      isButtonEnabled = false 
      print("User denied access to speech recognition") 

     case .restricted: 
      isButtonEnabled = false 
      print("Speech recognition restricted on this device") 

     case .notDetermined: 
      isButtonEnabled = false 
      print("Speech recognition not yet authorized") 
     } 

     OperationQueue.main.addOperation() { 
      self.microphoneButton.isEnabled = isButtonEnabled 
     } 
    } 
} 

@IBAction func microphoneTapped(_ sender: AnyObject) { 


    if audioEngine.isRunning { 

     audioEngine.stop() 
     recognitionRequest?.endAudio() 
     microphoneButton.isEnabled = false 
     microphoneButton.setTitle("Start", for: .normal) 
     myTextView.text = "" 

    } else { 

     myTextView.text = "Say something. I'm listening...." 
     startRecording() 
     microphoneButton.setTitle("Stop", for: .normal) 
    } 
} 

func startRecording() { 

    if recognitionTask != nil { 
     recognitionTask?.cancel() 
     recognitionTask = nil 
    } 

    let audioSession = AVAudioSession.sharedInstance() 

    do { 

     try audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord, with: .defaultToSpeaker) 
     try audioSession.setMode(AVAudioSessionModeMeasurement) 

     try audioSession.setActive(true, with: .notifyOthersOnDeactivation) 

    } catch { 

     print("audioSession properties weren't set because of an error.") 

    } 

    recognitionRequest = SFSpeechAudioBufferRecognitionRequest() 

    guard let inputNode = audioEngine.inputNode else { 
     fatalError("Audio engine has no input node") 
    } 

    guard let recognitionRequest = recognitionRequest else { 
     fatalError("Unable to create an SFSpeechAudioBufferRecognitionRequest object") 
    } 

    recognitionRequest.shouldReportPartialResults = true 

    recognitionTask = speechRecognizer.recognitionTask(with: recognitionRequest, resultHandler: { 

     (result, error) in 

     var isFinal = false 

     if result != nil { 

      self.myTextView.text = result?.bestTranscription.formattedString 
      isFinal = (result?.isFinal)! 

     } 

     if error != nil || isFinal { 

      self.audioEngine.stop() 
      inputNode.removeTap(onBus: 0) 

      self.recognitionRequest = nil 
      self.recognitionTask = nil 

      self.microphoneButton.isEnabled = true 
      self.performSegue(withIdentifier: "nv", sender: nil) 
     } 
    }) 

    let recordingFormat = inputNode.outputFormat(forBus: 0) 
    inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { (buffer, when) in 
     self.recognitionRequest?.append(buffer) 
    } 

    audioEngine.prepare() 

    do { 
     try audioEngine.start() 

    } catch { 
     print("audioEngine couldn't start because of an error.") 
    } 
} 

func speechRecognizer(_ speechRecognizer: SFSpeechRecognizer, availabilityDidChange available: Bool) { 
    if available { 
     microphoneButton.isEnabled = true 
    } else { 
     microphoneButton.isEnabled = false 
    } 
} 

func popUpAlert(title: String, msg: String){ 
    let alert = UIAlertController(title: title, message: msg, preferredStyle: .alert) 
    let okay = UIAlertAction(title: "Okay", style: .default, handler: nil) 
    alert.addAction(okay) 
    self.present(alert, animated: true, completion: nil) 
} 

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 

    if segue.identifier == "nv" { 
     let vc = segue.destination as! SpeechTableViewController 
     vc.text = self.myTextView.text 
     print("ViewControoler: text value: \(textValue)") 

    } 

} 

}

+0

檢查你的輸入節點if inputnote!= nill –

回答

0

您可以點擊開始記錄按鈕,快速重複這個崩潰,其原因是,如果你的Audioengine停止,audioEngine.inputNode仍然存在。你需要添加這個來停止記錄。

audioEngine.stop() 
    recognitionRequest?.endAudio() 
    audioEngine.inputNode?.removeTap(onBus: 0) 
相關問題