【音声変換】GCPのText-to-Speechでテキストを音声に変換する

今回はGoogleのGCP(GoogleCloudPlatform)にあるText-to-Speechを試していきたい。この前AWSのAmazonPollyっていうテキストを音声に変換するサービスを使ってみたけど、やっぱりGoogleの方もやっておかないとね。

ちなみにGCPっていうのはAmazonのAWSと同じような感じでGoogleが展開しているサービスがたくさんあるプラットフォームっていう感じ。エンジニアの人なんかなら馴染みのあるやつ。その中にText-to-Speechっていうのがあるから今回はそれを使ってテキストを音声に変換していきたい。

テキストを音声に変換するText-to-Speechとは

Text-to-SpeechはGCPにある入力したテキストを音声にしてくれるサービス。音声の高さを上げたり下げたり、ピッチを変更したりすることができる。

Google の AI テクノロジーを搭載した API を利用すると、テキストを自然な音声に変換できます。

人間のような自然なイントネーションの音声を生成できるらしいということだが、どうなんだろうか。音声の種類も豊富でなかなか使い勝手が良さそう。サポートされている音声と言語を見てみると、サンプルの音声を聴くことができるね。

うーんどうだろう若干機械的だろうか・・・けど音声はそれなりにいじることができるはず。サポートされている言語自体は結構な数あってまあこれだけあれば使うのにもあまり困らないんじゃないかなといったところ。

デモを試してみる

デモからText-to-Speechがどんなものか試すことができる。喋らせたい言葉と言語を選んで[Speech]ボタンをクリックすれば再生される。SpeedやPitchを変更すれば、声の感じが変わったりする。

気になるクオリティはここで試しただけだと、ぶっちゃけそうでもない。ただAWSのAmazon pollyでやったようにSSMLでカスタマイズできるみたいだから、今回もちょっと改造してみたい。

テキスト入力から音声を作成する

音声の作成はデモから試すことができるけど、それだと音声のダウンロードができなかったりするからここではコマンドラインからやりました。コマンドラインから実行したい方はクイックスタート: コマンドラインの使用から試してみるといいでしょう。ただ、GCP使ってコマンド色々打ったりするので多少プログラミングの知識あった方が良さそうです。。

やったことは以下。

  1. request.jsonを作成

どんな音声を作るのかの設定を書く。今回はssmlを使うからタグを色々書いてやってみる。どんな音声を作るのかはrequest.jsonに書いておけばそれを読み取ってテキストを音声に変換してくれる。

{
  "input": {
    "ssml": "<speak><prosody rate=\"x-fast\"> <prosody pitch='low'>サイト</prosody>を見てくれて<prosody pitch='medium'>ありがとう!</prosody>次の記事を<prosody pitch='medium'><emphasis level=\"strong\">お楽しみに!!</emphasis></prosody> </prosody></speak>"
  },
  "voice":{
    "languageCode":"ja-JP",
    "name":"ja-JP-Wavenet-A",
    "ssmlGender":"FEMALE"
  },
  "audioConfig":{
    "audioEncoding":"MP3",
  }
}
  1. curlでリクエストを送信し、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 -r '.audioContent' >> synthesize-output-base64.txt

2. 保存したものをmp3ファイルにデコード

base64 synthesize-output-base64.txt --decode > synthesized-audio.mp3

これでmp3ファイルが作れる。

とりあえず今回読み上げる文言は「サイトを見てくれてありがとう。次の記事をお楽しみに。」にする。そしてその最初の音声がこちら。何も装飾していないそのままの音声だけど、まるでダメだ。

そしてちょっと改造した音声がこれだ。

機械的な音声はあるにしてもある程度の抑揚感はなんとなくつけることができた気がする。ちなみに加えたSSMLはこんな感じ。

<speak>
  <prosody rate=\"x-fast\">
    <prosody pitch='low'>サイト</prosody>を見てくれて<prosody pitch='medium'>ありがとう!</prosody>次の記事を<prosody pitch='medium'><emphasis level=\"strong\">お楽しみに!!</emphasis></prosody>
  </prosody>
</speak>

んー、この短い文章を生成するだけでもこんなタグ使うなんてなんかなんとも言えない。機械感のある感じも抜けていないしな。ちなみに英語の文章を生成するとこんな感じ。

なんか英語の方がクオリティ高い気がするのは気のせいかな。なんだか流暢な気がする。設定はこんな感じ。

{
  "audioConfig": {
    "audioEncoding": "mp3",
    "pitch": 0,
    "speakingRate": 1
  },
  "input": {
    "ssml": "<speak> <emphasis level=\"strong\">To be</emphasis> <break time=\"200ms\"/> or not to be, <break time=\"400ms\"/> <emphasis level=\"moderate\">that</emphasis> is the question.<break time=\"400ms\"/> Whether ‘tis nobler in the mind to suffer The slings and arrows of outrageous fortune,<break time=\"200ms\"/> Or to take arms against a sea of troubles And by opposing end them. </speak>"
  },
  "voice": {
    "languageCode": "en-US",
    "name": "en-US-Wavenet-D"
  }
}

まあ英語の方が使っている人は多いだろうしね。日本語の声より英語の声の方が学習しているのかもしれない。

まとめ

GCPのText-to-Speechを使ってみたけど、とりあえず日本語に関してはまだそこまで流暢に話してくれるわけでないのかな?っていうところ。(もしかしたら自分の使い方が悪くて、もっと良い感じに調整すれば流暢に話してくれるのかもしれない)

AWSのAmazon Pollyも使ってみたけど、まあ違い正直感じられないかなあ・・・もっと人間らしく日本語を話してくれれば何かに使えるかもなあ、なんて思ったけどまだそこまでではない気がする。