質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

1回答

4144閲覧

iOS10のSpeech frameworkを使ってリアルタイムに音声認識を1分以上続けたいです.

ShirataHikaru

総合スコア8

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

1クリップ

投稿2016/12/15 11:36

###前提・実現したいこと
ここに質問したいことを詳細に書いてください
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で定期的に呼び出してます.

ここら辺かなと思ったところを抜粋したので,必要な部分が欠けてましたら,教えてください.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

60秒のタイマーが経過した時に、今認識中の処理をきちんとキャンセルしてから
改めて認識処理を再開させればうまくいくと思いますが、多分のその制御の方が難しくて、
それよりは、認識処理が60秒経過したらエラーで通知されるので、
そのエラー通知を受けたら認識処理を再スタートさせるだけでいいと思います。
自分でタイマーをかける必要ないです。

投稿2016/12/17 15:20

TakeOne

総合スコア6299

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問