Twilioブログ

TwilioとReadSpeaker(TTS・音声合成エンジン)の連携方法

こんにちは、Twilio事業部のkatsu.tです。

Twilioでは2種類の音声合成エンジンを提供していますが、お客様からしばしばこのようなお声をいただきます。

  • 既存の音声合成エンジンだとイメージしている声を再現できない。
  • 日本語をうまく読み上げてくれない。
  • ほかの音声合成エンジンを使ってIVRを作りたい。

そこで本記事では、別のTTS(音声合成エンジン)をTwilioに連携させる方法をご紹介いたします。

ちなみに今回Twilioと連携させるのは、株式会社HOYA様が提供する「ReadSpeaker。テレビ番組のナレーションにも起用されている、流暢な日本語に定評がある音声合成エンジンです。

※ReadSpeakerをIVRとして利用している事例はこちら

Twilioで提供している音声合成エンジンのご紹介

Twilioでは、”Basic”と”Amazon Polly”という2種類の合成音声エンジンを提供しています。
下記音声合成エンジンはTwilio標準でご利用いただけます。

  • Basic
    • 無料で利用できる
    • 利用できる音声は man/woman/aliceの3種類
  • Amazon Polly
    • Amazon製品で利用されている音声合成エンジン
    • 有料で利用できる
    • SSMLを利用可能

「ReadSpeaker」のご紹介

ReadSpeakerは株式会社HOYA様が提供している高品質の音声合成ソフトウェアです。多彩な感情表現を実現し、人間に近い音声を作成できます
また日本語だけでなく、英語をはじめとした多言語で音声を作成することが可能。ナレーション作成やシステム組込、Web読上げなど、さまざまな用途で利用することができます。

連携の事前準備

TwilioとReadSpeakerの連携方法

TwilioとReadSpeakerの連携は、以下の流れで行います。

  1. Twilio Functionsの準備
  2. 音声データを返却するAPIの作成
  3. 「音声を再生するTwiML」を返すAPIの作成

※本記事ではTwilio Functions(Nodejs)を利用した連携方法をご紹介いたします。

音声データを返却するAPIを作成する理由

ReadSpeaker APIはwav形式の音声データを返却し、認証にはベーシック認証を利用しています。
TwilioのPlay動詞はwav形式の音声ファイルにも対応している(※詳しくはこちら)ため、ReadSpeakerのAPIをPlay動詞に直接埋め込むことも可能です。

しかしPlay動詞にAPIキーを含んだReadSpeakerのクエリを直接埋め込むと、下記画像のように、APIキーが表示されている状態でTwilioにコールログが残ってしまいます。

APIキーを隠蔽し、かつTwilio以外からのリクエストを受け付けないようにするために、本記事では音声データを返却するAPIをTwilio Functionsを用いて作成します。


※Functionsでは、Twilioからの正式なリクエストのみ受け付ける設定を行えます。
※詳細についてはこちらをご覧ください。

Twilio Functions の準備

上記の理由から、まずはTwilio Functionsを利用して音声バイナリを返却するAPIを作成します。

新規Serviceの作成

まず初めに、利用するTwilio Functionsの”Service”を作成します。

1.All Services & Productsを開き、Functionsをクリックします。

2.”Create Service”をクリックして、新しいサービスを作成します。

3.サービスに任意の名前をつけて、”Next”をクリックします。

以上で、新規Serviceの作成は完了です。

パッケージの追加

今回はReadSpeakerのSDKを利用するため、必要なSDKを追加します。

1.Settingsの”Dependencies”をクリックします。

2.Moduleに”voicetext”と記入して、”Add”をクリックします。

※Versionに指定がある場合は、Versionを入力後”Add”をクリックします。

※本記事ではReadSpeakerのユーザーが提供しているNodejsのSDKを利用します。
※各言語のSDKはこちら

※公式APIリファレンスはこちら

以上で、パッケージの追加は完了です。

環境変数の設定

Function内で利用する環境変数を設定します。

1.Settingsの”Dependencies”をクリックします。

2.ReadSpeakerのAPIキーを”READ_SPEAKER_KEY”という変数名で設定し、”Add”をクリックします。

以上で、環境変数の設定は完了です。

②音声データを返却するAPIの作成

音声データを返却するAPIを作っていきます。

1.Functionを作成します。”Add+”をクリックして、”Add Function”を選択します。

2.任意のFunction名をつけて、Enterキーを押します。

3.作成したFunctionのアクセス制限がProtectedになっていることを確認してください。
※Protectedにしておくことで、署名されているリクエストのみ受け付けるようになります。

アクセス制限

制限

Private

FunctionsのService内からのみリクエストを受け付けます。

Public

制限なし。

Protected

リクエストにX-Twilio-Signatureヘッダーが含まれ、署名が有効な場合のみ受け付けます。

3.下記ソースコードを貼り付けて”Save”をクリックします。

var VoiceText = require('voicetext');

exports.handler = function(context, event, callback) {

    voice = new VoiceText(context.READ_SPEAKER_KEY);
    voice.speaker(voice.SPEAKER.HIKARI)
    .speak('お電話ありがとうございます。ケーディーディーアイウェブコミュニケーションズでございます。ご用件をお伺いいたします。', (e, buf) => {
        const response = new Twilio.Response();
        
        response.setBody(buf);
        response.appendHeader('Content-Type', 'audio/wav');
        response.appendHeader('Content-Length', buf.size);
        
        callback(null, response);
    });
};

以上で、音声データを返すAPIは完成です。

③「音声を再生するTwiML」を返すAPIの作成

最後に、「前項②で作成したAPIを埋め込んだTwiML」を返すAPIを作っていきます。

1.Functionを作成します。”Add+”をクリックして、”Add Function”を選択します。

2.任意のFunction名をつけて、Enterキーを押します。

3.作成した音声データを返すAPIの三点リーダーをクリックして、”Copy URL”を選択します。
※次の手順で利用するのでメモをとっておいてください。

4.下記ソースコードを貼り付けて”Save”をクリックします。

exports.handler = function(context, event, callback) {
  let twiml = new Twilio.twiml.VoiceResponse();
  twiml.play('手順3でコピーしたURL');
  return callback(null, twiml);
};

5.最後に”Deploy All”をクリックします。

以上で準備は完了です。
さっそく、作ったTwiMLを返すAPIを設定してみましょう!

電話番号に作ったAPIの設定方法

購入済みの電話番号の設定を開き、作成したTwiMLを返すAPIを設定します。


”A CALL COMES IN”の項目に
Function -> ご自身で作ったFunctionのService名 -> ui -> TwiMLを返すAPI名
を設定して、最後に画面下の”Save”をクリックしてください。

以上ですべての設定が完了です。
ぜひ、ReadSpeakerの素晴らしい音声合成のIVRに電話をかけてみてくださいね!

まとめ

本記事で紹介した方法は、別のTTSでも利用することが可能です。
TwilioのIVRに「〇〇が利用しているTTS」を利用したいなどございましたら、ぜひ本記事を参考に作ってみてください!

アプリケーションエンジニア 葛 智紀
アプリケーションエンジニア 葛 智紀

前職でiOS、Androidのネイティブアプリケーション開発、AngularやLaravelを用いたウェブアプリケーション開発に従事。KDDIウェブコミュニケーションズではTwilioの最新情報の発信やTwilioを用いた地域課題解決を担当。 個人では、Google Developer Group Tokyoのオーガナイザーを務める。

CTA_まずはtwilioを使ってみる。

Share!!

  • お役立ち情報
  • イベント情報
  • 相談会申込
  • 導入事例