Google Cloud Text-to-Speechをbashとjqで使いやすくする

# はじめに
* Text-to-Speechを使うと簡単に音声ファイルを作成できます。
* 私は、英語学習の復習用に音声ファイルを活用しています。
* 今回は、bashとjqを使い、英文の音声化をスクリプト化します。

# 1. Google Cloud プロジェクト作成及びGoogle Cloud SDK のインストール

事前準備として、Google Cloud プロジェクト作成及びGoogle Cloud SDK のインストールが必要です。
下記公式ガイドのページの手順にしたがって実施してください。

https://cloud.google.com/text-to-speech/docs/quickstart-protocol?hl=ja
[「始める前に」](https://cloud.google.com/text-to-speech/docs/quickstart-protocol?hl=ja#before_you_begin)を参考に 1. ～ 6.までの手順を実施してください。



#2. ファイル及びディレクトリ構成
```txt:ファイル及びディレクトリ構成
・
├── google-cloud-sdk（ディレクトリ Google Cloud SDK）
├── input.txt（input英文ファイル）
├── mp3(ディレクトリ mp3出力用)
├── request.json（HTTPリクエスト本文）
├── service-account-file.json(サービス アカウント キーが含まれる JSON ファイル)
├── synthesize-output-base64.txt（RESTコマンド出力。合成された音声がbase64でエンコードされたtextファイル）
├── template_request.json（HTTPリクエストのtemplate）
├── text_to_speech.sh（Text-to-Speech用スクリプトファイル）
```
#3. HTTPリクエストのtemplateファイル

* HTTPリクエストのtemplateファイルを作成します。
* HTTPリクエストのtemplateファイルは、[公式ガイドのJSON 本文のリクエスト](https://cloud.google.com/text-to-speech/docs/quickstart-protocol?hl=ja#synthesize_audio_from_text)を参考に作成しています。
* 後述するスクリプトで、このtemplateファイルを元にHTTPリクエストの本文を作成します。
* "voice" の値は公式ガイド[サポートされている音声と言語](https://cloud.google.com/text-to-speech/docs/voices?hl=ja)を参考に選択してください。
* "audioConfig" の値については[RESTリファレンス](https://cloud.google.com/text-to-speech/docs/reference/rest/v1/text/synthesize?hl=ja#audioconfig)を参照し、必要な値を設定してください。
通常、Encode方式のみ設定すれば問題ありませんが、私は聞き取りやすくするため再生速度を0.8に落とす設定を追加しています。

```json:template_request.json
{
  "input":{
    "text":""
  },
  "voice":{
    "languageCode":"en-US",
    "name":"en-US-Wavenet-D",
    "ssmlGender":"MALE"
  },
  "audioConfig":{
    "audioEncoding":"MP3",
    "speakingRate": 0.8
  }
}
```

#4. スクリプト

[公式ガイドの「テキストから音声を合成する」](https://cloud.google.com/text-to-speech/docs/quickstart-protocol?hl=ja#synthesize_audio_from_text)の手順をスクリプトに置き換えたものになります。
1. HTTPリクエストのtemplateファイルのtext フィールドにinput.txtの内容をセットしたHTTPリクエスト本文をjqコマンドで作成し、その後RESTコマンドを発行する。
2. 結果のjsonから"audioContent"キーの値のみjqコマンドで取り出す。
3. base64形式のtextファイルをmp3形式にデコードする。
4. 作成したmp3ファイルを再生する。（mpg123がインストールされていない場合はインストールするか他のMP3 playerを使用してください）

```bash:text_to_speech.sh
#!/bin/bash
# サービス アカウント キーが含まれる JSON ファイルのパスを指定する
GOOGLE_APPLICATION_CREDENTIALS="service-account-file.json"
now=$(date +%Y%m%d-%H%M%S)
mp3_dir="mp3"

# inputにするファイルを変数に代入する
INPUT_TEXT=$(cat input.txt)

# HTTPリクエストのtemplateを読み込んで音声変換対象のtext部分のみファイルの内容に置き換える
cat template_request.json \
  | jq --arg v "${INPUT_TEXT}" '.input.text|=$v' > request.json
# curlコマンドでRESTリクエストを投げる
# 結果のjsonから"audioContent"キーの値のみ取り出す
curl -X POST \
     -H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \
     -H "Content-Type: application/json; charset=utf-8" \
     -d @request.json https://texttospeech.googleapis.com/v1/text:synthesize \
     | jq -rc '.audioContent' > synthesize-output-base64.txt
# base64形式のtextファイルをmp3形式にデコードする
base64 synthesize-output-base64.txt --decode > ${mp3_dir}/${now}_synthesized-audio.mp3
# 作成したmp3ファイルを再生する
mpg123 ${mp3_dir}/${now}_synthesized-audio.mp3
```
# おわりに
Google Cloud Text-to-Speechはブラウザからも簡単に試すこともできますが、今回紹介したようなスクリプトを作っておくと自分好みの音声や設定に調整を加えて結果を比較することも容易になるのでかなり使い勝手が向上すると思います。また、英語のWaveNet（高品位モード）はほとんど違和感のない音声を合成してくれるのでいろんな場面で活用できるのではないかと思っています。

この記事が何かのお役にたてれば幸いです。