auの日記

プログラミング初心者の日記。(auはハンドルネームです)

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にパースできないし、どうすればいいんだろうという状態でしたが、なんとか解決できてよかったです。