###前提・実現したいこと
ここに質問したいことを詳細に書いてください
iOS10のSpeech frameworkを使ってリアルタイムに音声認識を1分以上続けたいです.
###発生している問題・エラーメッセージ
2016-12-15 20:23:06.133449 ARCamera[1274:294599] [central] 54: ERROR: [0x1a6a16c40] >avae> AVAudioNode.mm:565: CreateRecordingTap: required condition is false: _recordingTap == nil 2016-12-15 20:23:06.134303 ARCamera[1274:294599] *** Terminating app due to uncaught exception 'com.apple.coreaudio.avfaudio', reason: 'required condition is false: _recordingTap == nil' *** First throw call stack: (0x181db41c0 0x1807ec55c 0x181db4094 0x19b31778c 0x19b38cdb0 0x19b38aa8c 0x1000776f4 0x10007634c 0x1000765f8 0x18289b988 0x181d628f4 0x181d62608 0x181d61ec4 0x181d5fac0 0x181c8e048 0x183711198 0x187c68628 0x187c63360 0x10007ed8c 0x180c705b8) libc++abi.dylib: terminating with uncaught exception of type NSException (lldb)
###該当のソースコード
swift
1private let speechRecognizer = SFSpeechRecognizer(locale: Locale(identifier:"ja_JP"))! 2 3 private var recognitionRequest: SFSpeechAudioBufferRecognitionRequest? 4 5 private var recognitionTask: SFSpeechRecognitionTask? 6 7 private var audioEngine = AVAudioEngine() 8 9 var timer:Timer! 10 11 12override func viewDidLoad() { 13 super.viewDidLoad() 14 15 // カメラを準備 16 if initilize() { 17 mySession.startRunning() 18 19 operate() 20 21 timer = Timer.scheduledTimer(timeInterval: 60.0, target: self, selector: #selector(self.operate), userInfo: nil, repeats: true) 22 23 } 24 } 25 26 27 func operate(){ 28 audioEngine.stop() 29 recognitionRequest?.endAudio() 30 print("Stopping") 31 try! startRecording() 32 print("Start recording") 33 34 } 35 36 37private func startRecording() throws { 38 39 // Cancel the previous task if it's running. 40 if let recognitionTask = recognitionTask { 41 recognitionTask.cancel() 42 self.recognitionTask = nil 43 } 44 45 recognitionRequest = SFSpeechAudioBufferRecognitionRequest() 46 47 guard let inputNode = audioEngine.inputNode else { fatalError("Audio engine has no input node") } 48 guard let recognitionRequest = recognitionRequest else { fatalError("Unable to created a SFSpeechAudioBufferRecognitionRequest object") } 49 50 // オーディオ録音が完了する前に結果が返されるようにリクエストを設定する 51 recognitionRequest.shouldReportPartialResults = true 52 53 recognitionTask = speechRecognizer.recognitionTask(with: recognitionRequest) { result, error in 54 var isFinal = false 55 56 if let result = result { 57 self.myTextField.setContentOffset(CGPoint(x:0, y:self.myTextField.contentSize.height - self.myTextField.frame.size.height),animated: false); 58 59 self.myTextField.text = result.bestTranscription.formattedString 60 isFinal = result.isFinal 61 62 } 63 64 if error != nil || isFinal { 65 self.audioEngine.stop() 66 inputNode.removeTap(onBus: 0) 67 self.recognitionRequest = nil 68 self.recognitionTask = nil 69 } 70 } 71 72 let recordingFormat = inputNode.outputFormat(forBus: 0) 73 inputNode.installTap(onBus: 0, bufferSize: 2048, format: recordingFormat) { (buffer: AVAudioPCMBuffer, when: AVAudioTime) in 74 75 self.recognitionRequest?.append(buffer) 76 } 77 78 79 audioEngine.prepare() 80 try audioEngine.start() 81 82 } 83
###試したこと
Speech Frameworkの連続認識が60秒なので,
startRecodingメソッドを60秒ごとに呼べば永遠に認識できると思い,Timerで定期的に呼び出してます.
ここら辺かなと思ったところを抜粋したので,必要な部分が欠けてましたら,教えてください.
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。