「Twilio」で電話をかけてみた

自動で電話をかけたいな。
という話で、Twilioをトライアルしてみました。
要件としては架電して相手に日本語で要件を連絡、通話できたかを判定して・・・というところです。

Twilioにアカウントを作成し、ダッシュボードで電話番号を取得します。
DOCを参照しながら、とりあえず試すだけなので、Javaで適当に書いていきます。
基本的なところは、下記を参考にさせて頂きました。

[blogcard url=”https://qiita.com/mosin_nozomi/items/d30811022f1a19e620e0″]

SMSの発信や電話をかけるところまでは特に問題ありませんでしたが、上記サイトの内容とは現時点で変わっているのか、なかなか日本語を喋ってくれません。
あと、トライアル着信の「アカウントをアップグレードしてね」文句の後に何か押さなくてはいけないというのも暫くして気が付きました。。

どうしたら日本語を喋ってくれるのかと、ドキュメントを見ながらaliceとかを試してみたりしましたが、何かゴニョゴニョ言ってるけど何を言っているのか不明。。
結果的にダッシュボード左メニューのサービス→Programmable Voice→TwiML→テキスト音声変換のText-to-Speechという所に日本語はMizukiだと書いてあったので、やってみるとやっと喋ってくれました。ありがとうMizukiさん。

あと、TwiMLをインターネット上のURLからPOSTで取得できるようにしておく、という謎の制約もかなり厄介だったのですが、こちらも結果的に下記のようにすると必須では無かったようです。

import com.twilio.Twilio;
import com.twilio.rest.api.v2010.account.Call;
import com.twilio.type.PhoneNumber;
import com.twilio.type.Twiml;

public class Example {
    public static final String ACCOUNT_SID = "ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
    public static final String AUTH_TOKEN = "your_auth_token";

    public static void main(String[] args) throws Exception {
        Twilio.init(ACCOUNT_SID, AUTH_TOKEN);
        String callText = "お疲れ様です。了解頂けましたら、了解の旨を応答頂けますでしょうか?";
        String TwiMLstr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><Response><Say language=\"ja-JP\" voice=\"Mizuki\">"
                + callText + "</Say><Pause length=\"10\"/><Say language=\"ja-JP\" voice=\"Mizuki\">それでは宜しくお願いします。</Say></Response>";
        Twiml TwiML = new Twiml(TwiMLstr);

        Call call = Call.creator(new PhoneNumber("+81登録した電話番号"), new PhoneNumber("+取得した電話番号"), TwiML).create();

        String id = call.getSid();
        for(int i = 0 ; i < 10 ; i++){
            Thread.sleep(1000*5);
            call = Call.fetcher(id).fetch();
            if(call.getStatus() == Call.Status.RINGING ||
                call.getStatus() == Call.Status.IN_PROGRESS ||
                call.getStatus() == Call.Status.QUEUED){
                continue;
            }
            else if(call.getStatus() == Call.Status.COMPLETED){
                //着信OK
                System.out.println("Call Completed " + call.getAnsweredBy());
            }
            else{
                break;
            }
        }
        System.out.println(call.toString());
    }
}

とりあえず要件は満たせそうです。
通話判定はもっとケースが必要ですし、判定待ちをもっとましな形にしたいところですが、トライアルなのでここまで。

ランニングコストがOKになって実際に導入すると決まったら、もうちょっと調べないとですね。

カテゴリー: Java