1
왜이 오류가 있는지 알 수 없습니다. '필요 조건이 거짓 : _recordingTap == 전무'AVSpeechRecognizer : 필수 조건은 false입니다. _recordingTap == Swift3의 nil 오류
UPDATE
내가 가진 오류는인해, 이유 캐치되지 않는 예외 'com.apple.coreaudio.avfaudio'응용 프로그램 종료입니다
실제로는 작동하지만 몇 시간이 지나면 갑자기 버튼이 비활성화되고 마이크가 더 이상 작동하지 않습니다. 그런 다음 오류가 발생하고 오류가 발생합니다.
도와 주시겠습니까? 당신은 여전히 audioEngine, audioEngine.inputNode을 중지하면
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)") } }
}
inputnote! = nill 인 경우 입력 노드를 확인하십시오. –