SwiftでGoogle Speech-to-Textを使った際の値のアクセス方法
auです。
Google Speech-to-Textを使って音声認識アプリを作っています。
Swiftで作れるということで、やり始めています。
サンプルを使ってみて、以下のような形式で値が返ってくることが分かりました。
<StreamingRecognizeResponse 0x>: { results { alternatives { transcript: "アイ" } stability: 0.01 # --- Unknown fields --- 4: "\010\001\020\200\324\324\253\001" } } <StreamingRecognizeResponse 0x>: { results { alternatives { transcript: "あいうえ" } stability: 0.01 # --- Unknown fields --- 4: "\010\001\020\200\342\242\310\001" } } <StreamingRecognizeResponse 0x>: { results { alternatives { transcript: "あいうえお" } stability: 0.01 # --- Unknown fields --- 4: "\010\001\020\200\232\333\272\002" } } <StreamingRecognizeResponse 0x>: { results { alternatives { transcript: "あいうえお" } stability: 0.9 # --- Unknown fields --- 4: "\010\002\020\200\222\375{" } } <StreamingRecognizeResponse 0x>: { results { alternatives { transcript: "あいうえお" confidence: 0.961493 words { start_time { nanos: 700000000 } end_time { nanos: 700000000 } word: "あ|ア" } words { start_time { nanos: 700000000 } end_time { seconds: 1 nanos: 300000000 } word: "いう|ユー" } words { start_time { seconds: 1 nanos: 300000000 } end_time { seconds: 1 nanos: 500000000 } word: "え|エ" } words { start_time { seconds: 1 nanos: 500000000 } end_time { seconds: 1 nanos: 600000000 } word: "お|オ" } } is_final: true # --- Unknown fields --- 4: "\010\002\020\200\337\252\231\002" } }
なるほど、JSON形式で返ってきてるのか!と思い、results.alternativesってやれば取れるなーと思ったのですが、エラーで返されます。
そこで、以下のようにして解決しました。
for result in response.resultsArray! { if let result = result as? StreamingRecognitionResult { for alternative in result.alternativesArray! { if let alternative = alternative as? SpeechRecognitionAlternative { sentence.append(alternative.transcript) for words in alternative.wordsArray { if let words = words as? WordInfo { print(words) } } } } if result.isFinal { finished = true } } }
ネストが深すぎ問題ですが、ネストごとに型が変わっていることが分かりました。
ネストを下げながらアクセスしていき、値が入っているキーまでいくと、値を取り出すことができました。
JSONにパースできないし、どうすればいいんだろうという状態でしたが、なんとか解決できてよかったです。