Google Cloud Speech-to-Text を使用して、日本語音声の文字起こし

Google Cloud Speech-to-Text とは

Cloud Speech-to-Text – 音声認識 | Cloud Speech-to-Text API | Google Cloud

  • Google のすごい音声認識 API
    • 日本語から بھارت 語、தமிழ் 語まで120 の言語に対応 (すごい)
    • かなりいい感じの精度 (すごい)
    • gRPC を使用したリアルタイム変換 API も存在 (すごい)

(2018/10/30 現在) 日本語に対応していないが、下記のような機能も存在。

  • 句読点入力の自動化 (すごい)
  • 複数話者の認識、識別 (すごい)

API の種類

3 つある。

  1. 同期音声認識 API: 60 秒未満の音声ファイルを扱う場合
  2. 非同期音声認識 API: 60 秒以上の長い音声ファイルを扱う場合
  3. ストリーミング音声認識 API: マイク等で拾った音声をリアルタイムに変換する場合

3. は REST API じゃなくて、巷で話題の gRPC を使用した API。 しかし、公式クライアントライブラリを使えば、特に意識すべき点はない。

ストリーミング音声認識 API を使ってみた

Node.js (v10.9.0) on OS X (El Capitan) でやってみた。

ちなみに、同期音声認識の API はここのデモですぐ試せる。

API の有効化

ドキュメントに存在する ENABLE THE API ボタンを押下して画面の指示に従う。

以下が行われるはず。

  • Cloud Speech API 有効化
  • サービス アカウント作成

必要なものをインストール

homebrew で SoX をインストール。

brew install sox
npm install @google-cloud/speech
npm install node-record-lpcm16

コード

ドキュメントのサンプルコードでだいたい間に合う。

そこから雑に一部調整。

  1. 無音部分を API へ垂れ流さないようにパラメータ調整
    • threshold: 0.5silence = 1.0 など
    • さもなくば、Error: Audio data is being streamed too slow. Please stream audio data approximately at real time. などと怒られるので
  2. API の制限によりタイムアウトとなってしまうので、最大 60 秒で雑に一旦録音を打ち切り
  3. 無音区間の検知後にプログラムが終了してしまうので、無限ループ化

特に 3. に関しては、SoX (マイク等からの音声録音を担当) の子プロセスごと無理やり起動し直しているので、プロセス再起動中の音声を取りこぼしてしまうことがある。

また、ニュースのように 60 秒以上ほぼ喋り続けているような音声を変換する場合、 2. の録音打ち切りのため、やはり取りこぼしの生じる場合がある。

したがって、もっと丁寧に対応しないと使い物にならないと思われる。

文字起こし例1

macOS でお馴染みの say コマンド。

say -v kyoko "こんにちは、私の名前はKyokoです。日本語の音声をお届けします。"

Expected

こんにちは、私の名前はKyokoです。日本語の音声をお届けします。

Actual

完璧。

こんにちは私の名前は恭子です日本語の音声をお届けします

文字起こし例2

ニュース動画。 うまくいった例。

Expected

大阪メトロの地下鉄の駅がお化け屋敷のように様変わりするハロウィンイベントが行われました。
ゾンビ襲撃に乗客パニック 大阪メトロでハロウィンイベント 地下鉄構内がお化け屋敷に(ABCテレビ) – Yahoo!ニュース

Actual

大阪メトロの地下鉄の駅がお化け屋敷のように様変わりするハロウィンイベントが行われました

文字起こし例3

同じくニュース動画。 引用の要件的に、長々と貼るわけにもいかないので結果はお察しください……

Expected

また、首都ローマの近郊では倒木が車を直撃し中にいた2人が死亡するなどーー
ベネチア4分の3が冠水 10年ぶり水位に(日本テレビ系(NNN)) – Yahoo!ニュース

Actual

またちょっとローマの近郊では倒木が車を直撃し中にいた2人が死亡するなどーー