2023年5月1日を持ちまして、株式会社KDDIウェブコミュニケーションズのTwilioリセール事業が終了したため、本記事に記載されている内容は正確ではないことを予めご了承ください。
はじめに
この記事は、中京テレビハッカソン(Hack-Chu)2018で要望があったため作成したサンプルです。
実行するためには、Twilioのアカウントと、AITalkのアカウントが必要です。
Twilio Functionsとは
Twilio Functionsは、Node.jsで書かれたコードを、Twilioのサーバー上で実行するためサーバーレスアーキテクチャです。
Twilioの管理コンソールのRuntimeメニューの中に、Functionsというメニューがあるので、その中から作成します。
AITalkとは
WEBサービスなどから、高品質音声合成エンジンAITalk®をSaaS型で利用できるサービスです。感情も表現することができるため、単調な音声合成のイメージを覆す表情豊かな音声読み上げが実現できます。
TwilioのTTS(Text to Speech)は日本語がイケてないので、AITalkさんのサービスを使うケースは有効です。
今回ご紹介するのは、話したいメッセージをAITalkを通じて流暢な音声にしてTwiMLを生成するものになります。
生成したFunctionsのPATHを呼び出すことで、TwiMLを返すことができます。
サンプルコード
exports.handler = function(context, event, callback) {
const text = event.text || "とても残念なお知らせです。"; // 話させたいメッセージ
const emotion_j = event.j || "0.0"; // 喜び(0.0〜1.0)
const emotion_s = event.s || "1.0"; // 悲しみ(0.0〜1.0)
const emotion_a = event.a || "0.0"; // 怒り(0.0〜1.0)
const username = "XXXXXXXX"; // AITalkのユーザID
const password = "XXXXXXXX"; // AITalkのパスワード
let mp3Url = "http://webapi.aitalk.jp/webapi/v2/ttsget.php?username="+username+"&password="+password
mp3Url += "&speaker_name=maki_emo&ext=mp3&text=" +encodeURIComponent(text)
mp3Url += "&style="+encodeURIComponent('{"j":'+emotion_j+', "s":'+emotion_s+', "a":'+emotion_a+'}');
const twiml = new Twilio.twiml.VoiceResponse();
let playParams = {};
playParams.loop = 1; // 再生回数(デフォルトは1、0なら無限ループ)
twiml.play(playParams, mp3Url);
callback(null, twiml);
};
Functionsの実行は、Functionsを生成したときのPATH欄で指定したURLを実行します。
今回のサンプルでは、以下のパラメータを指定することも可能になっています。
パラメータ | 内容 |
---|---|
text | 再生させたいメッセージ |
j | 感情(喜び) 0.0〜1.0の範囲で指定 |
s | 感情(悲しみ) 0.0〜1.0の範囲で指定 |
a | 感情(怒り) 0.0〜1.0の範囲で指定 |
生成されるTwiMLはこんな感じになります。
<Response>
<Play loop="1">
http://webapi.aitalk.jp/webapi/v2/ttsget.php?username=XXXXXXXX&password=XXXXXXXX&speaker_name=maki_emo&ext=mp3&text=%E3%81%A8%E3%81%A6%E3%82%82%E6%AE%8B%E5%BF%B5%E3%81%AA%E3%81%8A%E7%9F%A5%E3%82%89%E3%81%9B%E3%81%A7%E3%81%99%E3%80%82&style=%7B%22j%22%3A0.0%2C%20%22s%22%3A1.0%2C%20%22a%22%3A0.0%7D
</Play>
</Response>
こんな感じです。
Happy Hacking!