2015年2月15日日曜日

Asteriskに最強コーデックの「Opus」を対応させる

Asteriskに「Opus」を対応させました。
これにより、超高音質で低遅延な環境が出来上がりました。
「Opus」については、以前書いた記事<VoIPに音声コーデック「Opus」を使いたい>をご覧ください。




毎度のことですが、ここに至るまでにはかなりの時間を費やしました。
しかし、成功してしまうとあっけないもので、難易度はそれほど高くありません。

今回は、AsteriskにOpusを対応させた備忘録を残します。



【 環境 】

ハードウェアには「Raspberry Pi B+」を用い、Linuxディストリビューションには「Raspbian」(Debian)を使いました。
同様の手順でArchLinuxやFedoraなどにも対応できると思いますが、今回は未確認です。

また、CuBox-i2(Debian+Asterisk)でも、全く同じ手順でOpusに対応させられました。
なお、後述する検証結果については、この「CuBox-i2」によるものです。



【 Asteriskのインストール~Opus対応手順 】

私はものぐさなのでsudoなどは使わず、すべてrootで作業します。

●元々Asteriskがインストールされている場合は、まずはそれを削除します。
apt-get --purge remove asterisk
rm -r /usr/lib/asterisk/modules

●パッケージリストを更新します。
apt-get update

●開発に必要なパッケージ類などをインストールします。
apt-get install autoconf automake pkg-config
apt-get install libncurses5-dev
apt-get install uuid-dev
apt-get install libjansson-dev
apt-get install libxml2-dev
apt-get install libsqlite3-dev
apt-get install libssl-dev
apt-get install libopus-dev


●Asterisk Ver11.9.0をダウンロードして、解凍します。
cd /usr/src
wget http://downloads.asterisk.org/pub/telephony/asterisk/old-releases/asterisk-11.9.0.tar.gz
tar zxvf asterisk-11.9.0.tar.gz

●AsteriskにOpus対応パッチを当てて、makeします。
cd asterisk-11.9.0
wget https://raw.githubusercontent.com/netaskd/asterisk-opus/master/asterisk-11.5.0_opus+vp8.diff patch -p1 -u < asterisk-11.5.0_opus+vp8.diff ./bootstrap.sh ./configure make menuselect (Codec TranslationsにOpusがあることを確認するだけ。省略可。) make make install make samples make config ●再起動後、自動でAsteriskが立ち上がります。 reboot


【 Asterisk実行ユーザの変更 】

インストールした直後のAsteriskは、root権限で稼働します。
これは、セキュリティ上好ましくないため、ユーザに「asterisk」を追加し、そのユーザ権限でAsteriskを実行させます。
(root権限のまま実行していても、実用上の問題はありません。)

●「asterisk」というユーザを追加し、権限などの調整をします。
groupadd -g 5060 asterisk
useradd -g 5060 -u 5060 -d /var/lib/asterisk -s /sbin/nologin asterisk
chown -R asterisk:asterisk /var/run/asterisk
chown -R asterisk:asterisk /var/lib/asterisk
chown -R asterisk:asterisk /var/log/asterisk
chown -R asterisk:asterisk /var/spool/asterisk
chown -R asterisk:asterisk /usr/lib/asterisk
chown -R asterisk:asterisk /etc/asterisk
chmod -R u=rwX,g=rX,o= /var/run/asterisk
chmod -R u=rwX,g=rX,o= /var/lib/asterisk
chmod -R u=rwX,g=rX,o= /var/log/asterisk
chmod -R u=rwX,g=rX,o= /var/spool/asterisk
chmod -R u=rwX,g=rX,o= /usr/lib/asterisk
chmod -R u=rwX,g=rX,o= /etc/asterisk

●Asteriskの設定ファイルを編集します。
nano /etc/asterisk/asterisk.conf

・以下のコメントアウトを外す。
[options]
;runuser = asterisk
;rungroup = asterisk
↑
この2ヶ所の「セミコロン」を削除

●リブート
reboot

●リブート後、ユーザ「asterisk」でAsteriskが稼働しているか確認します。
asterisk -vvvvr

次のように表示されていれば成功です。
Running as user 'asterisk'                       
Running under group 'asterisk'



【 Opusを使う 】

●sip.confでOpusの使用を許可します。
allow=opus


これでAsteriskでOpusが使えるようになります。


●「Opus」に対応したSIPクライアントを使います。

Acrobits製の「Softphone」や「Groundwire」、また、フリーでは「CSipSimple」が「Opus」に対応しています。


【 音質の検証 】

今まで幾度となくチャレンジしてきた「Opus」ですが、やっとその実力を検証できます。
ただ、今回は音声の録音と遅延の測定ができませんでした。

これは、何か理由があってできなかったわけではなく、単純に時間的な制約です。
詳細の検証結果を挙げる前に、まずはAsteriskのOpus対応化を記事にしたく、先行しての投稿です。


録音や遅延の計測は、また後ほど行いたいと思います。
まずは言葉だけで「Opus」の音質を説明します。


「Opus」を扱えるSIPクライアントはあまり多くありませんが、幸いなことに「CSipSimple」と「Acrobits Groundwire」が対応しています。
この2つのアプリがあれば、他は要りません。この2アプリで十分です。

まず、これらアプリの比較です。
同じ「Opus」であっても、「CSipSimple」と「Groundwire」とで音質がかなり異なりました。

さらに「Groundwire」では使うスマホによっても、かなり音質が異なりました。
たとえば、SC-01Fでは音質はあまり良くなく、L-01FやSH-07Dはなかなかの音質でした。

一方、「CSipSimple」はどんな機種を使ってもメリハリのある音質で、音声データから綺麗にノイズが除去されてクリアな音と言うか・・・なんて言うかドライな音質でした。
これはかなり私好みで、文句のつけようがないレベルでした。


続いて、トランスコーディングの検証です。

発信側と着信側で要求するコーデックが異なる際は、リアルタイムに音声変換されます。
これをトランスコーディングと言いますが、「Opus」からのトランスコーディング(またはその逆)はかなりCPU負荷がかかってしまうのではないかと懸念しました。

しかし、「Raspberry Pi」と同じARM系CPUを積んだ「CuBox-i2」で、10%程度のCPU負荷となりました。
ということは「Raspberry Pi」では20%程度の負荷に収まると思われます。
最近発売された「Raspberry Pi 2」であれば5%程度ではないでしょうか。


さて、肝心な音質についてですが、「発信側→着信側」の順に、
  • 「Opus」→「Opus」:非常に綺麗で文句なし。
  • 「G711u」→「Opus」:非常に綺麗で文句なし。
  • 「Opus」→「G711u」:非常に綺麗で文句なし。
  • 「Opus」→「iLBC」:宇宙人がしゃべっている感じ

    「Opus」→「iLBC」のトランスコーディングがNGです。
    あまりにもひどい音質で、遅延も3秒ぐらいあります。
    不思議に思い、Asterisk側から確認してみると、それもそのはずで、トランスコーディングに失敗していました。

    これ以外にも、いくつかトランスコーディングに失敗するケースがありました。(自動応答による音声案内など)
    コーデックを「Opus」にして、天気予報を聞くと、ひどい音質となりました。
    なお、この現象はSIPクライアントに依存する部分があるようでしたが、これについては検証しきれませんでした。


    続いて、遅延の計測ですが、これはいつもの様に波形から遅延時間を計測したわけではありません。
    あくまでも体感です。そのため、あまり当てになりませんので、参考程度としてください。

    まず、トランスコーディングに失敗しない限り、今までにないぐらい低遅延です。
    SH-07Dという超低スペック機種でも遅延に影響しないぐらい、スマホへの負荷も少ないです。

    ただ、SC-01F(ギャラクシーノート3)だけはあまり低遅延とは思えませんでした。(この機種だけはiLBCのほうが高音質・低遅延でした。)


    最後に使用帯域について触れたいと思います。

    Linuxの機能(iftop)を用いて主要コーデックの使用帯域を測定しました。
    Opusを使った場合は、26~30kbpsの回線速度を必要としました。

    《主要コーデックによる使用帯域一覧》
    コーデック 使用帯域
    G711u : 78kbps
    iLBC
     : 23.6kbps
    Opus
     : 26~30kbps(可変)
    GSM
     : 28.7kbps

    やはりG711uはかなりの帯域を必要とします。
    これを見ると、やはり3G/LTE回線下では「Opus」や「iLBC」などの音声コーデックの必要性を感じます。


    今回の検証はこれで終わります。



    【 感想 】

    「Opus」自体は現時点で間違いなく最強の音声コーデックです。
    しかし、Asteriskは最新バージョンの13であっても「Opus」に正式対応していません。
    そのためか、トランスコーディングに失敗するケースがあったりと、まだまだ不安定な一面もあります。

    正直な感想としては、どんなに「Opus」が素晴しかろうが、周りがそれを活かせていないように感じました。


    今後Asteriskが「Opus」に正式対応することがあれば、必須になるコーデックだと思います。
    しかしながら、現時点では、不安定な一面もあることから、まだ「マニア向けコーデック」という位置付けでしょうか。

    音質は最高であることは保証します。
    しかし、安定動作させるためには、もう少し検証が必要だと感じました。


    私はこの「Opus」と【つなぐ】(※)は最高の組み合わせになると考えています。
    そのため、なんとしても安定動作させたいところです。

    ※ 【つなぐ】とは何かは、以下の記事をご覧ください。
    ガラケー(話し放題)と、スマホ(MVNO)を【つなぐ】>(概要説明)
    MVNO(データSIM)で「話し放題」を実現する 【つなぐ】>(設定紹介)


    今回の検証はここで終わりますが、今後、ハードとOSを変えて、さらなる検証を進めていきたいと思います。

  • 4 件のコメント :

    1. asterisk11以降のopusパッチはビットレート周りやfec周りがかなり未完成です。
      acrobitsだと通話に失敗するんじゃないかと。
      asterisk10のopus対応版がdiginumのsvnにひっそりあるのでそっち使うほうがマシです。
      opusのライセンスの問題からupstreamはopus取り込まないらしいですね。

      返信削除
    2. 名無しさん
      コメントありがとうございます。

      >asterisk10のopus対応版がdiginumのsvnにひっそりあるのでそっち使うほうがマシです。

      ひっそりすぎて、探してみたのですがわかりませんでした。
      どこから入手できるのかお教え頂けませんか?
      すごく使ってみたいです。

      >opusのライセンスの問題からupstreamはopus取り込まないらしいですね。

      これはかなりショックです。
      そうなのですか。Opusは完全フリーなものなのかと思っていました。
      ということは、Opus対応化はAsteriskのバージョンアップでは期待できないということですね(T_T)

      返信削除
    3. この辺ですね…

      http://svnview.digium.com/svn/asterisk/team/dvossel/opus_codec_ftw/?pathrev=330983

      svn checkout -r 330983 http://svn.asterisk.org/svn/asterisk/team/dvossel/opus_codec_ftw .

      うちはchan_sip.cにちょっと手を入れたりしていますが、
      基本動いたと思います。


      ソース見る限り、opusはFreeSWITCHが一番よさそうですが、
      configが面倒でビルドはしたものの試せていません…。

      返信削除
    4. nanashiさん
      教えて頂きありがとうございますm(__)m
      バグ無し(?)Opusを試してみたいと思います。楽しみです♪


      FreeSWITCHとはなんぞや?と検索してしまったぐらいに、私は無知です。
      もう少しAsteriskで勉強してから次のステップに進みたいと思います。
      ありがとうございました!

      返信削除