Twilio API による Voice (IVR)、SMS のクラウド・アプリケーション開発 (.NET, C#)


環境 : Visual Studio 2013

こんにちは。

Twilio は、音声、SMS などのメッセージングを扱うことができるクラウド上のサービスで (契約ベースであり、サーバーのインストールは不要)、例えば、Microsoft Azure のアプリケーションなどと組み合わせて、音声や SMS を活用した魅力的なアプリケーションを簡単に公開できます。

ここで紹介するサンプルは、Twilio の Free Trial Account や Microsoft Azure Web App (旧 Azure WebSite) を使って、無償で構築 (開発目的に限ります) ができるので、是非、いろいろ試してみてください。(Twilio の Free Trial Account は、一定量まで無料で試せるというものです。送信先の電話番号も、決められた番号のみに発信可能です。)

なお、ここで紹介する Remote Debug などは Node.js を使っても可能です。Node.js の手順は「Twilio 開発で Azure をおすすめする理由 (ワケ)」に記載しましたので参考にしてください。

 

Twilio API の概要

Twilio API は、基本的には REST API であり、例えば、Azure Mobile App の Server Script (JavaScript) など、HTTP 通信が可能なさまざまな環境から使用できます。

実装や応答方法などは複数のシナリオがありますが、主に、以下のような手順で連携します。

1) Twilio に渡す処理は XML (TwiML) で記述し、あらかじめ、この XML を出力する URL (Web ページなど) を作成しておきます。例えば、下記の XML は「Hello World」と話すための構文です。

<?xml version="1.0" encoding="UTF-8" ?><Response><Say>Hello World</Say></Response>

2) Cloud 上の Twilio Server (https://api.twilio.com) に、Outbound Call、SMS などの処理を要求します。(ここでは、XML でなく Json を使用できます。) この際、メッセージの一部として上記ページ (TwiML) の URL を指定することで、Twilio Server が、この XML を取得します。

3) 上記 2 の処理は、送信が完了すると、すぐに返ってきます。例えば、ユーザーに電話の Call をする場合、上記 2 の HTTP 要求はすぐに完了 (成功) して返され、その後で Twilio Server からユーザーに Call されます。

4) IVR (Interactive Voice Response) のように処理が連鎖する場合には、上記の Speak が完了すると、つぎの処理 (後処理) が呼び出されます。(一般に、この後処理の URL は、上記 1 の XML の中に定義しておきます。) 後処理の URL では、上記 1 と同様、つぎの処理が XML で記述されており、Twilio Server は、つぎに、この内容を取得して処理を開始します。

5) 以降、こうして処理を連鎖していき、1 つのメッセージの流れを構築していきます。

上記 1 の XML は、自身でページそのものを構築しても良いですし、Twilio が提供する Twimlets (http://twimlets.com/message) を使用して提供することもできます。例えば、下記の URL では、上記と同じ XML の結果が返ります。(なお、この後述べるサンプルでは、この twimlets.com は使用せず、自身で XML を提供します。)

http://twimlets.com/message?Message%5B0%5D=Hello%20World

さて、この流れを REST ですべて構築すれば良いわけですが、もっと簡単にコードを作成できるよう、デモでご紹介したような .NET の API が提供されています。以降では、ASP.NET MVC 用の API (Twilio.MVC) を使ってコードを記述してみます。

なお、Azure では、Twilio との連携開発方法に関するドキュメントを提供していますので、是非参考にしてみてください。

How to use Twilio for voice and SMS capabilities from Windows Azure :

http://www.windowsazure.com/en-us/develop/net/how-to-guides/twilio-voice-and-sms-service/

 

構築手順 (サンプル コード)

では、簡単に構築してみましょう。

まず、あらかじめ、Twilio のアカウントを取得して、その際に取得した電話番号をメモしておきます。また、この後の開発のために、https://www.twilio.com/user/account (日本の場合は、https://jp.twilio.com/user/account) から、アカウントの SID と Auth Token を取得しておきます。

今回は、ASP.NET MVC を使って Twilio のアプリケーションを作成してみます。
いつものように、ASP.NET Web アプリケーションを新規作成します。(今回は、MVC のプロジェクトを作成します。)

NuGet で Twilio.MVC をインストールします。(これにより、Twilio、Twilio.TwiML など、依存するパッケージもすべてインストールされます。)

まずは、電話で Hello World としゃべってみましょう。

上述した手順に沿って、まず、Hello World と話す Twilio の XML (TwiML) を出力するアクションを ASP.NET MVC で作成します。

. . .
using Twilio;
using Twilio.TwiML;
using Twilio.TwiML.Mvc;
. . .

public ActionResult Hello()
{
  var res = new TwilioResponse();
  res.Say("Hello World");
  return new TwiMLResult(res);
}
. . .

試しにデバッグ実行などをおこない、ブラウザーで、上記のアクションにアクセスすると、下記のような XML が出力されるのがわかります。
つまり、XML をコードを使って書いているようなイメージです。

<?xml version="1.0" encoding="UTF-8" ?>
<Response>
  <Say>Hello World</Say>
</Response>

つぎに、上記の TwiML (XML) を使って Outbound Call をおこなうアクションを構築します (下記参照)。
なお、From の電話番号はアカウント作成時に割り当てられた番号を、SID と Auth Token は上記で取得した値を設定してください。

. . .

public ActionResult Test1()
{
  var cl = new TwilioRestClient(
    "AC33fc8f1a9453974. . . . .", /* SID */
    "0616df6e895ebd9a5. . . . ." /* Auth Token */);
  CallOptions ops = new CallOptions();
  ops.From = "+81333333333"; // Your twilio phone number
  ops.To = "+819011111111";
  ops.Url = Url.Action("Hello",
    null,
    null,
    Request.Url.Scheme);
  var call = cl.InitiateOutboundCall(ops);
  return View();
}
. . .

以上で完了です。
この Test1 のアクションにアクセスすると、+819011111111 に電話がかかり、「Hello World」と話して電話が切れます。

ちなみに、Twilio の Trial Account (無料) を使用している場合は、上記の To の電話番号には登録した Verified Number しか指定できないので注意してください。(Twilio のアカウント管理画面で、[Numbers] – [Verified Caller IDs] を選択して確認できます。)

また、本日のデモでは日本語を使用しましたが、日本語で「こんにちは」と話す場合は、以下の通り記述します。(これにより、上記の XML の <Say> に language=”ja-jp” の属性が追加されて、<Say language=”ja-jp”> となります。)

var res = new TwilioResponse();
res.Say("こんにちは。",
 new
 {
  language = "ja-jp"
 });

 

デバッグ (Debug) について

さて、このアーキテクチャからお分かりの通り、動作確認の際、localhost (IIS Express 等) でデバッグ実行しても正しく動作しません。Twilio Server が localhost 上の URI (上記の Hello アクション) を Call できないためです。こんなときには、デモでお見せしたように、Azure に発行するなどして動作確認できます。(今回のような動作確認の用途で 1 インスタンスで使用するだけなら、Azure Web App は無料です。)

また素敵なことに、最新の Azure SDK 2.2 以上を使用すると、簡単な設定で Remote Debug まで出来てしまいます。そう、localhost から、クラウド上で実行しているこのアプリケーションを Remote Debug できます。ここ、大事なので 2 回書いてみました。。。(Remote Debug の方法については、こちら を参照。)

なお、localhost でどうしてもデバッグをおこないたい場合は、例えば、TwiML だけをリモート (クラウド) に発行し、呼び出しの箇所 (上記コードの InitiateOutboundCall) を localhost でデバッグするなど工夫することでデバッグが可能です。また、Exception が返らない場合は、Fiddler などを使って、どのような Response が返っているか見てみると良いでしょう。(Exception が発生せず、InitiateOutboundCall が null になってしまう場合でも、HTTP でエラーが返ってきている場合があります。)
また、もし応答が返ってこない場合は、https (SSL) で確認してみてください。(Azure Web Sites の既定の証明書を使って、https もすぐに使用できます。)

 

IVR (Interactive Voice Response)

Lync の音声開発で紹介したような応用開発も可能です。例として、業務アプリでありがちな IVR (Interactive Voice Response) のアプリケーションを構築してみましょう。

例えば、下記のコードは、ボタンが押されると電話が Call され、以下のような音声対話がおこなわれます。(動作確認の際は、下記コードの Test2 のアクションを実行してください。)

Twilio : “Hello.”
Twilio : “If you are a developer, press 1. If you are a it pro, press 2.”
User : <press 1>
Twilio : “You are a developer.”

. . .

public ActionResult Test2()
{
  var cl = new TwilioRestClient(
    "AC33fc8f1a9453974. . . . .",
    "0616df6e895ebd9a5. . . . .");
  CallOptions ops = new CallOptions();
  ops.From = "+81333333333";
  ops.To = "+819011111111";
  ops.Url = Url.Action("InteractiveHello",
    null,
    null,
    Request.Url.Scheme);
  var call = cl.InitiateOutboundCall(ops);
  return View();
}

public ActionResult InteractiveHello()
{
  var res = new TwilioResponse();
  res = res.BeginGather(
    new
    {
      action = Url.Action("RespondToUser",
        null,
        null,
        Request.Url.Scheme),
      numDigits = "1"
    });
  res = res.Say("Hello.");
  res = res.Say("If you are a developer, press 1.");
  res = res.Say("If you are a it pro, press 2.");
  res = res.EndGather();
  res = res.Say("Sorry, I didn't get your response.");
  return new TwiMLResult(res);
}

public ActionResult RespondToUser()
{
  int userinput = int.Parse(Request["Digits"]);
  var res = new TwilioResponse();
  if (userinput == 1)
    res.Say("You are a developer.");
  else
    res.Say("You are a it pro.");
  return new TwiMLResult(res);
}
. . .

Test2 から (Twilio Server を経由して) InteractiveHello を呼び出し、ユーザーが応答すると、(Twilio Server を経由して) RespondToUser が呼ばれます。このように、actoin 属性を使用して、どんどん会話をつないでいくことができます。
なお、上記の InteractiveHello のコードでは、XML に<Gather>. . .</Gather> が出力されますが、これがユーザーの応答を収集するためのマークアップになります。(実際に、この URL にブラウザーなどでアクセスして、どんな XML が出力されているか確認してみてください。)

 

さまざまな応用

この他に、Lync 同様、Play / Record も可能です。(TwiML では、<Play>, <Record> を使用します。) 特に、Play は、発音が強制できない場合や、独自の声を提供したい場合などにも使用できるでしょう。また、ユーザーの入力に応じて、別の担当者 (電話番号) へ接続をおこなう、いわゆる転送も可能です。(<Dial> を使用します。) 例えば、ユーザーの選択に応じて、必要なオペレーターに繋ぐことができます。さらに、英語だけみたいですが、Speech-to-Text エンジンによる音声認識も可能です。(Record で transcribe 属性を指定します。ただし、この機能を使用すると charge が発生するそうです。)
このように、Twilio は、よくある Messaging solution で必要な多くの API セットを提供しています。

また、メッセージング以外のシナリオでも使用できます。例えば、二要素認証 (多要素認証) で使用できます。
ご存じの通り、最新の Windows Server Active Directory や Azure Active Directory では、PhoneFactor による多要素認証との連携が可能です。そもそも認証基盤に Azure Active Directory などを使用している場合には、この PhoneFactor ベースの多要素認証 (こちら を参照) を使用することで既定の Azure Active Directory のログイン画面などにも自然な形で統合されます。(また、API を使って、カスタムに電話による認証を呼び出すこともできます。)
しかし、例えば、これら (Active Directory) と無関係に独自な方式と多要素認証を組み合わせる場合や、普通にログインをおこなって、特定の操作の際だけ多要素認証をおこなうケースなど、こうしたカスタムな組み込みが必要な場合には、ここで紹介した Twilio を使用すると良いでしょう。
例えば、Web アプリケーションで電話ベースの多要素認証を組み合わせるような場合、以下の通り実装できるでしょう。

  • Web アプリケーション側で、PIN (またはパスワード) などの文字列を生成する (Web アプリケーションでは、この内容をおぼえておく)
  • Twilio の Outbound Call で、この PIN をユーザーのデバイスに通知する
  • Web ページにその PIN を入力させて、同一性 (一致) を確認する

また、その他のシナリオとして、簡単な会議なども Twilio で実装できます。
こうした詳細は、サンプル コードも落とせるようですので、是非、下記の How-To を参照してみてください。

[twilio docs] HowTos

http://www.twilio.com/docs/howto

 

※ 変更履歴

2015/03/26  Azure WebSite から Azure Web App に名称変更

 

Comments (0)

Skip to main content