今回は誰得なんですがAsteriskを使って電話回線網に音楽を流してみました。
電話番号は**【 】**です。通信量は各自ご負担ください。
↑サーバー移管した時に消えちゃいました。すみません!
とはいへ回線交換方式ではなくパケット交換方式のIP電話なんでLinuxがあれば簡単に作れます。
まぁ無理やりそれっぽく言うと擬似的なストリーミングみたいなやつですね。
実装方法
簡単にIP電話を構築する際に必要な予備知識を簡単に書いておきます。
イメージ図
簡単なDFD(DataFlowDiagram)みたいなみたくないな、、、まぁそんなもんです。
ネットワークでのパケットとして伝送するので既存のインフラで完結しコスト削減が図れます
VoIPに関するプロトコル
RTP
IP電話(VoIP)を実現する技術としてパケット送信には、**RTP(Real-time Transport Protocol)**というシンプルなプロトコルが用いられます。
SIP
SIPとはSession Initiation Protocolの略でシグナリングを行うプロトコルです。
RTPで音を送り合うためには、事前に相手との情報のやりとりが必要で、「電話」の機能を実現するためには、発信や着信、応答、切断といった「呼制御」と呼ばれる処理が必要になります。これを「シグナリング」または「呼制御」と呼び、SIPはそれを実現するためのプロトコルです。
なのでIP電話を使うにはFusion IP SMATalkや050plus,050freeなどのSIPプロバイダとの契約が必要です。
※以上の内容は以下の記事にも書いてあります。
流す音楽
次に流す曲を決めます。といってもいろいろ**めんどくさい権利問題があるので、今回はアイドルマスターの家庭用版にあったTOWNっていう名前のBGM(俗に言うてってってー**です)がニコニ・コモンズにあったのでそれを使います。
実践
050freeに登録
ブラステルイントラネットさんが提供しているSIPプロバイダの050freeを今回は使います。発信は有料ですが受信のみなら無料です。
音声データ変換
VoIPでは高音質での送信は難しいです。以下の要件があります。
- サンプリング周波数:8000Hz
- 量子化ビット数:16bit
- モノラルステレオ不可!
相当音質は悪いですよね…
以下のコマンド一発で上記フォーマットで変換してくれます。
apt install sox
sox voice.wav -r 8000 -c 1 voice_8k.wav
Asterisk設定
aptでインストールするだけでOKです。
apt install asterisk
設定
以下のように設定ファイルを変更します。
sip.confでは接続情報を登録します。UserIDとPasswordは適宜置き換えてください。
[general]
allowguest=no
disallow=all
allow=ulaw
allow=gsm
nat=auto_force_rport,auto_comedia
; Register
register => UserID:Password@softphone.spc.brastel.ne.jp/100
[brastel]
type=peer
context=brastel
host=softphone.spc.brastel.ne.jp
次にextensions.confで着信時の処理を書きます。PlayBackで音声ファイルを指定する際拡張子は省いてください!
[brastel]
exten => 100,1,Answer
exten => 100,n,PlayBack(/var/lib/asterisk/voice/voice_32k)
これで設定完了。あとは
systemctl restart asterisk
で再起動したらつながるはず…です。
電話番号はー
↑サーバー移管した時に消えちゃいました。すみません!
是非かけてみてください。10年前のXboxアイドルマスター感が味わえると思います。
音質向上
とはいえサンプリング周波数8000Hzなので超音質悪いです。
G.722のような、HDボイスと呼ばれる広帯域コーデックを使えば音質向上が図れます。
ここではサンプリングレートを8KHz→32KHzへ変換し、Asterisk の playback コマンドで流セル用改善します。
sox voice.wav -r 32000 -c 1 voice_32k.wav
拡張子は.sln32
にしてさっきと一緒。HD Voiceに対応していれば若干高音質になります。
以上。