Google Cloud Text-to-Speech は、テキストを読み上げてくれる音声変換サービスです。日本語を含め複数の言語に対応し、機械学習を利用して自然な発音の音声を合成することができます。そこで今回は、日本語のテキストを Google Cloud Text-to-Speech に読み上げさせる手順をまとめてみました。
(2018年7月22日追記)WaveNet voices が日本語にも対応しましたので記事を更新しました。
(2020年3月13日修正)サービスアカウントの作成手順に誤りがあったため修正しました。
5秒で試せる Cloud Text-to-Speech
Google Cloud Text-to-Speech のページ にあるデモアプリに、適当な日本語のテキストを入力して言語「Japanese」を選択すれば日本語で読み上げてくれます、利用登録も必要ありません。
Google Cloud Platform の利用登録
Cloud Text-to-Speech API を直接使うには、まず初めに Google Cloud Platform の利用登録が必要になります。(Cloud Text-to-Speech は Google Cloud Platform が提供するサービスのひとつです)登録用のGoogleアカウントを1つ用意しましょう。
Google Cloud Platform トップページの「無料トライアル」をクリックし、Googleアカウントでログインします。
Google Cloud Platform の無料トライアルの登録画面が表示されますので、住んでいる国を選択し「同意して続行」をクリックします。
次の画面で「住所」「名前」「電話番号」「クレジットカード番号」(これらの項目は必須です)を入力し、「無料トライアルを開始」をクリックします。
以上で登録完了です。しばらくすると Google Cloud Platform のコンソール(管理画面)が表示されます。
プロジェクトの作成
Cloud Text-to-Speech のテスト用に新しいプロジェクトを作成します。(テストが終わったらプロジェクトを削除するだけで片付けができます)
「プロジェクトを選択」(もしくは「My First Project」)をクリックします。
「+」ボタンをクリックします。
適当なプロジェクト名を入力して、「作成」をクリックします。
1分ほどでプロジェクトが作成されますので、選択します。(自動で選択されている場合もあります)
Cloud Text-to-Speech API の有効化
続いて今回の本題、Cloud Text-to-Speech API を有効化します。標準音声は月間400万文字、より自然な発音を可能とする WaveNet音声は月間100万文字の読み上げまでは無料で使えます。(2020年5月8日現在)
参考資料:Pricing | Cloud Text-to-Speech API
左上のハンバーガー「≡」メニューから「APIとサービス」>「ライブラリ」を選択します。
かなりの数の APIがあるので「Text-to-Speech」を検索して選択します。(名前が似ている Cloud Speech API は "音声を" テキストに変換してくれるサービスです。 間違えないようにしましょう)
「有効」にするをクリックします。
以上で Cloud Text-to-Speech API が有効になりました。
Google Cloud SDK のインストール
Cloud Text-to-Speech API の認証情報を作成するのに Google Cloud SDK が必要になりますので、インストールします。
SDKのインストールの前に、システムに Python 2.7 がインストールされていることを確認します。最近のmacOSやCentOS7であれば、Python2.7がインストールされていると思います。(今回はmacOS10.13のマシンにインストールしました)
Python 2.7.10 ← インストールされている
ローカルPCがWindowsの場合は「Windows 用のクイックスタート | Cloud SDK のドキュメント」ページから、インストーラをダウンロードできます。
SDKをインストールしたいディレクトリに移動して、以下のコマンドを実行します。
$ curl https://sdk.cloud.google.com | bash
SDKのインストール先ディレクトリの指定です。よければそのままエンターを押してください。SDKのダウンロードが始まります。
SDKがクラッシュした場合に、匿名化された使用データをGoogleに送ってもいいか聞かれます。(ここはお好みで選択してください)
シェルの設定ファイルに SDKコマンドへのパスを追加してもいいか聞かれますので「Y」を入力してください。
completion?
Do you want to continue (Y/n)? Y
シェルの設定ファイルのパスの確認です。よければそのままエンターを押してください。
[/Users/foo/.bash_profile]:
シェルの設定ファイルを再読み込みして「gcloud」コマンドが実行できることを確認します。
$ gcloud help
(ヘルプが表示されればOKです)
続いて Google Cloud SDK の初期化を行います。
Google Cloud SDK の初期化
Google Cloud SDK の認証
Googleアカウントで Google Cloud SDK をアプリ認証します。以下のコマンドを実行してください。
Googleアカウントにログインしていいですか? と聞いてきますので「Y」を入力します。(WEBブラウザが開きます)
Google Cloud Platform で使っている Googleアカウントを選択します。
Google Cloud SDK のリクエストを許可します。(この許可はGoogleアカウントの管理画面でいつでも取り消すことができます)
「Google Cloud SDK の認証が完了しました」が表示されたら、ターミナル(コマンドプロンプト)に戻ります。
プロジェクトIDの選択
ターミナルに戻ったら、とりあえず先ほど作成したプロジェクトのIDを選択しておきます。
[1] my-first-project-203409
[2] text-to-speech-test-203409
[3] Create a new project
Please enter numeric choice or text value (must exactly match list
item): 2
(捕捉)Google Cloud SDK の設定情報は「/<ホームディレクトリ>/.config/gcloud/」以下に保存されます。
以上で Google Cloud SDK を使う準備ができました。
認証情報の作成
Cloud Text-to-Speech API の認証情報を作成します。
「IAM と管理」>「サービスアカウント」を選択します。
「+サービスアカウントを作成」をクリックします。
適当なサービスアカウント名を入力し、「作成」をクリックします。
そのまま「続行」をクリックします。(「役割」は必要ありませんので、選択しないようにしましょう)
「+キーの作成」をクリックします。
キーのタイプ「JSON」を選択して「作成」をクリックします。
キーファイルがダウンロードされます。(メッセージの通りキーファイルの取り扱いには注意しましょう!)
以下のコマンドを実行して、認証情報を指定します。
例えば、/home/foo/ 以下にキーファイル「keyfile.json」をダウンロードした場合、<キーファイルのパス>は次のようになります。
環境変数「GOOGLE_APPLICATION_CREDENTIALS」にもキーファイルのパスを追加しておきます。
Cloud Text-to-Speech API へのリクエスト実行
かな〜り下準備が長くなりましたが、いよいよ Cloud Text-to-Speech API へのリクエスト実行です。
まずリクエスト用の JSON ファイルを作成します。(ファイル名はなんでもかまいません)「text」フィールドに読み上げてほしいテキストを入力します。日本語の WaveNet voices を使う場合は、voice の name フィールドに「ja-JP-Wavenet-A」を指定してください。
vi synthesize-input.json
{ "audioConfig": { "audioEncoding": "MP3", "pitch": "0.00", "speakingRate": "1.00" }, "input": { "text": "東京の今日の天気は晴れ、最高気温は25度、最低気温は19度の予報です。" }, "voice": { "languageCode": "ja-JP", "name": "ja-JP-Standard-A" } }
参考資料:Cloud Text-to-Speech API | APIs & Reference
curl コマンドで Cloud Text-to-Speech API にリクエストを投げます。-d オプションで先ほど作成した、リクエスト用の JSON ファイルを指定します。(パスの先頭に「@」をつけるのを忘れずに!)
-H "Content-Type: application/json; charset=utf-8" \
-d @<JSON ファイルのパス> \
https://texttospeech.googleapis.com/v1beta1/text:synthesize > synthesize-output.txt
例えば、/home/foo/ 以下に JSON ファイル「synthesize-input.json」を作成した場合、<JSONファイルのパス> は次のように指定します。
下のような内容が「synthesize-output.txt」に出力されます。「audioContent」フィールドの値が base64 でエンコードされた音声データです。(メチャクチャ長いです)
cat synthesize-output.txt
"audioContent": "//NAxAAR4EooAAjGJBwAABE(略)
}
音声ファイルにデコードしますので「audioContent」の値を「synthesize-output-base64.txt」というファイルにコピーします。(ファイル名はなんでもかまいません)
vi synthesize-output-base64.txt
最後に base64 コマンドで音声ファイルにデコードします。
読み上げてもらった音声サンプル
Google Cloud Text-to-Speech(スタンダード)で読み上げてもらった音声がこちらです。
(2018年7月22日追記)日本語の WaveNet voices を使って読み上げてもらった音声です。
こちらは同じテキストを IBMクラウドの Watson Text to Speech で読み上げてもらった音声です。どちらも個性がありますね(^^)
おわりに
次回は、競合となる IBM Cloud の 音声合成サービス Watson Text to Speech を試してみたいと思います。
コメント
おかげさまでGoogle Cloudの登録から始めて無事に音声ファイルを取得することができました!こちらでサンプルのMP3ファイルを再生できたので、めげずにできました。
ありがとうございます。
Windowsではまった点を書いておきます。PowerShellで実行しました。
1. 行継続文字は”\”ではなく”`”
2. $(gcloud auth application-default print-access-token)はうまく動かないので、実際に取得した結果文字列(ya29で始まる)をそのまま入力
3. 入力ファイル synthesize-input.json はSJISではなくUTF-8で保存する
SJISなのを気づかずに読み上げてとんでもないMP3が出来上がりました(笑)
4. 出力ファイルからaudioContentの”値のみ”に加工するのを忘れてデコードできない
5. 実行場所のC:\Program Files (x86)\Google\Cloud SDKに結果を書こうとすると権限がないのでデコードできない→別の場所を指定
6. フォルダ名”Program Files”をダブルクオートで囲まなかったのでエラー
7. curl.exeがなければダウンロードする
途中からの流れは、
1. curl.exeをダウンロードして適当な場所に置く C:\Program Files\bin\curl.exe
2. リクエスト用JSONファイルを作成してUTF-8で保存
3. トークンを取得
gcloud auth application-default print-access-token
出力(例): ya29.AHES6ZRVmB7fkLtd1XTmq6mo0S1wqZZi3-Lh_s-6Uw7p8vtgSwg
4. 次のようなcurlコマンドを発行
C:\”Program Files”\bin\curl.exe -H “Authorization: Bearer ya29.AHES6ZRVmB7fkLtd1XTmq6mo0S1wqZZi3-Lh_s-6Uw7p8vtgSwg” -H “Content-Type: application/json; charset=utf-8” -d @C:\Users\takahiro\Downloads\synthesize-input.json https://texttospeech.googleapis.com/v1beta1/text:synthesize > C:\Users\takahiro\Downloads\synthesize-output.txt
5. 出来上がったファイル(synthesize-output.txt)から最初と最後を削除してダブルクオート内の文字列だけにする
6. Windowsではcertutilでbase64のデコードができるので次のように入力
certutil -f -decode “C:\Users\takahiro\Downloads\synthesize-output.txt” “C:\Use
rs\takahiro\Downloads\synthesize-output.mp3”
7. mp3ファイルを再生する
>小林隆弘さん
ありがとうございます!
Windowsをお使いの方に参考になると思います。
Windowsではこのコマンドでできました。
C:\”Program Files”\bin\curl.exe `
-H “Authorization: Bearer $(gcloud auth application-default print-access-token)” `
-H “Content-Type: application/json; charset=utf-8” `
-d @C:\Users\takahiro\Downloads\synthesize-input.json `
https://texttospeech.googleapis.com/v1beta1/text:synthesize `
> C:\Users\takahiro\Downloads\synthesize-output.txt
certutil -f -decode “C:\Users\takahiro\Downloads\synthesize-output.txt” `
“C:\Users\takahiro\Downloads\synthesize-output.mp3”
簡単に申し込めて、安価で手軽に商用利用できる日本語対応TTSはこの他にありそうでしょうか。
Google Cloud TTS
AWS Polly
Azure TTS
IBM Watson TTS
>小林隆弘さん
コメントありがとうございます。
私の知る限りですが、現時点で日本語に対応しているTTSは、
小林さんが上げられている4サービスくらいだと思います。
初めまして!
とても参考になります、ありがとうございます!
すみません、教えて頂きたいのですが、
>最後に base64 コマンドで音声ファイルにデコードします。
ここまでやってみたのですが、その後何も反応がなく、mp3ファイルもダウンロードされてきません。
デコードされたmp3ファイルはどこに存在するのでしょうか?
パソコン側にダウンロードされてくるものではないのでしょうか?
初心者質問、申し訳ございませんが、よろしくお願い致します!
>いわたんさん
こちらこそコメントありがとうございます!
base64コマンドを実行したディレクトリに、mp3ファイルが作成されているはずです。
もし、見つからないようでしたら、下のように mp3ファイルの作成先をフルパスで指定してみてください。
(パスはご自分の環境に読み替えてください)
base64 synthesize-output-base64.txt –decode > /Users/foo/Desktop/synthetic-audio.mp3
サービス アカウントには役割は要らないので設定すべきではないのではないでしょうか
>lainさん
ご指摘ありがとうございます!
lainさんがおっしゃる通り、この記事の場合はサービスアカウントに役割は必要ありませんね。
記事を修正いたしました。
わかりません。。
認証情報の箇所の”キーファイルのパス”と”JSONのパス”が何か分からず先に進めないのでご教授願います。。
>tonさん
コメントありがとうございます。
例えば、/home/foo/ 以下にキーファイル「keyfile.json」をダウンロードした場合、キーファイルのパスは下のようになります。
また、/home/foo/ 以下に JSON ファイル「synthesize-input.json」を作成した場合、JSONファイルのパスは次のようになります。