Google Apps ScriptでCloud Text-to Speechの音声合成のやり方をサンプルコードで解説!

2019年12月29日

Google Apps Script(GAS)でGoogle Cloud Platformのサービス「Cloud Text-to Speech」をAPIで利用して、音声合成を行う方法・手順を解説したいと思います。

サンプルコードを用意したので、それをひな型にして、音声合成にトライできます。

Cloud Text-to Speechとは?

「Cloud Text-to Speech」はGoogle Cloud Platform(GCP)のクラウドAIサービスです。

Cloud Text-to Speechの詳細ページ

  1. テキストデータを処理
  2. 音声合成を実行
  3. 音声ファイル出力

という一連の処理を行ってくれます。

生成される音声もかつての音声読み上げサービスに比べると、滑らかです。

WaveNet 音声と呼ばれる品質の高い音声も利用可能で発声クオリティも高いです。

累計の音声データが約1時間分までなら無料で生成できます。

アメリカ英語からオーストラリア英語まで対応

GoogleのCloud Text-to Speechの特徴は、英語話者の豊富さがあげられます。

アメリカ英語では10種類の音声が利用可能で、さらにイギリス英語からオーストラリア英語まで対応しています。

Googleはアメリカで開発されているので、英語の発話は非常に滑らかで、日本人の耳では人間の声と区別がつかないほどです。

Cloud Text-to Speechは日本語の読み上げも可能

Cloud Text-to Speechは日本語の話者にも対応しています。

ただ、残念ながら男性の音声はなく、女性オンリーになっています。

女性・標準音声と女性・WaveNet音声の2種類が利用可能です。

速度やピッチも調整可能で、スピードと周波数を少し変えることで、同じCloud Text-to Speechの話者でも違ったように聞こえます。

Googleの音声合成サービスなので、GASとの相性が良い

Cloud Text-to SpeechはGoogleが提供している音声合成のサービスのため、Google Apps Scriptとも非常に相性がよいです。

通常、Google Apps Scriptと音声合成のAPIを接続しようとすると、認証に手間がかかります。

しかし、Cloud Text-to Speechなら同じGoogleアカウント上で稼働させることができるので、APIの紐づけがスムーズです。

そのため、Google Apps Scriptで音声合成を行う場合に、最も導入しやすいのがCloud Text-to Speechと言えます。

Cloud Text-to SpeechのGASで利用する導入手順【図説】

Cloud Text-to SpeechをGoogle Apps Scriptで利用するためには、事前設定が必要になります。

しかし、このCloud Text-to Speechの導入手順も簡単で、以下の設定で利用可能になります。

1.GCPの管理画面でCloud Text-to SpeechのAPIを有効化

Cloud Text-to SpeechのAPI管理画面リンク

※事前にGoogle Cloud PlatformのGoogleアカウント登録が必要です。

2.有効化したGCPプロジェクトのプロジェクト番号を控える

GCPコンソールのホーム画面にあるダッシュボードの「プロジェクト情報」からプロジェクト番号をコピーします。

3.GCPのプロジェクトのOAuth同意画面の設定画面で「アプリケーション名」を入力し、保存する

入力項目は複数ありますが、「アプリケーション名」のみ入力すれば、OKです。

4.GASのエディタメニュー>リソース>「Cloud Platformのプロジェクト」を選択

5.入力欄にプロジェクト番号を入力し、「プロジェクトを設定」ボタンを押下

「プロジェクトの変更の確認」というダイアログが表示されますが、「確認」ボタンをクリックします。

6.「このスクリプトが現在関連付けられているプロジェクト」が表示されたことを確認し閉じる

※うまく表示されない場合は、3のOAuth同意画面の設定ができていない可能性が高いです。

7.GASのエディタメニュー>表示>マニュフェストファイル表示を選択

8.マニュフェストファイル「appscript.json」を以下に書き換え、保存

{
  "timeZone": "Asia/Tokyo",
  "oauthScopes": [
    "https://www.googleapis.com/auth/script.external_request",
    "https://www.googleapis.com/auth/drive",
    "https://www.googleapis.com/auth/cloud-platform"
  ],
  "dependencies": {
  },
  "exceptionLogging": "STACKDRIVER"
}

※oauthScopesとして、①外部にポストする、②Googleドライブにファイル保存する、③GCPを利用するための3つの権限許可をマニュフェストファイルに記載しています。

以上のステップでCloud Text-to SpeechをGASで利用するための事前設定が完了です。

これで後述するCloud Text-to Speechを利用するサンプルコードが実行可能になります。

Google Apps Scriptの音声合成サンプルコード

GASで音声合成を行うサンプルコードを用意しました。

  1. 音声合成したいテキストを入力
  2. Cloud Text-to SpeechにAPIリクエスト
  3. 返ってきたデータを音声ファイルにデコード
  4. 音声ファイルとしてGoogle Driveに保存

という流れで処理を行うひな型となるコードです。

function generateSpeechToDrive() {

  //音声出力したいテキストデータと出力する音声データのファイル名を定義します。
  var speechText ="ここに日本語テキストを入力してください";
  var name = "test.mp3"

  //cloudText-to-SpeechにAPIでリクエスト時に送るjsonを定義します。
  //synthesizeメソッドで使うパラメータはhttps://cloud.google.com/text-to-speech/docs/reference/rest/v1/text/synthesize?hl=jaを参照してください。
  var json = {
    "audioConfig": {
      "audioEncoding": "MP3",
      "pitch": "5.00",
     "speakingRate": "1.10"
    },
    "input": {
    "text": speechText
    },
    "voice": {
      "languageCode": "ja-JP",
      "name": "ja-JP-Wavenet-A"
    }
  }

  //APIリクエストするためのペイロードやURL、ヘッダー情報を定義します。
  var payload = JSON.stringify(json);
  var url = "https://texttospeech.googleapis.com/v1beta1/text:synthesize";
  var headers = {
    "Content-Type": "application/json; charset=UTF-8",
    "Authorization": "Bearer " + ScriptApp.getOAuthToken(),
  };

  //APIをポストするためのオプションを定義し、URLフェッチを行います。
  var options = {
    "method": "post",
    "headers": headers,
    "payload": payload,
  };
  var data = UrlFetchApp.fetch(url, options);

  //取得したJSONデータをパースして取り扱えるようにします。
  var talkData =JSON.parse(data);

  //BASE64のデータとなっているので、デコードを行い、音声ファイルに変換します。
  var decoded = Utilities.base64Decode(talkData.audioContent);

  //デコードした音声データを音声用のBLOB形式に変換し、GoogleDriveに保存します。
  var blob = Utilities.newBlob(decoded, "audio/mpeg", name);
  DriveApp.createFile(blob);

}

前述の事前導入設定を行ったあと、上記のコードをGASのスクリプトエディタに貼り付けます。

「generateSpeechToDrive」を実行すると、音声ファイルがGoogle Driveに保存されます。

ぜひ、入力するテキストデータやピッチ、話すスピード、話者を調整してみてください。

「Exception: サーバー エラーが発生しました」の対処法

ここまでの手順に従って、GCPの管理画面でCloud Text-to SpeechのAPIを有効後、サンプルコードを実行した際に、以下のエラーが出るケースが報告されています。

「Exception: サーバー エラーが発生しました。しばらくしてからもう一度試してください。」

このエラーはCloud Text-to SpeechのAPI部分ではなく、Googleドライブの「DriveApp.createFile()」のコマンドでエラーが生じています。

調査したところ、GoogleDriveのAPIがGCP上で無効になっていることが原因です。

どうやらGoogleCloudPlatformを紐づけや、マニュフェストファイルを修正していると、APIが有効→無効になるようです。

実行エラーを解消するためには、「Google Drive API(GCP管理画面)」でAPIを有効にします。

GCP上でGoogle Drive APIを有効にすれば実行エラーが解消され、正常に実行し、音声データがGoogleドライブに保存することができます。

Githubにテンプレートのコードを用意

今回紹介した、Google Apps ScriptでCloud Text-to Speechを扱うサンプルコードは、テンプレートとして、Githubにもレポジトリとして登録しています。

GoogleAppsScript_cloudText-to-Speech_template(Github)

リポジトリからスクリプトをDLして活用いただくことができます。

そちらのREADME.mdに簡単な使い方・導入手順を解説しています。

まとめ・終わりに

今回、Google Apps Script(GAS)でGoogleの音声合成サービス「Cloud Text-to Speech」をAPIで実行する方法を紹介しました。

GASで音声合成でテキストデータから音声ファイルを出力したい場合は、

Google Apps Script ✖ Cloud Text-to Speech

が最も導入コストが低いです。

今回、実際にテキストデータをCloud Text-to Speechに送り、音声ファイルを生成、Google Driveに保存するサンプルコードを用意しました。

ぜひ、音声合成をやってみたい人はこのサンプルコードをテンプレートとしてご活用ください。