やりたいこと

ブラステル社のIP電話サービス050 Freeに留守番電話を付けたい。この050 Free、IP電話にありがちな遅延が少なく、さらに通話料もお安く、さらにさらに月額料金は0円という客の側から見ると大変ありがたいサービスです。しかしながら留守電がついていないのが残念なところ。

この手のIP電話サービスと言えば、NTTコム社の050 plusフュージョン・コミュニケーションズ社のIP-Phone SMARTが有名どころです。どちらも標準で留守電サービスが提供されているものの、050 plusは月額料金が発生するため私のような貧乏人には抵抗があり、IP-Phone SMARTは月額料金は無料であるものの通話料が高い。というか、そもそもフュージョンのやつは料金云々以前に遅延が大きくて使えない。

用事があればかけ直してくるだろうから留守電なんていらないという考えもありますが、何度も何度もかけ直していただくのも小心者の私は心苦しい。留守電にメッセージを残していただき、こちらからお電話差し上げるのが大人というものでしょう。

そこで、Ateriskを使い050 Freeで留守電を実現することにしました。

環境

手順

debianのインストール

普通にインストールします。

APTによるAsteriskのインストール

素直にパッケージでAsteriskを入れます。途中、国番号を訊いてくるので日本の番号である81を入力します。

# apt-get install asterisk

これだけでほしいソフトが入ってくれるんだからパッケージ管理システムってすばらしい。

confファイルの編集

/etc/asterisk/asterisk.conf

languageprefix = yesのコメントアウトを外すだけ。

[directories](!)
astetcdir => /etc/asterisk
astmoddir => /usr/lib/asterisk/modules
astvarlibdir => /var/lib/asterisk
astdbdir => /var/lib/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

[options]
;verbose = 3
;debug = 3
;alwaysfork = yes               ; Same as -F at startup.
;nofork = yes                   ; Same as -f at startup.
;quiet = yes                    ; Same as -q at startup.
;timestamp = yes                ; Same as -T at startup.
;execincludes = yes             ; Support #exec in config files.
;console = yes                  ; Run as console (same as -c at startup).
;highpriority = yes             ; Run realtime priority (same as -p at
                                ; startup).
;initcrypto = yes               ; Initialize crypto keys (same as -i at
                                ; startup).
;nocolor = yes                  ; Disable console colors.
;dontwarn = yes                 ; Disable some warnings.
;dumpcore = yes                 ; Dump core on crash (same as -g at startup).
languageprefix = yes            ; Use the new sound prefix path syntax.
;internal_timing = yes
;systemname = my_system_name    ; Prefix uniqueid with a system name for
                                ; Global uniqueness issues.
;autosystemname = yes           ; Automatically set systemname to hostname,
                                ; uses 'localhost' on failure, or systemname if
                                ; set.
;maxcalls = 10                  ; Maximum amount of calls allowed.
;maxload = 0.9                  ; Asterisk stops accepting new calls if the
                                ; load average exceed this limit.
;maxfiles = 1000                ; Maximum amount of openfiles.
;minmemfree = 1                 ; In MBs, Asterisk stops accepting new calls if
                                ; the amount of free memory falls below this
                                ; watermark.
;cache_record_files = yes       ; Cache recorded sound files to another
                                ; directory during recording.
;record_cache_dir = /tmp        ; Specify cache directory (used in conjunction
                                ; with cache_record_files).
;transmit_silence = yes         ; Transmit silence while a channel is in a
                                ; waiting state, a recording only state, or
                                ; when DTMF is being generated.  Note that the
                                ; silence internally is generated in raw signed
                                ; linear format. This means that it must be
                                ; transcoded into the native format of the
                                ; channel before it can be sent to the device.
                                ; It is for this reason that this is optional,
                                ; as it may result in requiring a temporary
                                ; codec translation path for a channel that may
                                ; not otherwise require one.
;transcode_via_sln = yes        ; Build transcode paths via SLINEAR, instead of
                                ; directly.
;runuser = asterisk             ; The user to run as.
;rungroup = asterisk            ; The group to run as.
;lightbackground = yes          ; If your terminal is set for a light-colored
                                ; background.
;forceblackbackground = yes     ; Force the background of the terminal to be
                                ; black, in order for terminal colors to show
                                ; up properly.
;defaultlanguage = en           ; Default language
documentation_language = en_US  ; Set the language you want documentation
                                ; displayed in. Value is in the same format as
                                ; locale names.
;hideconnect = yes              ; Hide messages displayed when a remote console
                                ; connects and disconnects.
;lockconfdir = no               ; Protect the directory containing the
                                ; configuration files (/etc/asterisk) with a
                                ; lock.

; Changing the following lines may compromise your security.
;[files]
;astctlpermissions = 0660
;astctlowner = root
;astctlgroup = apache
;astctl = asterisk.ctl

[compat]
pbx_realtime=1.6
res_agi=1.6
app_set=1.6

/etc/asterisk/sip.conf

sip.confは男らしく中身をまるっと消して以下の具合にする。内容はもうちょっと削れそうな気がする。

[general]
language=ja

; Register
register => ユーザー名:パスワード@softphone.spc.brastel.ne.jp/200

[brastel]
type=peer
username=ユーザー名
fromuser=ユーザー名
secret=パスワード
fromdomain=softphone.spc.brastel.ne.jp
host=softphone.spc.brastel.ne.jp
context=brastel
insecure=invite
canreinvite=no
disallow=all
allow=ulaw
allow=gsm

/etc/asterisk/extensions.conf

10秒待って留守電を呼ぶようにすべく、extensions.confを書く。”Wait(10)”が見てのとおり10秒待つという意味なので、好みで短くでも長くでもします。

“exten => 200″の”200″という数字がsip.confのregisterで指定した”/200″に対応するみたい。

[brastel]
exten => 200,1,Ringing
exten => 200,n,Wait(10)
exten => 200,n,Voicemail(200)
exten => 200,n,Hangup

/etc/asterisk/voicemail.conf

留守電(ボイスメール)を設定。留守電が録音されたら内容をメールに添付して送るようにします。maxmsgが留守電に記録できる最大件数、maxsecsが1件あたりの最大録音時間、maxsilenceが最大無音時間(この時間を超えて電話をかけた人が何も話さないと電話を切る)なので適宜調整します。

[general]
format=wav49
serveremail=asterisk
attach=yes
maxmsg=9999
maxsecs=300
maxsilence=10
silencethreshold=128

[default]
200 => 1234,送信先の人の名前,メール送信先,,tz=japan

Asteriskサービスの再起動

ここまで設定したらAsteriskサービスを再起動します。

# service asterisk restart

さらにasteriskコマンドでコンソールに入り、ブラステル社のSIPサーバーにRegisterできたことを確認します。

# asterisk -r
Asterisk 1.8.13.1~dfsg1-3+deb7u3, Copyright (C) 1999 - 2012 Digium, Inc. and others.
Created by Mark Spencer <markster@digium.com>
Asterisk comes with ABSOLUTELY NO WARRANTY; type 'core show warranty' for details.
This is free software, with components licensed under the GNU General Public
License version 2 and other licenses; you are welcome to redistribute it under
certain conditions. Type 'core show license' for details.
=========================================================================
Connected to Asterisk 1.8.13.1~dfsg1-3+deb7u3 currently running on asterisk2 (pid = 8847)
asterisk2*CLI> sip show registry
Host                                    dnsmgr Username       Refresh State                Reg.Time
softphone.spc.brastel.ne.jp:5060        N      ユーザー名            25 Registered           Sat, 15 Nov 2014 22:26:14
1 SIP registrations.
asterisk2*CLI> quit

Registeredと表示されればOK.

動作テスト

電話をかけて、10秒ほど待つと英語のメッセージが聞こえることを確認します。

日本語音声の格納

日本人に電話をかけたのに英語のメッセージが聞こえてきたら、電話をかけた人はびっくりするでしょう。間違えたかな??と思い電話を切ってしまうかもしれません。そこで日本語で応答メッセージが流れるよう、日本語音声をVoIP-Info.jpからダウンロードし格納します。

# cd /tmp
# wget http://ftp.voip-info.jp/asterisk/sounds/1_6/asterisk-sound-jp_16_pre.tar.gz
--2014-11-15 22:43:00--  http://ftp.voip-info.jp/asterisk/sounds/1_6/asterisk-sound-jp_16_pre.tar.gz
ftp.voip-info.jp (ftp.voip-info.jp) をDNSに問いあわせています... 36.3.112.226
ftp.voip-info.jp (ftp.voip-info.jp)|36.3.112.226|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 945968 (924K) [application/x-gzip]
`asterisk-sound-jp_16_pre.tar.gz' に保存中

100%[======================================>] 945,968     5.70M/s 時間 0.2s

2014-11-15 22:43:00 (5.70 MB/s) - `asterisk-sound-jp_16_pre.tar.gz' へ保存完了 [945968/945968]

# tar xzvf asterisk-sound-jp_16_pre.tar.gz
ja/
ja/jp-tadashii.gsm
ja/jp-ha.gsm
ja/vm-extension.gsm
ja/vm-nomore.gsm
ja/agent-incorrect.gsm
ja/jp-gozaimasu.gsm
ja/conf-unmuted.gsm
ja/vm-Cust5.gsm
ja/vm-newpassword.gsm
ja/vm-login.gsm
ja/vm-incorrect.gsm
ja/vm-Cust4.gsm
ja/README.txt
ja/digits/
ja/digits/mon-6.gsm
ja/digits/40.gsm
ja/digits/h-11.gsm
ja/digits/day-4.gsm
ja/digits/today.gsm
ja/digits/h-7.gsm
ja/digits/3.gsm
ja/digits/mon-1.gsm
ja/digits/11.gsm
ja/digits/oh.gsm
ja/digits/mon-10.gsm
ja/digits/mon-0.gsm
ja/digits/day-1.gsm
ja/digits/h-30.gsm
ja/digits/12.gsm
ja/digits/h-19.gsm
ja/digits/byou.gsm
ja/digits/14.gsm
ja/digits/h-9.gsm
ja/digits/a-m.gsm
ja/digits/10.gsm
ja/digits/h-3.gsm
ja/digits/h-14.gsm
ja/digits/nichi.gsm
ja/digits/fun.gsm
ja/digits/p-m.gsm
ja/digits/5.gsm
ja/digits/h-16.gsm
ja/digits/hundred.gsm
ja/digits/h-15.gsm
ja/digits/dollars.gsm
ja/digits/h-17.gsm
ja/digits/h-6.gsm
ja/digits/7.gsm
ja/digits/thousand.gsm
ja/digits/9.gsm
ja/digits/h-10.gsm
ja/digits/50.gsm
ja/digits/17.gsm
ja/digits/tomorrow.gsm
ja/digits/20.gsm
ja/digits/19.gsm
ja/digits/80.gsm
ja/digits/30.gsm
ja/digits/0.gsm
ja/digits/yesterday.gsm
ja/digits/day-6.gsm
ja/digits/70.gsm
ja/digits/nen.gsm
ja/digits/4.gsm
ja/digits/h-5.gsm
ja/digits/h-13.gsm
ja/digits/at.gsm
ja/digits/h-8.gsm
ja/digits/6.gsm
ja/digits/h-20.gsm
ja/digits/h-4.gsm
ja/digits/h-12.gsm
ja/digits/90.gsm
ja/digits/mon-4.gsm
ja/digits/h-18.gsm
ja/digits/million.gsm
ja/digits/mon-8.gsm
ja/digits/day-0.gsm
ja/digits/h-1.gsm
ja/digits/15.gsm
ja/digits/60.gsm
ja/digits/h-2.gsm
ja/digits/ji.gsm
ja/digits/day-3.gsm
ja/digits/16.gsm
ja/digits/gatsu.gsm
ja/digits/13.gsm
ja/digits/mon-7.gsm
ja/digits/18.gsm
ja/digits/8.gsm
ja/digits/mon-9.gsm
ja/digits/mon-3.gsm
ja/digits/mon-2.gsm
ja/digits/mon-5.gsm
ja/digits/day-5.gsm
ja/digits/2.gsm
ja/digits/1.gsm
ja/digits/oclock.gsm
ja/digits/day-2.gsm
ja/digits/mon-11.gsm
ja/privacy-unident.gsm
ja/vm-press.gsm
ja/vm-Work.gsm
ja/invalid.gsm
ja/vm-reachoper.gsm
ja/conf-onlyperson.gsm
ja/jp-no.gsm
ja/hours.gsm
ja/conf-kicked.gsm
ja/jp-oshitekudasai.gsm
ja/agent-loginok.gsm
ja/vm-and.gsm
ja/vm-no.gsm
ja/vm-youhave.gsm
ja/ss-noservice.gsm
ja/vm-goodbye.gsm
ja/vm-toreply.gsm
ja/vm-password-eririn.gsm
ja/vm-Cust3.gsm
ja/tt-allbusy.gsm
ja/q-default.gsm
ja/vm-INBOX.gsm
ja/vm-mailbox-full.gsm
ja/vm-from-phonenumber.gsm
ja/vm-theperson.gsm
ja/wakeup-call-cancelled.gsm
ja/auth-incorrect.gsm
ja/jp-saisho.gsm
ja/conf-otherinparty.gsm
ja/vm-isunavail.gsm
ja/vm-password.gsm
ja/vm-undelete.gsm
ja/1-for-am-2-for-pm.gsm
ja/wakeup.gsm
ja/jp-masu.gsm
ja/vm-advopts.gsm
ja/vm-savemessage.gsm
ja/vm-savedto.gsm
ja/vm-first.gsm
ja/conf-errormenu.gsm
ja/vm-savefolder.gsm
ja/jp-arimasen.gsm
ja/rqsted-wakeup-for.gsm
ja/vm-whichbox.gsm
ja/wakeup-call.gsm
ja/vm-passchanged.gsm
ja/conf-enteringno.gsm
ja/tt-monkeysintro.gsm
ja/privacy-prompt.gsm
ja/vm-Cust2.gsm
ja/jp-desu.gsm
ja/vm-message.gsm
ja/transfer.gsm
ja/conf-onlyone.gsm
ja/vm-forwardoptions.gsm
ja/conf-usermenu.gsm
ja/jp-wa.gsm
ja/vm-options.gsm
ja/not-rqsted-wakeup.gsm
ja/conf-muted.gsm
ja/jp-dekimasu.gsm
ja/jp-baai.gsm
ja/vm-instructions.gsm
ja/vm-saved.gsm
ja/vm-intro.gsm
ja/conf-invalidpin.gsm
ja/vm-Friends.gsm
ja/dir-nomatch.gsm
ja/vm-Old.gsm
ja/dir-intro.gsm
ja/vm-changeto.gsm
ja/vm-nobodyavail.gsm
ja/conf-unlockednow.gsm
ja/agent-loggedoff.gsm
ja/vm-toforward.gsm
ja/wakeup-menu.gsm
ja/conf-locked.gsm
ja/tt-somethingwrong.gsm
ja/vm-sorry.gsm
ja/vm-leavemsg.gsm
ja/vm-Family.gsm
ja/vm-Cust1.gsm
ja/jp-arimasu.gsm
ja/vm-incorrect-mailbox.gsm
ja/wakeup-menu2.gsm
ja/jp-machigai.gsm
ja/privacy-thankyou.gsm
ja/enter-a-time.gsm
ja/vm-reenterpassword.gsm
ja/dir-nomore.gsm
ja/vm-rec-busy.gsm
ja/vm-tocancel.gsm
ja/vm-mismatch.gsm
ja/vm-messages.gsm
ja/conf-thereare.gsm
ja/vm-starmain.gsm
ja/conf-noempty.gsm
ja/vm-next.gsm
ja/jp-ga.gsm
ja/conf-getconfno.gsm
ja/conf-adminmenu.gsm
ja/jp-kara.gsm
ja/vm-repeat.gsm
ja/pbx-invalid.gsm
ja/auth-thankyou.gsm
ja/vm-last.gsm
ja/vm-enter-num-to-call.gsm
ja/vm-onefor.gsm
ja/vm-deleted.gsm
ja/vm-rec-unv.gsm
ja/dir-instr.gsm
ja/agent-newlocation.gsm
ja/jp-saigo.gsm
ja/vm-delete.gsm
ja/jp-chigaimasu.gsm
ja/conf-getchannel.gsm
ja/vm-tohearenv.gsm
ja/vm-received.gsm
ja/jp-wo.gsm
ja/agent-user.gsm
ja/agent-alreadyon.gsm
ja/vm-undeleted.gsm
ja/conf-getpin.gsm
ja/jp-ni.gsm
ja/conf-invalid.gsm
ja/vm-helpexit.gsm
ja/vm-opts.gsm
ja/agent-pass.gsm
ja/pbx-invalidpark.gsm
ja/conf-lockednow.gsm
ja/vm-msgsaved.gsm
ja/tt-weasels.gsm
ja/vm-msginstruct.gsm
ja/pbx-transfer.gsm
ja/vm-for.gsm
ja/vm-rec-name.gsm
ja/privacy-incorrect.gsm
ja/minutes.gsm
ja/vm-prev.gsm
ja/demo-echotest.gsm
ja/jp-dekimasen.gsm
ja/vm-isonphone.gsm
# mv ja/ /usr/share/asterisk/sounds/

動作テスト

電話し、メッセージが日本語に変わったことを確認します。

メール送信

メールまわりを設定していないのでメールが送信されません。dpkg-reconfigure exim4-configしたり、/etc/exim4/passwd.client編集などして設定し、一応mailコマンドでメールが送信されることを確認。

動作テスト

電話し、適当に何か話してメッセージを録音し、メールで送られていることを確認します。

おわりに

留守電が使えるようになり、小心者の私も安心してIP電話の電話番号を人にお伝えできるようになりました。とはいえ、まだVM上で動かしておりホストを落とすと留守電も使えなくなってしまうので、Raspberry Piで動作させて実稼働とするつもりです。

それにしてもAteriskの便利さには驚きました。

今回の目的は留守電だけだったので手順は上記のように簡素なものとなりましたが、手順確立前の検証時にはご多分に漏れず内線をやってみたり、色々といじりました。その結果、設定方法に多少癖はあるもののドキュメントやサンプルも充実しており、構築のハードルは低めであることから、個人用途はもとより、社員数が数十名程度の零細企業ならば社内電話をAsteriskによって構築するという選択肢は現実的と考えるに至りました。ビジネス用途なので冗長化は必須ですし、保守の問題もありますが、IT系の会社ならば社内の要員でなんとかなりそう。

これはかなりの潜在力を秘めたソフトウェアだと思うのですが、導入事例を聞いたことがないのが不思議。