IVR機能と DTMFトーンによる転送
asteriskのIVR用のサンプル音声ファイルは以下のディレクトリに保存してある。
[root@localhost asterisk]# ls /var/lib/asterisk/sounds/en/
extensions.conf に以下の用にして記述する。
[ivr-menu] exten => s,1,Answer() exten => s,n,WaitExten(30) exten => s,n,Hangup exten => 201,1,Dial(SIP/4444) [default] exten => 12345,1,Goto(ivr-menu,s,1)
そしてSIPクライアントから 12345 に対してコールすると、すぐに通話中になる。
その状態で DTMF 201 を入力すると4444に電話がかかる。
以下はその際のログ
== Using SIP RTP CoS mark 5 -- Executing [12345@default:1] Goto("SIP/2001-0000000a", "ivr-menu,s,1") in new stack -- Goto (ivr-menu,s,1) -- Executing [s@ivr-menu:1] Answer("SIP/2001-0000000a", "") in new stack -- Executing [s@ivr-menu:2] WaitExten("SIP/2001-0000000a", "30") in new stack == CDR updated on SIP/2001-0000000a -- Executing [201@ivr-menu:1] Dial("SIP/2001-0000000a", "SIP/4444") in new stack == Using SIP RTP CoS mark 5 -- Called SIP/4444 -- SIP/4444-0000000b is ringing -- SIP/4444-0000000b answered SIP/2001-0000000a -- Locally bridging SIP/2001-0000000a and SIP/4444-0000000b == Spawn extension (ivr-menu, 201, 1) exited non-zero on 'SIP/2001-0000000a'
そして以下のようにすると IVRの機能が動作するはずである。
[ivr-menu] exten => s,1,Answer() exten => s,n,Playback(vm-enter-num-to-call) exten => s,n,WaitExten(30) exten => s,n,Hangup exten => 201,1,Dial(SIP/4444) [default] exten => 12345,1,Goto(ivr-menu,s,1)
だが IVR機能が動作しない
以下のように vm-enter-num-to-call ファイルが無いようなえらーになってしまう。
== Using SIP RTP CoS mark 5 -- Executing [12345@default:1] Goto("SIP/2001-0000000e", "ivr-menu,s,1") in new stack -- Goto (ivr-menu,s,1) -- Executing [s@ivr-menu:1] Answer("SIP/2001-0000000e", "") in new stack -- Executing [s@ivr-menu:2] Playback("SIP/2001-0000000e", "vm-enter-num-to-call") in new stack [Mar 26 17:47:47] WARNING[32190]: file.c:663 ast_openstream_full: File vm-enter-num-to-call does not exist in any format [Mar 26 17:47:47] WARNING[32190]: file.c:954 ast_streamfile: Unable to open vm-enter-num-to-call (format 0x4 (ulaw)): No such file or directory [Mar 26 17:47:47] WARNING[32190]: app_playback.c:475 playback_exec: ast_streamfile failed on SIP/2001-0000000e for vm-enter-num-to-call -- Executing [s@ivr-menu:3] WaitExten("SIP/2001-0000000e", "30") in new stack
そこでインストールに成功している Xen 上の CentOS 上の asterisk にインストールされている sounds ディレクトリ以下の音声ファイルをコピーしてみる。
以下のコマンドを CentOS上で実行(192.168.10.127 は Fedora上の asteriskである)
Fedora上で作業
[root@asterisk ~]# mkdir ~/asterisk
CentOS上で作業
[root@localhost asterisk]# scp -r /var/lib/asterisk/* 192.168.10.127:~/asterisk
Fedora上の asterisk関係のディレクトリは以下のファイルを見るとわかる。
これをみると astvarlibdir がバイナリ版の asterisk の音声ファイルを置くディレクトリのようだ。
[root@asterisk asterisk]# head -12 asterisk.conf [directories](!) astetcdir => /etc/asterisk astmoddir => /usr/lib64/asterisk/modules astvarlibdir => /usr/share/asterisk astdbdir => /var/spool/asterisk astkeydir => /var/lib/asterisk astdatadir => /usr/share/asterisk astagidir => /usr/share/asterisk/agi-bin astspooldir => /var/spool/asterisk astrundir => /var/run/asterisk astlogdir => /var/log/asterisk
なので以下の用にして音声ファイルをコピーする
[root@asterisk asterisk]# cp -r ~/asterisk/sounds/en/ /usr/share/asterisk/sounds/
この状態で SIPクライアントから 12345 宛にコールしてみた。
するとエラーメッセージが変化した。
音声ファイルを置くディレクトリについては間違っていないようだ。
== Using SIP RTP CoS mark 5
— Executing [12345@default:1] Goto(“SIP/2001-0000000e”, “ivr-menu,s,1”) in new stack
— Goto (ivr-menu,s,1)
— Executing [s@ivr-menu:1] Answer(“SIP/2001-0000000e”, “”) in new stack
— Executing [s@ivr-menu:2] Playback(“SIP/2001-0000000e”, “vm-enter-num-to-call”) in new stack
[Mar 26 17:47:47] WARNING[32190]: file.c:663 ast_openstream_full: File vm-enter-num-to-call does not exist in any format
[Mar 26 17:47:47] WARNING[32190]: file.c:954 ast_streamfile: Unable to open vm-enter-num-to-call (format 0x4 (ulaw)): No such file or directory
[Mar 26 17:47:47] WARNING[32190]: app_playback.c:475 playback_exec: ast_streamfile failed on SIP/2001-0000000e for vm-enter-num-to-call
— Executing [s@ivr-menu:3] WaitExten(“SIP/2001-0000000e”, “30”) in new stack
とおもったら単純に SIPクライアントの Windows側でスピーカーをミュートをオンにしていただけだった。
この状態で SIPクライアントから 12345 宛にコールしてみたら IVRの再生が普通に聞こえた。
またSIPクライアント(X-Liteなど)の設定が適切か(この場合は問題なかったが)どうかも疑った方が良い。