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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

Q&A

解決済

1回答

4474閲覧

[iOS11][Swift]音声認識でエラーとなる

maeta

総合スコア12

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

0グッド

0クリップ

投稿2018/07/13 00:34

編集2018/07/17 00:23

前提・実現したいこと

現在、音声でのチャットアプリを作成しようとしており、
まずは音声周りを調査しております。
iOSのSFSpeechRecognizerを使用してサンプルを作成しているのですが
音声認識開始後無言のまま音声認識の停止を実行するとエラーとなっています。
GitHubにある、Sampleをクローンして実行するも同じエラーとなります。
またこのエラーが出ると、AVSpeechSynthesizerのspeakでも
エラーとなってしまいます。
どのようなことを行えばエラーが無くなるのでしょうか?

SFSpeechRecognizerのエラー

2018-07-13 09:28:20.405082+0900 test[250:11545] [Utility] +[AFAggregator logDictationFailedWithError:] Error Domain=kAFAssistantErrorDomain Code=203 "Retry" UserInfo={NSLocalizedDescription=Retry, NSUnderlyingError=0x1c4450f80 {Error Domain=SiriSpeechErrorDomain Code=1 "(null)"}}

AVSpeechSynthesizerのエラー

2018-07-13 09:28:57.917950+0900 test[250:11814] [TTS] Failure starting audio queue ≥˚˛ˇ 2018-07-13 09:28:59.942248+0900 test[250:11814] [TTS] _BeginSpeaking: couldn't begin playback

該当のソースコード

Swift

1import UIKit 2import Speech 3 4class ViewController: UIViewController { 5 6 // "ja-JP"を指定すると日本語になります。 7 private let speechRecognizer = SFSpeechRecognizer(locale: Locale(identifier: "ja-JP"))! 8 private var recognitionRequest: SFSpeechAudioBufferRecognitionRequest? 9 private var recognitionTask: SFSpeechRecognitionTask? 10 private let audioEngine = AVAudioEngine() 11 private var inputNode:AVAudioInputNode! 12 13 @IBOutlet weak var textView: UITextView! 14 @IBOutlet weak var recordButton: UIButton! 15 // 音声読み上げ 16 let talker = AVSpeechSynthesizer() 17 18 override func viewDidLoad() { 19 super.viewDidLoad() 20 // Do any additional setup after loading the view, typically from a nib. 21 recordButton.isEnabled = false 22 } 23 24 override func viewDidAppear(_ animated: Bool) { 25 // 音声認識用デリゲートを設定 26 speechRecognizer.delegate = self 27 28 requestRecognizerAuthorization() 29 30 } 31 32 override func didReceiveMemoryWarning() { 33 super.didReceiveMemoryWarning() 34 // Dispose of any resources that can be recreated. 35 } 36 // 音声認識が許可されているかどうか確認 37 private func requestRecognizerAuthorization() { 38 // 認証処理 39 SFSpeechRecognizer.requestAuthorization { authStatus in 40 // メインスレッドで処理したい内容のため、OperationQueue.main.addOperationを使う 41 // コールバックはメインスレッドで呼び出されないことがあります。 追加する 42 // 操作をメインキューに送り、レコードボタンの状態を更新します。 43 OperationQueue.main.addOperation { 44 switch authStatus { 45 case .authorized: 46 self.recordButton.isEnabled = true 47 48 case .denied: 49 self.recordButton.isEnabled = false 50 self.recordButton.setTitle("ユーザーが音声認識へのアクセスを拒否しました", for: .disabled) 51 52 case .restricted: 53 self.recordButton.isEnabled = false 54 self.recordButton.setTitle("このデバイスで音声認識が制限されています", for: .disabled) 55 56 case .notDetermined: 57 self.recordButton.isEnabled = false 58 self.recordButton.setTitle("音声認識が承認されていません", for: .disabled) 59 } 60 } 61 } 62 } 63 private func startRecording() throws { 64 65 // 前のタスクが実行中の場合はキャンセルします。 66 if let recognitionTask = recognitionTask { 67 recognitionTask.cancel() 68 self.audioEngine.stop() 69 self.audioEngine.inputNode.removeTap(onBus: 0) 70 self.recognitionTask = nil 71 self.recognitionRequest = nil 72 } 73 74 let audioSession = AVAudioSession.sharedInstance() 75 try audioSession.setCategory(AVAudioSessionCategoryRecord) 76 try audioSession.setMode(AVAudioSessionModeMeasurement) 77 try audioSession.setActive(true, with: .notifyOthersOnDeactivation) 78 79 recognitionRequest = SFSpeechAudioBufferRecognitionRequest() 80 81 let inputNode = audioEngine.inputNode 82 guard let recognitionRequest = recognitionRequest else { fatalError("音声認識オブジェクトを作成できません") } 83 84 // オーディオ録音が完了する前に結果が返されるようにリクエストを設定する 85 // trueだと現在-1回目のリクエスト結果が返ってくる模様。falseだとボタンをオフにしたときに音声認識の結果が返ってくる設定。 86 recognitionRequest.shouldReportPartialResults = true 87 88 // 認識タスクは、音声認識セッションを表します。 89 // それを取り消すことができるようにタスクへの参照を保持します。 90 recognitionTask = speechRecognizer.recognitionTask(with: recognitionRequest) { result, error in 91 var isFinal = false 92 93 self.textView.text = "" 94 95 if let result = result { 96 self.textView.text = result.bestTranscription.formattedString 97 isFinal = result.isFinal 98 } 99 100 // エラーがある、もしくは最後の認識結果だった場合の処理 101 if error != nil || isFinal { 102 self.audioEngine.stop() 103 self.recognitionRequest?.endAudio() 104 inputNode.removeTap(onBus: 0) 105 106 self.recognitionRequest = nil 107 self.recognitionTask = nil 108 109 self.recordButton.isEnabled = true 110 self.recordButton.setTitle("音声認識開始", for: []) 111 112 if error == nil { 113 self.play(text: self.textView.text) 114 } 115 } 116 } 117 118 // マイクから取得した音声バッファをリクエストに渡す 119 let recordingFormat = inputNode.outputFormat(forBus: 0) 120 inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { (buffer: AVAudioPCMBuffer, when: AVAudioTime) in 121 self.recognitionRequest?.append(buffer) 122 //append(buffer) 123 } 124 125 // startの前にリソースを確保しておく。 126 audioEngine.prepare() 127 try audioEngine.start() 128 129 textView.text = "(音声認識状態になっています)" 130 131 } 132 @IBAction func recordButtonTapped() { 133 134 if self.audioEngine.isRunning { 135 // 認識終了 136 self.audioEngine.stop() 137 self.audioEngine.inputNode.removeTap(onBus: 0) 138 self.recognitionRequest?.endAudio() 139 140 self.recordButton.isEnabled = false 141 self.recordButton.setTitle("音声認識停止中", for: .disabled) 142 143 } else { 144 try! self.startRecording() 145 self.recordButton.setTitle("音声認識停止", for: []) 146 } 147 148 } 149 @IBAction func speechButton() { 150 play(text: "音声認識テスト") 151 } 152 153} 154 155extension ViewController: SFSpeechRecognizerDelegate { 156 157 // 音声認識の可否が変更したときに呼ばれるdelegate 158 public func speechRecognizer(_ speechRecognizer: SFSpeechRecognizer, availabilityDidChange available: Bool) { 159 if available { 160 recordButton.isEnabled = true 161 recordButton.setTitle("音声認識開始", for: []) 162 } else { 163 recordButton.isEnabled = false 164 recordButton.setTitle("音声認識を実行できない状態です", for: .disabled) 165 } 166 } 167 168} 169 170extension ViewController: AVSpeechSynthesizerDelegate { 171 172 private func play(text: String) { 173 if talker.isSpeaking { 174 talker.stopSpeaking(at: .immediate) 175 } 176 177 let utterance = AVSpeechUtterance(string: text) 178 utterance.volume = 1 179 180 utterance.voice = AVSpeechSynthesisVoice(language: "ja-JP") 181 talker.speak(utterance) 182 } 183}

XcodeとiOS

Xcode:Version 9.4.1
iOS:11.4

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

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

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

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

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

guest

回答1

0

自己解決

自己解決
どうもこのエラーですが、
iOSのキーボードに付いている、音声認識でも
同じエラーが出ます。
なので、一旦無視します。

解決方法は今の所ありません。

投稿2018/07/19 08:29

maeta

総合スコア12

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問