Cloud Speech-to-Text で音声認識入門 & Tips

Wakisaka Youhei
google-cloud-jp
Published in
10 min readDec 18, 2019

--

この記事は Google Cloud Japan Customer Engineer Advent Calendar 2019 の 19日目の記事です。

TL;DR

・Cloud Speech-to-Text の基本機能紹介
・Cloud Speech-to-Text の Tips 紹介

Cloud Speech-to-Text とは

Cloud Speech-to-Text は Google Cloud が提供する機械学習 API の中の一つのプロダクトです。音声データを入力するとその音声を書き起こす音声認識の機能を提供しています。120 の言語と方言を認識することができます。また、リアルタイムに音声認識ができるストリーミング入力での音声認識の機能もサポートしています。Python, Go, Java などのプログラミング言語用のライブラリーも提供しているので、簡単に利用することができます。

Cloud Speech-to-Text の利用方法は下記の 3 つがあります。
短い音声ファイルの音声認識
長い音声ファイルの音声認識
ストリーミング入力の音声認識
それぞれの機能について簡単に説明します。

短い音声ファイルの音声認識

短い音声ファイルの音声認識では、1 分未満の音声ファイルを入力として利用することができます。処理は同期型で行われるため、音声認識のリクエストを送信したあと認識結果が API から返ってくるまでブロッキングされます。Google Cloud Storage (GCS) に保存している音声ファイルも対象にしてリクエストを送信できるため、音声ファイルを GCS にためて利用する場合でも便利に使えます。

長い音声ファイルの音声認識

長い音声ファイルの音声認識では、1 分以上の音声ファイルを入力として利用することができます。基本的には GCS に保存している音声データを対象として利用します。音声データは最大で 480 分のデータまで対応しています。長い音声データの音声認識には時間がかかってしまうこともあるため、認識結果の取得は google.longrunning.Operations インターフェースを通じて行います。非同期処理をイメージしていただくとわかりやすいと思います。リクエスト送信後、Task Name を API から受け取り、その値を使い非同期で認識結果を取得します。認識結果は、5 日間取得できます。

ストリーミング入力の音声認識

ストリーミング入力の音声認識では、マイク(デバイス)からのストリーミング入力を入力として利用します。ストリーミング入力の音声認識では認識結果もストリームのように API から取得できます。ただし gRPC 経由のみの対応となるため注意してください。マイク(デバイス)に入力された音声がすぐに音声認識され文字列として取得が可能なため、音声認識の結果をすぐに取得したいユースケース(例えばコールセンターでの利用など)に適しています。注意点として、ストリーミングでの入力は 5 分間までという制限があります。

ストリーミング入力の音声認識のサンプルコード解説

公式ドキュメントのストリーミング入力の音声認識の章では 2 つのサンプルが記載されています。1 つはローカルの音声ファイルから音声を読み出しストリーミングのようにリクエスト送るサンプルでもう 1 つは実際にマイクから音声データを取得してストリーミング入力してリクエストを行うものです。今回は Python のサンプルコードについてポイントを解説します。

pip install pyaudio

まず最初に登場する PyAudio ですが、これはマイク(デバイス)から音声データを取得するハードウェアとのやり取りを行うためのライブラリーです。PyAudio は PortAudio のバインディングです。mac であれば brew などでインストールする事ができます。

self._audio_stream = self._audio_interface.open(
format=pyaudio.paInt16,
# The API currently only supports 1-channel (mono) audio
# https://goo.gl/z757pE
channels=1, rate=self._rate,
input=True, frames_per_buffer=self._chunk,
# Run the audio stream asynchronously to fill the buffer object.
# This is necessary so that the input device's buffer doesn't
# overflow while the calling thread makes network requests, etc.
stream_callback=self._fill_buffer,
)

次にオーディオの設定を行います。音声のファーマット(format)やサンプリング レート(rate)、バッファサイズ(frames_per_buffer)、チャンネル数(channels)など変更の必要がある場合にはこの設定を変更します。変更する際には特にフォーマットとサンプリング レートについては Cloud Speech-to-Text の対応している設定になっているか確認してください。

if not result.is_final:
sys.stdout.write(transcript + overwrite_chars + '\r')
sys.stdout.flush()
num_chars_printed = len(transcript)
else:
print(transcript + overwrite_chars)
# Exit recognition if any of the transcribed phrases could be
# one of our keywords.
if re.search(r'\b(exit|quit)\b', transcript, re.I):
print('Exiting..')
break
num_chars_printed = 0

ストリーミング入力の音声認識では、1 つの発話を自動で検知します。発話が終わっていない間の音声認識結果 result.is_final が False になった状態です。発話が終わり最終的な音声認識結果が確定した際に result.is_final が True になります。認識結果を利用する際にはこの result.is_final の値がどうなっているかを確認することが重要です。

language_code = 'en-US'  # a BCP-47 language tag
client = speech.SpeechClient()
config = types.RecognitionConfig(
encoding=enums.RecognitionConfig.AudioEncoding.LINEAR16,
sample_rate_hertz=RATE,
language_code=language_code)
streaming_config = types.StreamingRecognitionConfig(
config=config,
interim_results=True)

最後にCloud Speech-to-Text の設定を行います。その際にはencoding, sample_rate_hertz が取得した音声の設定を同じであるかを確認してください。また、language_code で認識する言語指定します。

Cloud Speech-to-Text の Tips

  1. マイクゲイン (*1) の確認
    音声認識がうまくいかない原因の中でたまにあるのが、マイクゲインが大きすぎるまたは小さすぎるため音が正しく取得できずに音声認識ができないことがります。特にストリーミング入力の音声認識を利用している場合入力の音声の直接聞くことができないため、気づかないことがあります。もし、音声認識がうまく行かない場合は PyAudio などで音声を取得しサチってないかなど確認する良いと思います。
    (*1) マイクゲインとは簡単に言うと入力された音声を大きくしたり、小さくしたりする処理で利用する設定のことです。この処理は開発者が意図せずマイクや接続デバイスで自動で行われることもあり、気づきにくいこともあります。
  2. GND の確認
    マイクをオーディオ デバイス経由で接続している場合に稀に デバイスの GND がちゃんと接地できておらず GND が不安定になり音声にノイズが入ってしまうことがあります。GND が正しく接地されているか確認する良いと思います。
  3. 対応フォーマット、サンプリングレートの確認
    コード解説の中でも触れましたが、Cloud Speech-to-Text の対応フォーマット、サンプリングレートは大切な設定です。https://cloud.google.com/speech-to-text/docs/best-practices, https://cloud.google.com/speech-to-text/docs/encoding の内容を確認し使用する音声データ、音声の取得設定が正しいか確認する良いと思います。
  4. ノイズ除去処理が行われていないかの確認
    公式ドキュメントにもありますが過度なノイズ除去を行った音声データでは音声認識が正しく動作しない場合があります。周波数領域での雑音除去で発生するようなミュージカル ノイズのようなものが音声データに入っていないかなど音声データを実際に聞き確かめることが重要です。機器によっては意図せず自動でノイズ除去が行われている場合もあります。
  5. Endless streaming
    ストリーミング入力の音声認識ではストリーミング入力の時間制限があります。ストリーミング入力の時間制限について気になっている方は Endless streaming tutorials が公式ドキュメントにありこちらの情報が役に立つかもしれません。

終わりに

今回は 私の大好きな Cloud Speech-to-Text について解説しました。Cloud Speech-to-Text では音声データを扱いますが、音声データの取得、処理などのオーディオ プログラミングは初めての方も多く、理解しづらい部分もあると思います。また、プログラミングの知識、クラウドの知識ではなくアナログ的な知識が必要な部分もあります。この記事が Cloud Speech-to-Text を使う第一歩の障壁を下げることができればうれしいです!!最後まで読んでいただきありがとうございます。

明日 2019–12–20 は Yasushi Takata さんによる ”BigQueryと上手に付き合う5つのTips” です。お楽しみに!!

--

--