Google Cloud Text-to-SpeechをPythonで試す

Google Cloud Text-to-Speechを試したくて情報収集していてえらく苦労した．

Google Cloudのサービスを使う際には，Googleのコマンドラインツールを入れるだの，それを認証させるだの，いろいろとややこしい．自分の手元のPCにあんまりいろんなツールを入れるのいやだったので，何とかなんないかな～，と調べまくった．

最終的に一番簡単な方法はこれだろう，というのにたどりついたので，そのメモ書き．
（すでに登録してしまってから書いているので，イチから登録するときにはもしかしたら違ってるかもしれません・・・）

# Google Cloudへの登録

https://cloud.google.com/?hl=ja

「無料で開始」から，アカウント登録．
名前とか住所とか支払い情報とかごちゃごちゃ入力．

# Google Cloud Text-to-Speechを有効化
https://cloud.google.com/text-to-speech?hl=ja

「有効化」をクリック

# API Keyの取得
右上に「コンソール」というものがあるはずなのでそこをクリック．

コンソール画面に遷移したら，上に検索ボックスがあるので，そこに`/認証情報`と入力．

するとトップに「API」というアイコンのついた以下のような項目があるのでクリック．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317916/21936e54-12a0-44f3-bd7c-ce8c3572240a.png)

すると，こんな画面がでてきます．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317916/db31ea20-255b-461b-ae74-dffc6ccffb4c.png)

この「＋認証情報を作成」とクリック．選択肢が3つ出てくるが，「APIキー」を選択すると，APIキーが発行される．

なお，発行直後のAPIキーは有効化されているあらゆるGoogle Cloud APIサービスにアクセスできるキーになっているので，使えるAPIを制限したい場合には作ったキーをクリックする．すると，以下のような画面が現れ，「キーを制限」を選ぶと，使うAPIを選択することができる．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317916/22c15498-a3d2-4901-9ce6-c5b6096be948.png)

# REST APIで使う（Python）
APIキーが取得できたら，あとはGoogle Cloud Text-to-SpeechのREST APIにキーを含めて叩けばOK.
具体的には以下のような感じ

```python
import requests
import json

# APIキーをここに入れる
API_KEY = "********************************"

# APIエンドポイント
url = f"https://texttospeech.googleapis.com/v1/text:synthesize?key={API_KEY}"

# 音声合成のリクエストデータ
data = {
    "input": {"text": "こんにちは、Google Cloud Text-to-Speechです。"},
    "voice": {
        "languageCode": "ja-JP",
        "name": "ja-JP-Wavenet-D",  # 男性の自然な声
        "ssmlGender": "MALE"
    },
    "audioConfig": {
        "audioEncoding": "MP3"
    }
}

# リクエスト送信
response = requests.post(url, headers={"Content-Type": "application/json"}, data=json.dumps(data))

# 結果を取得
if response.status_code == 200:
    audio_content = json.loads(response.text)["audioContent"]
    with open("output.mp3", "wb") as audio_file:
        audio_file.write(bytearray(audio_content, "utf-8"))
    print("音声ファイル 'output.mp3' が作成されました。")
else:
    print("エラー:", response.text)

```

あるいは，ファイルにするのではなく，python上で直接再生させたい場合には以下のような感じ．

```python
import requests
import json
import io
from pydub import AudioSegment
from pydub.playback import play
import base64

# APIキーをここに入れる
API_KEY = "********************************"

# APIエンドポイント
url = f"https://texttospeech.googleapis.com/v1/text:synthesize?key={API_KEY}"

# 音声合成のリクエストデータ
data = {
    "input": {"text": "こんにちは、Google Cloud Text-to-Speechです。"},
    "voice": {
        "languageCode": "ja-JP",
        "name": "ja-JP-Wavenet-D",  # 男性の自然な声
        "ssmlGender": "MALE"
    },
    "audioConfig": {
        "audioEncoding": "MP3"
    }
}

# リクエスト送信
response = requests.post(url, headers={"Content-Type": "application/json"}, data=json.dumps(data))

# 結果を取得
if response.status_code == 200:
    # Base64エンコードされた音声データをデコード
    audio_content = json.loads(response.text)["audioContent"]
    audio_data = base64.b64decode(audio_content)
    
    # バイナリデータを pydub の AudioSegment に変換
    audio = AudioSegment.from_file(io.BytesIO(audio_data), format="mp3")

    # Python 上で直接再生
    play(audio)

else:
    print("エラー:", response.text)


```