TwiML Binsを利用して着信時にメッセージを流す方法

2025年5月23日掲載

キービジュアル

ご覧いただきありがとうございます。Twilioプロダクトチームです。

今回は、Twilioからの着信に応答した際に、自動音声を再生する処理をTwiMLで実装する方法を紹介します。電話の自動応答システムは色々なシステムで利用されていますが、TwiMLを利用することで簡単にカスタマイズ可能な自動応答を構築できます。さらに、TwiML内で変数を使って、再生するメッセージの内容を一部動的に変える方法もあわせて扱います。

目次

Twilioとは

Twilioとは、電話やSMS・ビデオ・チャットなど世の中にあるさまざまなコミュニケーションチャネルをWeb・モバイルアプリケーションへ組み込むクラウドコミュニケーションプラットフォームです。従量課金制のため、コンタクトセンターや新規ビジネスをスモールスタートで構築することが可能です。

TwiMLとは

TwiMLはTwilioが提供する機能の一つで、着信通話またはSMSを受信したときに何を実行するかを指示するXMLベースのマークアップ言語です。自動音声メッセージの再生や転送といったシンプルな応答を定義できます。またTwiMLにはURLが割り振られているため、他のシステムからURL経由で処理を呼び出すこともできます。

加えて、Twilioの管理画面から簡単にTwiMLを作成・保存できる「TwiML Bins」という機能もあります。TwiML Binsは、TwiMLの内容をTwilio側でホスティングしてくれる仕組みで、サーバーを用意しなくてもすぐに使えるのが特長です。

TwiMLについてさらに詳しく知りたい方は、Twilioの公式ドキュメントをご覧ください。

今回構築するシステム

Twilioの電話番号からユーザーの電話番号宛に発信し、相手が通話に応答したタイミングで自動音声メッセージを再生します。
本実装における主な要件は以下の通りです。

  • 発信元の電話番号は、Twilioで購入した050番号を使用します。
  • 自動音声メッセージの内容は「○○さん、緊急事態が発生しました」です。

メッセージ中の「○○さん」の部分は、変数として動的に設定できるようにします。

電話番号の購入方法が分からない方は、Twilio上で日本とアメリカの電話番号を購入する方法(2025年1月版)を参照し、050番号を購入してください。

実装方法

今回は、以下の2つの方法で実装を行います。

  1. Twilioコンソールを使用する方法
    Twilioコンソール上でTwiMLを設定し、そのTwiMLのURLを経由して電話を発信し、自動音声メッセージを再生する処理を構築します。

  2. コンソールを使用せずコード内でTwiMLを記述する方法
    Twilioコンソールを使用せず、コード内にTwiMLの処理を記述することで、電話の発信および自動音声メッセージの再生を実現します。

最後に、それぞれの方法で実装した処理について動作確認を行います。

Twilioコンソールを利用した実装方法

1.Twilioコンソールにログインします。

2.TwiML Binsをアカウントダッシュボードに固定します。

3.My TwiML binsにアクセスし、プラスボタンをクリックします。

4.「Friendly Name」に適当な名前を付けて、処理内容を書き込んで保存します。今回は自動音声を流す処理にします。

処理内容は下記をコピーして貼り付けてください。

<?xml version="1.0" encoding="UTF-8"?>
<Response>
 <Say language="ja-jp"></Say>
    <Pause length="3"/>
        <Say language="ja-jp">{{name}}緊急事態が発生しました。</Say>
</Response>

TwiMLのURLは後ほど使用するので、コピーしてメモなどに保存してください。

4.エディターを開いて下記コードを記載します。

const accountSid = 'アカウントSID'; // 自身のアカウントSID
const authToken = 'AuthToken'; // 自身のAuthToken
const client = require('twilio')(accountSid, authToken);

// 電話で使うユーザー名をエンコード(URLで使える形式に変換)
const encodeUserName = encodeURIComponent('鈴木一郎さん');

// 通話を作成(TwilioのAPIを使って電話をかける)
client.calls
      .create({
        // 通話中に実行されるTwiMLのURLにエンコード済みのユーザー名を追加
        url: 'TwiMLでコピーしたURL' + encodeUserName,

        // 通話の宛先電話番号(E.164形式で記載、例: +819012345678)
        to: '送り先電話番号',

        // 発信元の電話番号(Twilioで取得した番号を使用)
        from: '送り元電話番号'
      })
      .then(call => console.log(call.sid));

上記は、発信処理のサンプルコードになります。

送り先と送り元の電話番号は、国際電話形式(E.164形式)で入力してください。
たとえば「080」から始まる番号は「+8180〜」、「090」の場合は「+8190〜」のようになります。

コードを実行し、指定した相手の電話に着信し、「鈴木一郎さん、緊急事態が発生しました。」と自動音声が流れれば成功です。

Twilioコンソールを利用しない実装方法

今度はコンソールでTwiMLの設定をせず、foreachを使って複数人に対して自動で架電する処理を実装してみます。

名前・電話番号・場所の情報を連想配列にまとめておき、ループの中で1人ずつに対して電話をかけ、それぞれに異なるメッセージを動的に再生させるようにします。

1.エディターを開いて下記コードを記載します。

const accountSid = 'アカウントSID';//自身のアカウントSID
const authToken = 'AuthToken';//自身のAuthToken
const client = require("twilio")(accountSid, authToken);

// 発信元の電話番号(Twilioで取得したもの)
const fromNum = "送り元電話番号";

// 通知対象者のリスト(名前、電話番号、場所を含む)
const lists = [
  { name: "田中太郎さん", phoneNum: "送り先電話番号1", place: "第一倉庫" },
  { name: "佐藤二郎さん", phoneNum: "送り先電話番号2", place: "第二倉庫" },
];

// 各通知対象者に対して電話をかける処理
lists.forEach(function (value) {
  client.calls
    .create({
      // 通話時のメッセージ内容を設定(日本語で再生)
      twiml:
        '<Response><Say language="ja-jp"></Say><Pause length="3"/><Say voice="alice" language="ja-jp">' +
        value.name +
        "緊急事態が発生しました。" +
        value.place +
        "まで来てください。 </Say></Response>",

      // 通話の宛先(対象者の電話番号)
      to: value.phoneNum,

      // 通話の発信元(Twilioの電話番号)
      from: fromNum,
    })
    .then((call) => console.log(call.sid));
});

それぞれの送り先番号に着信し、「田中太郎さん、緊急事態が発生しました。第一倉庫に来てください。」や「佐藤二郎さん、緊急事態が発生しました。第二倉庫に来てください。」といった個別の自動音声メッセージが正しく再生されれば、処理は成功です。

まとめ

今回はTwiML Binsを利用して、着信時に特定のメッセージを流す処理とメッセージの内容を動的に変える方法を紹介しました。

変数を使ってメッセージを動的に変更することで、「営業時間外の案内を曜日によって変える」「特定の発信者にだけ別の案内を流す」といった実装も、今回のコードをベースに簡単に実現できます。Twilioのホームページにはドキュメントも載っているので、参考にしながら実装してみてください。

また、Twilio APIを活用した他の実装方法や、電話番号の購入方法についても別の記事で紹介していますので、ぜひ合わせてご覧ください。

関連サービス

Twilioは、電話、SMS、ビデオ、チャットなど、多様化するお客さまとのコミュニケーションチャネルを1つにつなぐクラウドコミュニケーションAPIです。

おすすめの記事

条件に該当するページがございません