とあるWeb屋の備忘録

とあるWeb屋の備忘録。たまに雑記。

Twilio + Node.jsで自動音声を流す1

昨年あたりにテレビとスマホの連動企画が流行って色々な施策が世に登場しましたが、その中のひとつに、CMやドラマの役者が持っているスマホの電話番号が画面に映り込み、その番号に電話すると実際に役者が電話に出てくれるっていう施策がありました。

これはおそらくKDDIがやってるTwilioっていうプラットフォームで実装できそうなので自分でもやってみます。

Twilioについて

KDDIがやっているプラットフォームサービス(Paas)
電話をかける、電話をうける、SMS通知などを操作するAPIがそろっていて、簡単にアプリケーションとこれらの機能を連携させることができます。
例えばコールセンターに代表されるような、電話のプッシュダイヤル操作なども作れます。
無料トライアルも用意されているので簡単に試すことができます。
Twilioのホームページはこちら
https://twilio.kddi-web.com/

Twilio登録方法

f:id:tmykndr:20180718234702p:plain 1. Twilioのトップページかからサインアップ(右上)クリック


f:id:tmykndr:20180718234706p:plain 2. 利用規約とプライバシーポリシーにチェックを入れて「同意してサインアップ」クリック(チェック入れる前はグレーアウトしています)


f:id:tmykndr:20180718234710p:plain 3. 項目を埋めて「はじめる」クリック


f:id:tmykndr:20180718234713p:plain 4. 本人確認用に電話番号を入力して「Verify」クリック。SMSで認証コードが送られてきます


f:id:tmykndr:20180718234716p:plain 5. 認証コードを入力して「Submit」クリック


f:id:tmykndr:20180718234719p:plain 6. このアカウントで使用するプロジェクト名を入力して「続ける」クリック。プロジェクト名はマイページに「プロジェクト名+ダッシュボード」の形で記載されます。


f:id:tmykndr:20180718234723p:plain 7. マイページが表示されます。登録お疲れ様でした。


Twilioの電話番号から発信させる方法

まず、一番単純なかたちで、メッセージをしゃべらせてみようと思います。
Twilioが用意しているREST APIを使ってTwilioの電話番号から自分宛に電話をかけてみます。
Twilioに登録するとaccountSidとauthTokenが発行されるので、こちらを使ってユーザー認証します。(これらは自分のダッシュボードから確認できます。)

const twilio = require('twilio');
const accountSid = '自分のaccountSid';
const authToken = '自分のauthToken';
const client = twilio(accountSid, authToken);

今回しゃべらせる言葉はテキストでソース上にそのまま記述していきます。

const word = "今年の夏は猛暑でつらいですが頑張ってください。";

次にやることは、TwimlというTwilioが用意しているXMLで、実行したい処理を指定します。
TwiMLは電話やSMSを受信したときにどういう動作をさせるかを指定するマークアップ言語です。
TwiMLについての詳細はこちら

今回、メッセージを読み上げたいので、TwiMLsayメソッドを使います。
少しまえに某凄腕 腐女s 美人エバンジェリストがGoogleHomeを筋肉ボイス化しておりましたが、ここは普通の女性の声でしゃべっていただきたいのでvoicewomanに指定します。
languageをしゃべらせたい言語に指定することで各国の言葉にも対応しています。  

var twiml = '<Response><Say voice="woman" language="ja-jp">' + word + '</Say></Response>';

ここまで終わりましたら、処理を指定したTwiMLを実際にしゃべらせてみます。
そのためにやることはアウトバウンドコール(架電)を作成することです。

アウトバウンドコールを作成するため指定する項目が3つあります。
* 自分の携帯電話番号
* Twilioアカウントを作成した後に取得できるTwilio電話番号
* 作成したTwiMLをTwilioで用意している「Echo」という機能を使ってurlにセット

「Echo」機能は、http://twimlets.com/echo?Twiml="返したいTwiMLといった形式でリクエストすると、TwiMLを返してくれます。
「Echo」機能についてはTwilio LabsにTwiMLジェネレータという便利なものもあります。
Twilio Labs

ここで1点気を付けるポイントがあって、Echoでリクエストするときにクエリをパースする必要があります。
そのためにquerystringを使います。以下のようにquerystringを追加します。

const twilio = require('twilio');
const accountSid = '自分のaccountSid';
const authToken = '自分のauthToken';
const client = twilio(accountSid, authToken);
const querystring = require('querystring');

追加したら、実際にパースして指定します。
querystring.escape(twiml)で、escapeを使って指定された文字列に対してURLパーセントエンコーディングをかけます。

client.calls.create({
    to: '+818012345678',
    from: '+815012345678',
    url: 'http://twimlets.com/echo?Twiml=' + querystring.escape(twiml)
}, function (err, responseData) {
    if(err) throw err;
    console.log(responseData.from);
});

これで完了です。
ソースはこんな感じです。

//outboundCall.js

const twilio = require('twilio');
const accountSid = '自分のaccountSid';
const authToken = '自分のauthToken';
const client = twilio(accountSid, authToken);
const querystring = require('querystring');

const word = "今年の夏は猛暑でつらいですが頑張ってください。";
var twiml = '<Response><Say voice="woman" language="ja-jp">' + word + '</Say></Response>';

client.calls.create({
    to: '+818012345678',
    from: '+815012345678',
    url: 'http://twimlets.com/echo?Twiml=' + querystring.escape(twiml)
}, function (err, responseData) {
    if(err) throw err;
    console.log(responseData.from);
});

それではコンソールを出して以下のコマンドを実行します。

node outboundCall.js

これで携帯電話に電話がかかってきます。
いかがでしょうか。これで今年の猛暑も乗り越えられること間違いなしですね。

無料トライアル版だと電話応答時に数秒間広告が流れますが、有料版では流れません。
簡単にですが、以上でTwilio+Node.jsでのアウトバウンドコール作成は完成です。

ご指摘などあれば大歓迎で受け付けております!!!よろしくお願いします!!!