Google Cloud Platformには、音声ファイルからテキストを起こすいわゆる「文字起こし」のできるウェブサービスが存在します。それが、Cloud Speech API。これは文字起こしだけではなく、音声認識システムにも利用できるものであり、音声ファイルではなく直接音声をデータ化した後、なげて上げると、Google HomeやAlexaなどにも繋げることのできる、非常に重要なサービスです。

今回はこのサービスを使って、音声データをテキスト化してメッセージボックスで表示するまでを実装してみたいと思います。ただしこのAPIは有料課金APIですので、そのままではGoogle Apps Scriptからは利用できません。課金手続きを行うと現在300ドル分のサービスが無料で利用できますので、その範囲内でやってみたいと思います。

Cloud Speech APIの概要

Cloud Speech APIはGoogle Cloud Platformのサービスの1つです。有料課金サービスであるため、利用する場合には課金登録が必要ですので、クレジットカードが必要です。ですが、初回無料サービスで300ドル分のクーポンが付いてくるので、300ドルまでは無償で利用が可能です(300ドルに到達してもいきなり課金にはならないようです)。

このAPIの利用上の制限は以下の通り。

項目名内容
音声ファイルFLAC形式:モノラル サンプリングレート:16000Hz, 16bit
無償時間60分/月
リクエスト単位15秒単位
有償上限時間60分以上で100万分まで
有償課金0.006ドル/15秒

今回使用するファイル・ライブラリ

事前準備

今回のスクリプトは変換元となる音声ファイルが必要です。ただしこのファイルフォーマットは制限事項にもあるように、FLAC形式でモノラルである、など制限を守ったWAVファイルである必要があります。mp3やaacなどは利用ができないので、ICレコーダーなどで取得したファイルなどで、この形式でない場合には、一度変換してあげる必要があります。変換サイトはこちらなどが良いかと。

図:事前に音声ファイルを変換しておきましょう

OAuth2.0認証ライブラリの追加

今回のサービスは、OAuth2.0認証が必要です。以下の手順でOAuth2 for Apps Scriptライブラリを追加しましょう。

  1. スクリプトエディタを開きます。
  2. メニューより「リソース」⇒「ライブラリ」を開きます。
  3. ライブラリを追加欄に「1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF」を追加します。
  4. 現時点ではバージョンは30が最新ですので、それを選択しておきます。
  5. 保存ボタンを押して完了

これで、OAuth2.0認証にまつわる様々な関数を手軽に利用できるようになります。

図:ライブラリを追加した様子

サービスアカウントの作成

今回のスクリプトの準備で最も面倒なのはこのサービスアカウントの作成です。サービスアカウントの作成自体は以前Google Cloud Consoleを弄ってみるの回で紹介しています。ですが、今回改めてSpeech APIの利用まで含めて特殊なコードが必要なので、ここで紹介いたします。今回はサービスアカウント方式を利用していますが、シンプルなAPI方式もあります(ただし有償課金サービスなので、よりセキュアなこの方式を推奨します)

  1. スクリプトエディタを開き、「リソース」⇒「Googleの拡張サービス」を開く
  2. ダイアログ下にある「Google Cloud Platform API ダッシュボード」を開く
  3. APIとサービスの有効化」をクリックする
  4. Speechで検索し、「Cloud Speech API」をクリックする。Cloud Text-speech APIじゃないので注意!!
  5. 請求の有効化画面が出るので「請求アカウントの作成」をクリック
  6. ウィザードに従い、同意して続行しクレジットカード情報を登録します。
  7. プロジェクトへの認証情報の追加画面では、Cloud Speech APIを選択し、App Engineで使う予定の問いには、「いいえ」で答える
  8. 次のステップではサービスアカウントの名前を入力。わかりやすい名前をつけましょう。キーのタイプはJSONを選択
  9. サービスアカウントの役割では、Project⇒編集者を選択します。
  10. JSONファイルがダウンロードされるので、これを誰とも共有しない形で、Google Driveにアップロードします(Google Cloud Storageも可能です)。流出すると後で課金で痛い目を見るので絶対に共有はしないでください。
  11. アップロードしたJSONファイルの直URLを取得する。https://drive.google.com/open?id=に続けてファイルのIDをつなげればOKです。
  12. 次の項目のJSONキーファイルを取得して認証するにて、冒頭のfilelinkの場所にこのURLを入れてあげる。

図:Cloud Speech APIの有効化画面

図:請求アカウントを作らなければいけません

図:サービスアカウント方式ではなくAPI方式もあります

図:サービスアカウントの権限はできる限り最小で

JSONキーファイルを取得して認証する

  • この認証方式はサービスアカウントが認証を行うので、いつものユーザが認証するものとは異なり、Access Token取得は自動で行われます。
  • 取得したアクセストークン等の塊は、OAuth2ライブラリ最新版より、スクリプトプロパティではなくユーザプロパティに格納されているので、より安全になっています。塊は、var service = checkOAuth();で呼び出せます。

Google Picker用の準備

今回のスクリプトでは、ユーザがFLACファイルをそのままアップロードして、変換できるようにPicker APIを利用しています。Picker APIでは単一ファイルをアップロードでき、アップロード後にはconvertAtoT関数へファイルのIDを渡してあげています。APIキーの取得に関しては、前回の記事が参考になります。

ソースコード

ここでは、変換用のメインコードを表示しています。Google Picker側でファイルのアップロードを行うと、このルーチンに渡され、音声ファイルがAPIを利用して、テキストに変換されます。

  • ファイルの変換と結果の取得で2回UrlFetchAppを2回実行しています。
  • 其のため、途中で10秒間Sleepを入れる必要があります。連続実行時間制限回避の為です。
  • PickerからアップロードしたファイルのIDを取得し、Base64でエンコードしたものをAPIに渡しています。
  • 変換結果はretjsonに文字列として帰ってきます。これをメッセージボックスで表示しています。
  • 変換結果に句読点はありません。将来的には句読点がつくかもしれません。
  • 変換結果のクオリティは上々。

実行結果

実際にサンプルで用意した機械音声のFLACファイルをAPIで変換してみます。

  1. スプレッドシートのメニューより「文字起こし君」⇒「ファイルの変換」を実行
  2. Pickerが起動するので、FLACファイルを投げ入れてアップロード
  3. しばらく待つ。ファイルのサイズで時間は変わります。
  4. 変換結果のテキストが帰ってきて、メッセージボックスで表示されます。

図:JSONで返ってくる。transcriptが変換結果の入ってる部分です。

共有してみる: