• SELECT MENU

2018.10.19

Google Cloud Text-to-Speechについて調べてみた

KAZUYA OHNO
[DIRECTOR]
昔は腹筋割れてた

まずはこちらをどうぞ。

Google Cloud Text-to-Speechとは?

■調べるきっかけ

最近は、合成音声の質が上がってきましたよね。昔よりも流暢に喋るし、ちゃんと聞き取ってくれます。
8月末にGoogle Cloudが大型アップデートしたので、ちょっと触ってみようってことで記事にしてみました。

■どんなサービスなの?

音声でも説明しましたが、Google Cloud Text-to-Speechを使うと、自然な会話音声を合成できます。
現在14の言語と方言に対応しており、30種類以上の音声を利用できます。
Googleの機械学習を搭載し、高度なディープラーニングのニューラルネットワークアルゴリズムを利用して、自然な発音の音声を合成することができます。

Google Cloud Text-to-Speechのアップデートで、それまで英語版にしかなかったWaveNetが搭載されました。
そのおかげで、日本語版もより人間の肉声に近い音声の発話が可能になりました。
しかも初期のモデルに比べて、1000倍の速度で音声を合成できるようになったことや生成の忠実度も高くなったことで、APIが一般的に利用可能になったと言われています。

■WaveNetとはなんぞや?

調べたところ、

WaveNetは、囲碁AI AlphaGoの開発元「DeepMind」が作ったもので、人工ニューラルネットワークによる音声合成アルゴリズムの1つです。
WaveNetが開発される前は、大量の音声データベースから単語をつなぎ合わせていたので、どうしても機械感が強かったが、
サンプリングした人間の音声からディープラーニング技術によって音声波形を細分化して解析するWaveNetのおかげで、
文章の流れを読み取って、単語や文章同士を繋ぐ間も理解し、より人間に近い発話が可能となっています。

とのこと。
なるほど、すごいってことですね(語彙力)
とりあえず、聞き比べてみましょう。

“ja-JP-Standard-A”

“ja-JP-Wavenet-A”

もう全然違いますよね。
生成時間もほぼ変わらずでした。

Google Cloud Text-to-Speechを試してみる

APIを使用するには?

合成音声を試すだけならGoogle Cloud Text-to-Speechでデモを触ることができますが、
せっかくなのでGoogle Cloud Platformで提供されているAPIを使用して試してみました。

APIを使うまでの方法を書こうと思ったのですが、すでに記事がたくさんあるので、詳しいことはググってお試しください。
さらっと箇条書きにはしておきます。

  1. Google Cloud Platformの無料トライアルで必要な情報を入力
  2. プロジェクトを作成
  3. Cloud Text-to-Speech APIの有効化
  4. サービスアカウントを作成して、秘密鍵をダウンロード
  5. PCにGoogle Cloud SDKをインストール
  6. Google Cloud SDKを初期化して、アカウントにログイン
  7. Google Cloud SDKに秘密鍵の設定

上記の方法で、APIが使用できるようになります。

APIはどうやって使う?

今回はJSON形式でAPIを使用してみます。
SDKをインストールしたフォルダ(/Users/ohno/google-cloud-sdk/)
にtestフォルダを作成し、input.jsonという名前でこんなJSONファイルを作成します。

{
  "input": {
    "text": "ためになることや、そうでないことまで。やりたいことオンリーな研究所。「Co-Lab.」"
  },
  "voice": {
    "languageCode": "ja-JP",
    "name": "ja-JP-Wavenet-A"
  },
  "audioConfig": {
    "audioEncoding": "MP3",
    "pitch": "0.00",
    "speakingRate": "1.00"
  }
}

そして、curlコマンドでAPIにリクエストを投げて、戻ってきたデータをsynthesize.txtとして保存します。(synthesize.txtの中身はJSON形式です)

$ curl -H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \
-H "Content-Type: application/json; charset=utf-8" \
-d @/Users/ohno/google-cloud-sdk/test/input.json \
https://texttospeech.googleapis.com/v1beta1/text:synthesize > /Users/ohno/google-cloud-sdk/test/synthesize.txt

synthesize.txtの中身はこんな感じでかなり長いエンコードされた音声データが入っています。

{
"audioContent":"SUQzBAAAAAAAHFRTU0UAAAAIAAADR29vZ2xlAAAAAAAAAAAAAAD/80DEAA3wAi21QBAAhFpCU1TJYCBwSAgcLvJqwcBAECnwICAIBj6jn4Pg4CAY8QBgz4Icu/hjlAQdggc/+kHw///+D70Ak1xl4DZpW8YBE5Grg5Ae/CRSFjv0U86TC1/tHtBtMXz/FP/zQsQjG0s2LAOJQADChlLoNg7r/URHdKuQ9kgLoUWOmpa/63w/ZFPhyLuBy2bKiax3ysR1Kx79onaV+8PA12o1rhYKWv5mo/2/jtP//+v6kaaKf/d/y6oWioUCgUCAMCAQCgCgDnri5P/zQMQRGIoy1l+FaAAY+IAQKFOYIm5OCwNOTxLx5kgMATvKZcNBLx2Hjg8fiZm6ZmbhWEgN5cOfy+9N+nuxp/0zczJMlx4JugZoEoO9MlUnX//W6aboN+m5ubd///TVGmTaV5pRh/1W//NCxAkWegr+N8soAokwPlO4c8PBz4cbECBwfKIZxEUFycpUVEoIh0wiLCAkLKHlRQOLSsV2ce/3f0RF7SoqorK1l1FderfKOFkHyiZGFrRo59YWBa5qf///+1psNAZIYKGADAZRx//r//NAxAsW8grW/sJEfHdtzCZI2ShpqjLrEoML..."
}

“audioContent”: “ここ”の部分だけ抜き出して保存して、音声データに変換するのですが、ファイル開いて選択して保存してコマンド叩くだと、面倒なのでsedコマンドで一発で変換してしまいます。

$ cd /Users/ohno/google-cloud-sdk/test/ (対象フォルダに移動)
$ sed 's|audioContent| |'  output.txt && \
tr -d '\n ":{}'  output-2.txt && \
base64 output-2.txt --decode > synthesize-audio.mp3 && \
rm output*.txt

そうするとこんな音声データができます。

JSONの値について

こちらのリファレンスで見ることができますが、日本語で指定できるもので、わかる範囲で解説したいと思います。

“input”
“text” “text” テキスト
“ssml” “<speak></speak>” SSMLのコードで囲む
“voice”
“languageCode” “ja-JP” 言語の指定です。現状ではこちらからどの言語が指定できるのかの確認ができます。
“name” “ja-JP-Wavenet-A” Wavenetを使用して合成します。
“ja-JP-Standard-A” 通常の仕様で合成します。
“audioConfig”
“audioEncoding” “MP3” .mp3 MP3オーディオ
“LINEAR16” .wav 非圧縮16ビット符号付きリトルエンディアンサンプル
“OGG_OPUS” .ogg Androidとブラウザ(少なくともChromeとFirefox)でネイティブに再生できるファイル。ほぼ同じビットレートを使用しながら、エンコードの品質はMP3よりもかなり高くなる
“pitch” [-20.0 〜 20.0]の範囲 話すピッチを指定
20は元のピッチから20の半音を増やし、-20は元のピッチから20半音を減らす
“speakingRate” [0.25 〜 4.0]の範囲 話すスピードを指定
1.0は特定の声でサポートされている通常のネイティブスピード
2.0は2倍、0.5は0.5倍
指定しないまたは0.0の場合はデフォルトの1.0になる
0.25以下4.0以上だとエラー
“volumeGainDb” [-96.0 〜 16.0]の範囲 話すボリュームを指定(dB)単位
-6.0はデフォルトの半分、6.0は2倍
指定しないまたは0.0(dB)の場合はデフォルトになる
10.0(dB)は超えないように推奨

上記のように、喋るスピードやピッチ、話すボリューム等を変更できます。声の種類は現状だと女性の声しか選べません。

こちらが変更したものになります。[“text”: “この竹垣に竹立てかけたのは 竹立てかけたかったから 竹立てかけたのです”]

デフォルト[“pitch”: “0.00”,”speakingRate”: “1.00”]

スピードを早く[“pitch”: “0.00”,”speakingRate”: “2.00”]

ピッチを短く[“pitch”: “-5.00″,”speakingRate”: “1.00”]

スピードを早く、ピッチを短く[“pitch”: “-5.00″,”speakingRate”: “2.00”]

ボリュームを調整[“volumeGainDb”: “16.0”]

SSMLについて

通常のテキストだと、ただ読むだけなので「間」や強調したい部分などは指定ができませんが、SSML(Speech Synthesis Markup Language)を使うことで、複雑な表現をすることができます。
コンテンツの人(特に編集長)は、ちゃんと音声を聞いているなら、
「シーオーラブドット」ってなんじゃい!
とツッコんでくれてたことを期待して書いてますが、SSMLを使うことでちゃんと「コラボ」と言わせることができます。(発音までは無理でした。。。)
テキストでも「コラボ」や「こらぼ」にすれば良くね?って思った方は全くその通りですが、お付き合いください。。。

"input": {
  "ssml": "<speak>
  <p>ためになることや、そうでないことまで。</p>
  <p>やりたいことオンリーな研究所。</p>
  <break time=\"300ms\"/>
  <emphasis level=\"strong\"><sub alias=\"コラボ\">「Co-Lab.」</sub></emphasis>
  </speak>"
}

上記のように”<speak>タグで囲み、音声合成マークアップ言語で書くことにより、細かい調整をすることができます。
<break time=\”300ms\”/>で間をあけ、
<emphasis level=\”strong\”>で強めに発音させ、
<sub alias=\”コラボ\”>でCo-Lab.の読み方を指定させています。

ちなみに最初の音声はこんな感じでタグを指定していました。

{
  "input": {
    "ssml": "<speak>
    <emphasis level=\"strong\">はじめまして!</emphasis>
    <break time=\"500ms\"/>
    <p><s>元フロントエンドエンジニア、現Webディレクターの大野です。</s><s>今回はGoogle Cloud Text-to-Speechについてお話ししたいと思います。</s></p>
    <break time=\"500ms\"/>
    <p>Google Cloud Text-to-Speechを使うと、自然な会話音声を合成できます。</p>
    <p>現在14の言語と方言に対応しており、30種類以上の音声を利用できます。</p>
    <p>Googleの機械学習を搭載し、高度なディープラーニングのニューラルネットワークアルゴリズムを利用して、自然な発音の音声を合成することができます。</p>
    <break time=\"1s\"/>
    <p>どんな機能があるかというと、例えば・・・</p>
    <break time=\"300ms\"/>
    <prosody rate=\"slow\">えっ?</prosody>
    <break time=\"300ms\"/>
    <p>もしかしてこの合成音声のまま、説明もするつもりかって?</p>
    <break time=\"300ms\"/>
    <prosody rate=\"slow\" pitch=\"-2st\">そ、そんなわけないじゃないですか。</prosody>
    <break time=\"200ms\"/>
    <prosody rate=\"high\">ちゃんと記事にしますよ・・・</prosody>
    <break time=\"1.0s\"/>
    <p>最後まで音声を聞いてくれた方、ありがとうございます!</p>
    <break time=\"300ms\"/>
    <p>参考になるかはわかりませんが、見ていってください!!</p>
    </speak>"
  },
  "voice": {
    "languageCode": "ja-JP",
    "name": "ja-JP-Wavenet-A"
  },
  "audioConfig": {
    "audioEncoding": "MP3",
    "pitch": "0.00",
    "speakingRate": "1.15"
  }
}

使用できるタグのリファレンスはここから確認できます。
audioタグを使えば音源を入れ込めますし、parタグを使えば一度に複数のmediaを並列に再生することができるので、BGMを流しながら発音することなんかもできます。

調整微妙ですが、歌わせることも笑

他にもあるText-to-Speechのサービス

上記で説明した以外にも、有名なText-to-Speechがあります。

  1. Amazon Polly
  2. IBM Watson Speech to text
  3. Microsoft Azure Bing Speech API

Google Cloud Text-to-SpeechとAmazon Pollyの違い

細かい違いは多々あるのですが、ざっくりと調べた感じだとこんな感じでしょうか。

男性と女性の声を選べる

現在はMizuki(女性)の声とTakumi(男性)の声があります。
Mizuki(女性)

Takumi(男性)

発音のカスタマイズができる

発音のカスタマイズとはどういうことかというと、入力されたテキストに対して発音を決められるということです。
例えば、「Co-Lab」と入力されたら、一般的な言葉ではないのでアルファベットで読んでしまうのは仕方ないですし、ユーザーが入力したテキストを喋らせるときに「コラボ」と書かせるのは難しいですよね。
しかし、レキシコンというファイルを適応させることで、単語などを登録させることができます。

下記のようにXMLで指定します。

<?xml version="1.0" encoding="UTF-8"?>
<lexicon version="1.0"
      xmlns="http://www.w3.org/2005/01/pronunciation-lexicon"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.w3.org/2005/01/pronunciation-lexicon
        http://www.w3.org/TR/2007/CR-pronunciation-lexicon-20071212/pls.xsd"
      alphabet="ipa"
      xml:lang="ja-JP">
  <lexeme>
    <grapheme>Co-Lab</grapheme>
    <alias>コラボ</alias>
  </lexeme>
</lexicon>

細かい概要はこちらから確認してください。
上の画像から生成された音声がこちら

SSMLでAmazon独自のタグが使えます。

呼吸音の追加 <amazon:auto-breaths>
ダイナミックレンジ圧縮を追加する <amazon:effect name="drc">
柔らかく発声する <amazon:effect phonation="soft">
声質の制御 <amazon:effect vocal-tract-length>
ウィスパー <amazon:effect name="whispered">

上記の中でもいい感じだったのがウィスパーですね。寝起きドッキリみたいな合成音声ができます笑

最後に

いかがだったでしょうか?
本当は、もっと色々試したかったのですが、次回の記事でお伝えできればしようと思います。
合成音声を調べているうちに気になるシステムやアプリが色々出てきました。
「Lyrebird」、「コエステーション」、「AIトーク」、「Tacotaron2」などなど、
技術は日々進化しているので、乗り遅れないように情報はきちんと追っていかなくてはいけませんね。

glasses

[227]

Webテクノロジー

© 2017 Contents Co.,Ltd.