【Amazon Polly】 Twilio さんに Mizuki さんの声で話してもらいました!

Twilio に渡す XML をほんのわずか修正するだけで、Twilio アプリの音声として Amazon Polly を使うことが可能になりました。どれだけ簡単か、簡単なコードと共にご紹介します。
2018.08.24

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

今月( 8月)の 6日に発表があったのですが、Twilio の音声合成エンジンとして Amazon Polly が使えるようになっています!

いま動いている Twilio アプリケーションで Mizuki さんがしゃべってくれるというわけで、さっそく試してみました。

Twilio 経由で Mizuki さんの声を電話越しに聞くだけであれば、無料トライアル枠でも利用可能です。弊ブログには下記のような記事もありますので、興味があれば試してみて下さい。

クラウド電話API 「Twilio」を使ってみよう#1

前提

Twilio の REST API を叩いて電話をかける場合、 TwiML と呼ばれる XML 形式のファイルを Twilio に渡さないとなりません。この XML は Twilio側から GET (あるいは POST )させる必要があるので、通常は何かしらの Web サーバなりを用意するのですけど、今回は試験なので Twilio Labs の Twimlet (echo) を使います。

以下、パラメータとしては下記を前提とします。適宜、ご自身の環境のものと読み替えてください。

項目 備考
Twilioの電話番号 (From) +8150xxxxxxxx 050-xxxx-xxxx
架電先電話番号 (To) +8190yyyyyyyy 090-yyyy-yyyy
アカウント SID ACxxxx1234xxxxEXAMPLExxxx1234xxxx1
認証トークン nnnn5678nnnn5678nnnn5678nnnn5678

まずは標準の声(Basic Voice)を聞く

まずは従来の音声の場合です。とりあえず女性の声に設定してみました。文面は上述の URL 先にある Amazon Polly の例文にしています。

<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <Say language="ja-jp" voice="woman">
      こんにちは、外国語を話せますか? 世界にはたくさんの言語があります。womanでした。
    </Say>
</Response>

この XML(TwiML)を、Twimlet echo を使って使えるように変換します。

上述した echo の URL にある TwiML: のフォームに上記の XML を貼り付けると、そのしたの Resulting URL にエンコードされた文字列が出力されます。

http://twimlets.com/echo?Twiml=%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0A%3CResponse%3E%0A%20%20%20%20%3CSay%20language%3D%22ja-jp%22%20voice%3D%22woman%22%3E%0A%20%20%20%20%20%20%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF%E3%80%81%E5%A4%96%E5%9B%BD%E8%AA%9E%E3%82%92%E8%A9%B1%E3%81%9B%E3%81%BE%E3%81%99%E3%81%8B%3F%20%E4%B8%96%E7%95%8C%E3%81%AB%E3%81%AF%E3%81%9F%E3%81%8F%E3%81%95%E3%82%93%E3%81%AE%E8%A8%80%E8%AA%9E%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82woman%E3%81%A7%E3%81%97%E3%81%9F%E3%80%82%0A%20%20%20%20%3C%2FSay%3E%0A%3C%2FResponse%3E&

こちらを Twilio に送りつけるかたちになります。curl を使って、ターミナルに貼り付けて使えるようなスクリプトで書いてみました。

(
  TWILIO_FROM="+8150xxxxxxxx"
  TWILIO_TO="+8190yyyyyyyy"
  ACCOUNT_SID="ACxxxx1234xxxxEXAMPLExxxx1234xxxx1" # アカウント SID
  AUTH_TOKEN="nnnn5678nnnn5678nnnn5678nnnn5678" # 認証トークン

  # Twimlit echo を使って生成した URL
  ECHO_URL='http://twimlets.com/echo?Twiml=%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0A%3CResponse%3E%0A%20%20%20%20%3CSay%20language%3D%22ja-jp%22%20voice%3D%22woman%22%3E%0A%20%20%20%20%20%20%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF%E3%80%81%E5%A4%96%E5%9B%BD%E8%AA%9E%E3%82%92%E8%A9%B1%E3%81%9B%E3%81%BE%E3%81%99%E3%81%8B%3F%20%E4%B8%96%E7%95%8C%E3%81%AB%E3%81%AF%E3%81%9F%E3%81%8F%E3%81%95%E3%82%93%E3%81%AE%E8%A8%80%E8%AA%9E%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82woman%E3%81%A7%E3%81%97%E3%81%9F%E3%80%82%0A%20%20%20%20%3C%2FSay%3E%0A%3C%2FResponse%3E&'

  curl -X POST https://api.twilio.com/2010-04-01/Accounts/${ACCOUNT_SID}/Calls.json \
    --data-urlencode "From=${TWILIO_FROM}" \
    --data-urlencode "To=${TWILIO_TO}" \
    --data-urlencode "Url=${ECHO_URL}" \
    -u ${ACCOUNT_SID}:${AUTH_TOKEN}
)

ECHO_URL のところが見難くて恐縮ですが、(から)までを選択してターミナルにコピペしエンターキーを叩いてください。 TWILIO_TO に指定した電話番号に電話がかかってくるかと思います。

電話に出たら、(個人的には)聞き慣れた Twilio の定番の声色でメッセージを聞くことができます。

ちなみにこちらのコードは、下記ドキュメントを参考にしました。

Mizuki さんに代わってもらう

では交代してもらいましょう。voice の指定を Polly.Mizuki に変更するだけです。

<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <Say language="ja-jp" voice="Polly.Mizuki">
      こんにちは、外国語を話せますか? 世界にはたくさんの言語があります。Polly.Mizukiでした。
    </Say>
</Response>

Twimlet echo によって変換された URL がこちらになるので、

http://twimlets.com/echo?Twiml=%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0A%3CResponse%3E%0A%20%20%20%20%3CSay%20language%3D%22ja-jp%22%20voice%3D%22Polly.Mizuki%22%3E%0A%20%20%20%20%20%20%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF%E3%80%81%E5%A4%96%E5%9B%BD%E8%AA%9E%E3%82%92%E8%A9%B1%E3%81%9B%E3%81%BE%E3%81%99%E3%81%8B%3F%20%E4%B8%96%E7%95%8C%E3%81%AB%E3%81%AF%E3%81%9F%E3%81%8F%E3%81%95%E3%82%93%E3%81%AE%E8%A8%80%E8%AA%9E%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82Polly.Mizuki%E3%81%A7%E3%81%97%E3%81%9F%E3%80%82%0A%20%20%20%20%3C%2FSay%3E%0A%3C%2FResponse%3E&

スクリプトはこうですね。変更点は ECHO_URL のところだけです。

(
  TWILIO_FROM="+8150xxxxxxxx"
  TWILIO_TO="+8190yyyyyyyy"
  ACCOUNT_SID="ACxxxx1234xxxxEXAMPLExxxx1234xxxx1" # アカウント SID
  AUTH_TOKEN="nnnn5678nnnn5678nnnn5678nnnn5678" # 認証トークン

  # Twimlit echo を使って生成した URL
  ECHO_URL='http://twimlets.com/echo?Twiml=%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0A%3CResponse%3E%0A%20%20%20%20%3CSay%20language%3D%22ja-jp%22%20voice%3D%22Polly.Mizuki%22%3E%0A%20%20%20%20%20%20%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF%E3%80%81%E5%A4%96%E5%9B%BD%E8%AA%9E%E3%82%92%E8%A9%B1%E3%81%9B%E3%81%BE%E3%81%99%E3%81%8B%3F%20%E4%B8%96%E7%95%8C%E3%81%AB%E3%81%AF%E3%81%9F%E3%81%8F%E3%81%95%E3%82%93%E3%81%AE%E8%A8%80%E8%AA%9E%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82Polly.Mizuki%E3%81%A7%E3%81%97%E3%81%9F%E3%80%82%0A%20%20%20%20%3C%2FSay%3E%0A%3C%2FResponse%3E&'

  curl -X POST https://api.twilio.com/2010-04-01/Accounts/${ACCOUNT_SID}/Calls.json \
    --data-urlencode "From=${TWILIO_FROM}" \
    --data-urlencode "To=${TWILIO_TO}" \
    --data-urlencode "Url=${ECHO_URL}" \
    -u ${ACCOUNT_SID}:${AUTH_TOKEN}
)

先ほどと同じように Twilio の API を叩いてみて下さい。Mizuki さんの声が聞こえてきたでしょうか。

男性の声がいい! という話であれば、voice の指定を Polly.Takumi にすると Takumi さんの声になります。

簡単ですね!

もちろん言語を変更すれば、Polly の他のボイスを使うことも可能です。上述した こちらの記事 を参考にしてみて下さい。

その他

コストですが、Amazon Polly の利用料金は Twilio のコストに上乗せになります。とはいえ、上述した URL からすると、非常にリーズナブルといってよい金額かと思います。

<Say>のAmazon Pollyは、100文字ごとに 0.12円で利用できます。自動ボリュームディスカウントも適用されます。

またブログによると、今後 SSML (Speech Synthesis Markup Language) にも対応していくとのことです。

まとめ

大規模な改修を伴うことなく、Twilio に渡す XML を書き換えるだけで、声色を Mizuki さんに変更することが出来ました。Basic Voice もよいですが、もし変化が欲しいということでしたら、新しい Polly の音声も検討してみて下さい。