フリー・エンジニア
高橋隆雄 フリー・エンジニア
高橋隆雄

 Asteriskは単なるPBXではなく“音声サービスのプラットフォーム”である,ということを筆者は事あるごとに主張してきた。そこで今回は,実際のIVR(音声自動応答装置)のメニューを作ってみることで,その能力がどのようなものであるかをみてもらうことにしよう。

 最初に私事で恐縮だが,筆者が講演するAsteriskに関するセミナーの告知をしたい。10月26日に筆者は「オープンソースPBX『Asterisk』の今―使用例,適用分野を徹底解説」と題して講演する。携帯電話とAsteriskを組み合わせたシステムなども紹介する予定である。関心のある方はぜひ足をお運びいただきたい。参加費は無料である(詳細はこちら)。

 さてIVRの場合,当然ながら音声のガイダンス(トーキー)が必要となる。Asteriskは標準で音声データを持っているため,ある程度であればこれらを使ってIVRを実現することは可能だ。自社向けの特殊な音声が必要な場合などは,他の音声との整合性を取りながら作らなくてはならないため,音声データのために費用がかさむという欠点がある。だが,前回紹介したAquesTalkのような音声合成を使えば,かなり低コストで実現できる。

コンテキストの作成

 Asteriskの場合,ダイヤルプランであるextensions.conf(関連記事)には色々なことを記述できるが,すべてを同一のコンテキスト内で収めようとすると様々な弊害も発声する。例えば次の例である。

[default]

exten => 201,1,Dial(SIP/201)

exten => 202,1,Dial(SIP/202)

exten => 10000,1,Answer()
exten => 10000,n,PlayBack(....

 IVRのメニューとして内線番号10000を使うように定義したのが上の記述である。この場合,IVRのメニューとしてもちろん動作するが,IVR側でダイヤルされるDTMF(プッシュ入力)が,どう挙動するかに注意しなくてはならない。

 Asteriskの場合,DTMFでプッシュされた内容はexten =>と解釈され,自動的に処理がジャンプする。上の例では,201や202がダイヤルされると処理はそちら側に移る。内線10000を使うように定義しても,このIVRメニューからは内線の201と202に到達可能となる。もし[default]コンテキストを内線処理に使っているのであれば,外線から着信したIVRの“ユーザー”は,結果的にどの内線番号にでも到達することが可能で,誰とでも通話可能となる。こうした混乱を防ぐためには,IVRメニュー用のコンテキストを分割する。

[default]

exten => 201,1,Dial(SIP/201)

exten => 202,1,Dial(SIP/202)


[ivr-menu]

exten => 202,1,Dial(SIP/202)

exten => 10000,1,Answer()
exten => 10000,n,PlayBack(....

 このように記述すれば処理はコンテキスト内で行われるため,IVRのユーザーからダイヤルできる先は202の内線だけとなる。

 ただし,内線側からもIVRを試したい,というケースは少なくないだろう。その場合には以下のように記述すればよい。

[default]

exten => 201,1,Dial(SIP/201)

exten => 202,1,Dial(SIP/202)

exten => 1234,1,Goto(ivr-menu,10000,1)

[ivr-menu]

exten => 202,1,Dial(SIP/202)

exten => 10000,1,Answer()
exten => 10000,n,PlayBack(....

 内線番号1234を内線からダイヤルすると,Gotoにより処理はコンテキスト"ivr-menu"のexten,10000でプライオリティ1へとジャンプするので,内線からIVRメニューを試すことができる。逆にivr-menuコンテキストからdefaultへのジャンプ経路はないので内線には到達できないことになる。

 特定のSIPクライアント(電話機)や回線をコンテキストに縛りつけるには,sip.confの各相手の設定に以下を記述する。

context=ivr-menu

 例えばIP電話事業者との接続(ITSP接続)をしている場合に,そのITSPの設定部分でcontext=ivr-menuを記述しておけば,その接続は明示的にジャンプを行わない限りはコンテキスト内で動作する。

 以上を踏まえた上で,IVRのメニューを作成してみることにしよう。