環境 : 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. . . . .", "0616df6e895ebd9a5. . . . ." ); 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 に名称変更
Categories: Uncategorized
1 reply»