2015年3月22日日曜日

Asteriskに関するメモ

ここ最近はAsteriskいじりが日課になっています。
自らのスキルアップと同時に、それがそのまま音質の向上に繋がります。
これはやっていて非常に楽しいです♪


AsteriskでIP-PBXを構築する上で、障壁となりそうなことを備忘録として残します。
大まかですが、以下のようなことです。
  • メモっておかないと忘れてしまうようなこと。
  • 日本のサイトでは情報を得られなかったこと。
  • 試行錯誤でやっと結果が得られたもの。
  • 頑張っても結果が得られないもの。

    なお、これは本当に私用のメモです。
    わかりやすく書いているわけではないので、参考にされる方がいたらごめんなさい。


    【 「Raspberry Pi(B+と2B)」にインストールした「Asterisk」に「G.729a」を対応させる(無料) 】

    Raspberry PiはARM系CPUのため、バイナリ配布型のG729aが使えない。
    そのため、専用コンパイラを用いて、G729をインストールする。
    さらに、本来有料であるはずのG729はこれで無料となる。(ロイヤリティフリーのものを使う。)

    ●「Raspberry Pi B+」編
    Asteriskインストール後
    apt-get install dh-autoreconf
    cd /tmp

    <bcg729のインストール>
    wget http://download-mirror.savannah.gnu.org/releases/linphone/plugins/sources/bcg729-1.0.0.tar.gz
    tar xzf bcg729-1.0.0.tar.gz
    cd bcg729-1.0.0
    ./configure --libdir=/lib
    make
    make install

    <G729のインストール>
    cd ..
    wget http://asterisk.hosting.lv/src/asterisk-g72x-1.2.tar.bz2
    tar xjf asterisk-g72x-1.2.tar.bz2
    cd asterisk-g72x-1.2
    ./autogen.sh
    ./configure --with-bcg729
    make
    make install

    asterisk -vvvvr
    core restart gracefully


    ●「Raspberry Pi 2B」編
    Asteriskインストール後
    apt-get install dh-autoreconf
    cd /tmp

    <bcg729のインストール>
    wget http://download-mirror.savannah.gnu.org/releases/linphone/plugins/sources/bcg729-1.0.0.tar.gz
    tar xzf bcg729-1.0.0.tar.gz
    cd bcg729-1.0.0
    ./configure --libdir=/lib
    make
    make install

    <G729のインストール>
    cd ..
    wget http://asterisk.hosting.lv/src/asterisk-g72x-1.2.tar.bz2
    tar xjf asterisk-g72x-1.2.tar.bz2
    cd asterisk-g72x-1.2
    ./autogen.sh
    ./configure --with-bcg729

    出来上がった「Makefile」を編集する
    205行目「-march=」を「-march=armv7-a」に編集

    make
    make install

    asterisk -vvvvr
    core restart gracefully



    【 Asterisk11で3Gモデム(Chan_dongle)を使う 】

    <Asterisk11のインストール>
    cd /usr/src
    wget http://downloads.asterisk.org/pub/telephony/asterisk/old-releases/asterisk-11.16.0.tar.gz

    (11.16.0にした理由は、11系のひかり電話対応パッチ導入可能な最終Verのため。)

    tar zxvf asterisk-11.16.0.tar.gz
    cd asterisk-11.16.0
    ./contrib/scripts/install_prereq install
    (Windowが出てきたら「81」を入力) ※30分ぐらい時間がかかるかも。
    ./bootstrap.sh
    ./configure
    make
    make install
    make samples
    make config

    <Asterisk11対応Chan_dongleのインストール>
    cd /usr/src
    wget https://github.com/jstasiak/asterisk-chan-dongle/archive/asterisk11.zip
    unzip asterisk11.zip
    cd asterisk-chan-dongle-asterisk11
    aclocal
    autoconf
    automake -a
    ./configure
    make
    make install
    cp etc/dongle.conf /etc/asterisk/



    【 Asterisk12で3Gモデム(Chan_dongle)を使う(失敗) 】

    <Asterisk12のインストール>
    cd /usr/src
    wget http://downloads.asterisk.org/pub/telephony/asterisk/old-releases/asterisk-12.8.1.tar.gz

    tar zxvf asterisk-12.8.1.tar.gz
    cd asterisk-12.8.1
    (Windowが出てきたら「81」を入力) ※30分ぐらい時間がかかる。
    ./bootstrap.sh
    ./configure
    make
    make install
    make samples
    make config


    <Asterisk12対応Chan_dongleのインストール>
    cd /usr/src
    wget https://github.com/superles/chan-dongle-asterisk12/archive/master.zip
    unzip master.zip
    cd chan-dongle-asterisk12-master
    aclocal
    autoconf
    automake -a
    ./configure
    make
    make install
    cp etc/dongle.conf /etc/asterisk/

    通話不可



    【 Asterisk13で3Gモデム(Chan_dongle)を使う(失敗) 】

    Asterisk12と基本的なやり方は同じ。
    chan_dongleは作者によって2つ存在する。
    が、そのどちらも未完成に思える。もしくはARM系に対応していないか(?)

    以下からダウンロード可能。

    novaktmp氏作
    https://forum.openwrt.org/viewtopic.php?id=54343

    rusxakep(Mikhail Baykov)氏作
    https://github.com/rusxakep/asterisk-chan-dongle/tree/asterisk13



    【 ひかり電話対応パッチを当てる 】

    Asterisk1.8系と11系でそれぞれパッチ適用可能な最終バージョンを検討する。
    say.cとapp_voicemail.cはついで。

    <ひかり電話対応最終バージョン(Asterisk1.8)>
    cd /usr/src
    wget http://downloads.asterisk.org/pub/telephony/asterisk/old-releases/asterisk-1.8.27.0.tar.gz
    tar xzvf asterisk-1.8.27.0.tar.gz
    cd asterisk-1.8.27.0
    wget http://ftp.voip-info.jp/asterisk/patch/local/1.8/channels/chan_sip.rt200ne.110205-01.patch
    wget http://ftp.voip-info.jp/asterisk/patch/1.8.20.1/say.c.101025-01.patch
    wget http://ftp.voip-info.jp/asterisk/patch/1.8.20.1/app_voicemail.c.101025-01.patch
    patch -p0 < chan_sip.rt200ne.110205-01.patch ←なんか出ても「y」で。
    patch -p0 < say.c.101025-01.patch
    patch -p0 < app_voicemail.c.101025-01.patch

    <ひかり電話対応最終バージョン(Asterisk11)>
    cd /usr/src
    wget http://downloads.asterisk.org/pub/telephony/asterisk/old-releases/asterisk-11.16.0.tar.gz
    tar xzvf asterisk-11.16.0.tar.gz
    cd asterisk-11.16.0
    wget http://ftp.voip-info.jp/asterisk/patch/local/11/channels/chan_sip_rt200ne.141204-01.patch
    wget http://ftp.voip-info.jp/asterisk/patch/11.13.0/say.c.121107-01.patch
    wget http://ftp.voip-info.jp/asterisk/patch/11.13.0/app_voicemail.c.121107-01.patch
    patch -p0 < chan_sip_rt200ne.141204-01.patch ←なんか出ても「y」で。
    patch -p0 < say.c.121107-01.patch
    patch -p0 < app_voicemail.c.121107-01.patch



    【 AsteriskにBluetoothケータイを直接収容する(Chan_mobile) 】

    Asteriskインストール時に「make menuselect」よりChan_mobileは有効にしておく。

    BTドングル 挿す

    apt-get install bluetooth bluez libbluetooth-dev bluez-utils blueman

    ラズパイに挿したBTドングル情報の確認
    hcitool dev

    Devices:
    hci0 00:19:86:00:08:**

    周辺のBTデバイスのスキャン
    hcitool scan

    Scanning ...
    A0:DD:E5:42:DB:** WS027SH
    AC:9E:17:09:CF:** Nexus Player

    ペアリング
    bluez-simple-agent hci0 A0:DD:E5:42:DB:**
    これがラズパイが接続しに行くコマンド
    接続に失敗することが多々あるが粘る

    hciconfig hci0 piscan
    bluetooth-agent 0000
    こっちがラズパイが接続待ちになるコマンド

    Ctrl+zで待受状態脱出
    /etc/init.d/bluetooth restart


    ペリングしたBTデバイスと自動接続
    bluez-test-device trusted A0:DD:E5:42:DB:** yes
    bluez-test-input connect A0:DD:E5:42:DB:**

    chan_mobileの設定
    nano /etc/asterisk/chan_mobile.conf

    [adapter]
    id=WS027SH
    address=A0:DD:E5:42:DB:**



    【 Asteriskの日本語音声対応 】

    自動応答させる際などに使う。(IVR)

    nano /etc/asterisk/asterisk.conf
    languageprefix = yesのコメントアウトを外す。

    sip.confに以下追加
    [general]
    language=ja

    cd /tmp
    wget http://ftp.voip-info.jp/asterisk/sounds/1_6/asterisk-sound-jp_16_pre.tar.gz
    tar xzvf asterisk-sound-jp_16_pre.tar.gz

    ・Asterisk1.8
    mv ja/ /usr/share/asterisk/sounds/

    ・Asterisk11
    mv ja/ /var/lib/asterisk/sounds/



    【 擬似ビジー音と切断音の導入 】

    これは結構重用。
    内線通話ではビジー及び切断が非常にわかりにくいため、これを擬似的に自分で鳴らしてしまう。
    「プーップーップー・・・・プツ」ってやつ。

    ・Asterisk1.8
    cd /usr/share/asterisk/sounds/ja

    ・Asterisk11以降
    cd /var/lib/asterisk/sounds/ja

    wget https://sites.google.com/site/azukarijo2/busy-sound.gsm
    wget https://sites.google.com/site/azukarijo2/disconnect-sound.gsm

    extensions.confに、鳴らしたい場所で以下のように記載。
    (「_0.」のところは適宜変更)

    (例)
    exten => _0.,n,Playback(busy-sound)
    exten => _0.,n,Playback(disconnect-sound)
  • 2015年3月3日火曜日

    音声コーデックの聴き比べ(G711,G722,G726,G729a,GSM,iLBC,Speex,Opusの比較)

    IP電話(VoIP)に使われる主要な音声コーデックを、聴き比べ出来るようにしました。




    いつもは、わざと環境ノイズを含めて、実際の使用環境に近づけようとしていました。
    しかし、今回は違います。

    音声コーデックの本来の音質を知るために、環境ノイズをすべて除去しました。

    なお、元となる音声データを、該当コーデックで再圧縮したわけではありません。
    適切に、VoIPを通じて相手方に届いた音声データを録音しています。



    【 検証した音声コーデックについて 】

    以下の音声コーデックの検証を行いました。
    それぞれのコーデックの特徴などはWikiをご覧ください。(リンク先はWiki)

  • G711(u-Law)
  • G722
  • G726
  • G729a
  • GSM
  • iLBC
  • Speex
  • Opus(Wide)
  • Opus(Narrow)



  • 【 検証環境 】

    音質については自分がどう聞こえるかより、自分の声が相手にどのように聞こえているかが重要なため、それを掲載します。
    なお、実際の使用環境に近づけるため、エアコンの音やパソコンの風切音など、環境ノイズのある状態で試験しています。
    また、パソコンのスピーカから出る音をスマホのマイクで拾っていますので、どうしても音質は悪くなります。


    今回は、スマホにライン入力した音声より録音しました。
    つまり、環境ノイズの影響を一切受けない状況での試験ということになります。
    なお、PCのサウンドカードは良質のものを使っていますので、それが原因でノイズが乗るということはないと思います。


    [使用SIPクライアント]
  • Zoiper IAX SIP VOIP Softphone

    [検証機器]
  • WX12K(GP-712と接続)
  • L-01F(Asteriskに接続)

    [回線種別]
  • Wi-Fi(au光回線)

    [録音環境]
  • 「FUSION IP-Phone SMART」の留守電(128kbps RIFF-WAVE)

    [音声の元データ]




    【 検証結果 】

    ※ 使用帯域には理論値ではなく、実際に使う帯域を掲載しています。
      理論値を知りたい場合は、前述のWikiをご覧ください。


    検証結果について、今回は私の意見を述べません。
    Wikiを読んで、理論的に優れた音声コーデックを選択するのも良いですし、実際にこれらの音声データを聞いてみて、「自分はコレが好きだ!」というものを選んでも良いと思います。
    今回、環境ノイズがない環境下で検証してみて、それぞれの音質の特徴から本当にそのように思いました。


    コーデック 音質 使用帯域
    送信 受信
    G711(u-Law)

    84 kbps 83 kbps
    G722

    83 kbps 83 kbps
    G726

    52 kbps 52 kbps
    G729a

    28 kbps 28 kbps
    GSM

    33 kbps 33 kbps
    Speex

    29 kbps 31 kbps
    iLBC

    27 kbps 27 kbps
    Opus(Wide)

    40 kbps 40 kbps
    Opus(Narrow)

    35 kbps 30 kbps