2014年10月14日火曜日

VoIPに音声コーデック「Opus」を使いたい

我が家のケータイ運用方法は複雑です。
自宅に置いてあるPHSとAsteriskとを接続して、そこにスマホでアクセスして電話をかけます。

なんだか難しく聞こえますが、普通にスマホで電話をすれば勝手にそのようになります。

スマホはデータ専用MVNOで運用します。
すると、「話し放題」+「MVNO」を、1台のスマホで安価に運用できるようになります。
(この辺りの話は、ここでは割愛します。)




IP電話やひかり電話を外から使う場合、また私のような変則的な運用には、高品質での通信が必須になります。
音声通信における「高品質」とは、音声パケットをいかにコンパクトに、そしてどれだけ低遅延で伝送できるかがポイントになります。

そこで、高圧縮で超低遅延の音声コーデック「Opus」の実用性について考えてみます。



【 Opusについて 】

Wikiから引用 (読み飛ばし可)
Opus(オーパス)とは、IETF によって開発され、主にインターネット上でのインタラクティブな用途に合わせて作られた非可逆音声圧縮フォーマット。RFC 6716によって標準化されたオープンフォーマットとして、リファレンス実装は3条項BSDライセンスの下で提供されている。 Opusをカバーするすべての既知のソフトウェア特許は、ロイヤリティフリーの条項の下でライセンスされている。
Opusは、スピーチ向きのSILK(英語版)と低レイテンシで音楽用途にも使えるCELT の2つのコーデックの技術を組み込んでいる。Opusは、ビットレートの高低を継ぎ目なく調節でき、内部的には、低いビットレートでは線形予測コーデック、高ビットレートでは変換コーデックを使い、途中で切り替えることも可能である(短時間はハイブリッドでオーバーラップさせられる)。Opusは会話、ネットワーク上の音楽公演やライブイベントなどでリップシンクすることができ、低遅延のオーディオ通信リンクの一部として使用するために必須な、非常に小さいアルゴリズム遅延(デフォルトでは22.5 ms)を持つ。Opus は、音声品質を犠牲にすれば、アルゴリズム遅延を最高5msまでに小さくすることができる。MP3, Vorbis, HE-AAC などの既存の音楽用コーデックは100ms以上の遅延があり、Opus はそれらよりも遅延がずっと小さいにも関わらず、ビットレートに対する品質では遜色ないものとなっている。上記の既存コーデックとは異なり、Opus は個々のファイルで巨大なコードブックの定義を必要としないため、短いショートクリップの音声にも適している。


要するに「SILK」と「CELT」の良いとこ取りをした、無料の音声コーデックと言うことです。
どうやら「Opus」を理解するためには「SILK」と「CELT」も理解しなければならないようです。


実は「SILK」に関しては、今までに相当検証をしてきました。(かつてはG-Call050が対応していました。)
結論から言って、これ以上無いというほど高音質です。
(G711μと聴き比べても差がわからないぐらい。)

そして「CELT」。
これは私が今まで知らなかったコーデックです。

CELTは「Vorbis」と「Speex」の中間に位置するコーデックのようです。

「Vorbis」については、「Vorbis」より「ogg」と言った方が知名度が高いでしょうか。その「ogg」に使わるコーデックに多いのが「Vorbis」です。
音声通話のようなリアルタイム性には向かず、音楽鑑賞のような用途に使われる超高音質コーデックです。


「Speex」についても、かつて検証を行ったコーデックのひとつです。
これは「BIGLOBEフォン・モバイル」で採用されているもので、人の声に特化しており、高圧縮にもかかわらず、高音質で聞きやすいものでした。
なお、こちらは「Vorbis」とは異なり、音声通話のようなリアルタイム性に特化しています。

(余談です。音声コーデックというとG729aが有名ですが、SILKもSpeexも、G729aとは比較にならないぐらい高音質です。)

「CELT」を更に調べていくと、このコーデックはとんでもなく低遅延なこともわかります。



【 Opusについて(その2) 】

「Opus」は前述「SILK」と「CELT」の良いとこ取り、すなわち、超高音質で超低遅延であることが期待されます。
期待と言うよりそのままです。

「Opusは、超高音質で超低遅延な無料の音声コーデックです。」

これは音声コーデックマニア(?)な私としては使ってみたくなります。
ただ、CPU負荷に関する文献が見つからず、どの程度スマホに負荷をかけるのかが明らかになっていません。

ネット上の情報によると、「SILKはG729aの3倍程度のCPU負荷である」という数字を見つけました。
と言うことはOpusも似たような数字であると考えられます。
G729aのときは、1GHz程度のCPU(シングルコア)でも、無視できる程度のCPU負荷でした。
それを考えると、最近のクアッドコアであれば「Opus」を使っても、たいしたCPU負荷にならないことが容易に想像できます。

そこで、我が家の複雑なスマホの運用方法の一貫に、Opusを取り入れてみることとしました。



【 スマホでOpusを使うことによるメリット 】

音声通信に必要なデータ量を、それぞれ有名なコーデックと比較してみます。




G.711
G.729
Opus
ビットレート
64 kbps
8 kbps
6~510 kbps(可変)
必要とする
ネットワーク帯域
95.2 kbps
39.2 kbps
31.95~1561.2 kbps(可変)

(※ネットワーク帯域は私の手計算なので、間違っていたらゴメンナサイ・・・)


この比較表を見るだけでOpusへの期待が高まります。
それと同時に、G711ではネットワークに、想像以上の負荷をかけることがわかります。

G711がいくら高音質であっても、帯域を少しでもオーバーすれば、そこでデータは途切れます。
データ通信上、これに問題はなくても、「会話」としてはあってはならないことです。
つまり、これがIP電話における「無音状態」や「ノイズ」、「音声がおかしくなる」などに値します。

話が反れました・・・。元に戻します。

Opusを利用すると、G729よりも高音質でありながら、必要な帯域をさらに抑えられることが期待できます。
また、Wi-Fi接続時には、かなりの高音質も期待できます。



【 まとめ 】

今回はすべて机上の理論です。

現在の日本の電話事情では、最高の音質が出たとしてもG711と同等レベルです。
しかし、私の予想では、圧縮過程で人声以外が除去されるOpusの方が、G711よりも聞き取りやすい音質となるのではないかと思っています。

Opusは低ビットレートでリアルタイム性を重視する、IP電話やVoIPに向いています。
その一方で、音楽鑑賞のような超高音質が必要となる帯域までをカバーしています。

これが、音声通話に特化した「Speex」や「AMR」と比較して、武器となるのか、それとも仇となるのか。
この辺りも気になるところです。

近々、同一条件下において、いくつかのコーデックを検証してみたいと思います。

今、検証したいと考えているコーデックは以下のものです。
  • G711 (すべての基準。)
  • GSM (IP電話で良く使われる。低音質だが低負荷。)
  • Opus (今回のメイン。)
  • Speex (VoIPでよく使われる。そして私好みの音質。)
  • AMR (ドコモが採用しているコーデック。)


    まだ、全く検証を行っていないため、すべて私の妄想で終わる可能性も高いです。
    そもそも、Asterisk側でこれらのコーデックにちゃんと対応されるのかもわかりません。(私の技量が足りなくて・・・。)
        
  • 19 件のコメント :

    1. こんにちは、また興味深いチャレンジを予定されてますね。


      skypeのようなp2pでは難しいですが、Web RTC型でリモートコーデックを受け入れられるサービスならOpusも使えるかもしれません。あまり利用されている環境も聞かないので、音質結果に興味があります。


      お忙しいと思いますが、レポートお待ちしています :)

      返信削除
    2. seilaliesさん

      お久しぶりです。
      AsteriskはVer12でもOpusのトランスコーディングが出来なく、少々難儀しています。
      Ver11であればパッチがあったのですが、Ver12では開発者Verでの提供しかありませんでした。

      まだほとんど手を付けていないので、もう少し格闘してみます(^O^)/

      返信削除
    3. 素朴な疑問なんですがPHSの話放題とMVNOを1台で運用できるのは分かりますが
      スマホでアクセスしてもPHSで発着信する以上は電波がかなり狭いですよね?
      都心だと支障はないかもしれませんが田舎だとPHSでは電波はきついと思いますが
      その場合はPHSではなくキャリアスマホで代用すればいいということでしょうか?
      料金面では旨みがなくなりますが。またPHSとAsteriskの連携方法を紹介したページ等はあるのでしょうか。

      返信削除
    4. セブンさん

      WertさんのW-SIMの運用方法の詳細は、小生も良く分かりませんが、GP-7XXを使用した運用方法で簡単に説明しますね。v(^o^)
      スーパー誰とでも定額のPHSの端末を持ち歩くからPHSの電波の問題が発生するんですよ。
      PHSを持ち歩か無いで、自宅のPHSの電波状況の良い場所に置きっぱなしにして使用すると言う事です。
      つまり、PHSを固定電話化すると言う事です。
      この固定電話化したPHSを格安のMVNOのSIMで
      3G/LTEでSIPアプリを使用して遠隔地から自宅のPHSで通話をすると言う事です。
      これのメリットはPHSの電波の問題をクリアする事だけでは有りません。
      最大のメリットは、このカケ放題の電話を家族、親戚一同が全員で共有して使える様に成ると言う事です。
      しかもネットが使用出来れば、地球の裏側からも只で通話が出来る様に成ると言う事です。
      電波の壁どころか、国境さへも無くなると言う事です。\(^-^)/

      返信削除
    5. wertさん

      また新しい壁を見つけましたね。v(^o^)
      G711uで満足してしまった小生には、見えない壁です。(^o^;)
      頑張ってください。(^o^)

      返信削除
    6. セブンさん

      基本的にBitBadOldManさんのおっしゃるとおりです。

      >田舎だとPHSでは電波はきつい

      室内で電波が入らないとなると、ホームアンテナが必要になると思います。

      >PHSではなくキャリアスマホで代用すればいいということでしょうか?

      これについては「No」です。
      厳密に言えばキャリアスマホで代用は出来ます。
      しかし、VoLTE対応機が前提とお考えください。(3G機でももちろん対応できますが、遅延時間に影響します。)

      しかし、そうすると最新機種しかなく高価になります。また、2200円でのカケホにも対応しなくなります。
      セブンさんのおっしゃるとおり、料金面での旨味が全く無くなってしまいます。

      よって、PHSを使ったほうが理に適っています。

      >またPHSとAsteriskの連携方法を紹介したページ等はあるのでしょうか。

      これは近々公開します。
      今のところ、私がまだ「自己満」できていないのです。

      返信削除
    7. BitBadOldManさん

      ありがとうございます。
      今のところ「GP-712」のNATの壁が高く、そちらに手こずっています(^_^;)
      Opusに手を付けられるのは、まだまだ先かもしれません(>_<)

      返信削除
    8. はい。
      壁は高ければ高い程、達成した時の喜びも大きく成ります。v(^o^)

      小生も未だに、WiFi接続とBT接続では発着信は出来るのですが、通話が出来ません。(ToT)
      公衆無線LANで1度通話出来たのですが、
      別の日に再確認したらダメでした。

      返信削除
    9. BitBadOldManさん

      NAT越えできました。
      ローカルで色々と設定していましたが、結局できずにSTUNサーバを介すことによって問題クリアです。

      自前でSTUNサーバまで用意するのは億劫なので、Googleのものを使用しています。
      なお、GP-7xx側にSTUNサーバを設定しても、音声パケットは片方向しか流れません。
      スマホ側に設定する必要があります。

      同様に、(私の環境では)ICEも片方向しか音声パケットが流れませんでした。

      返信削除
    10. BitBadOldManさん

      GoogleのSTUNサーバは以下のものです。
      stun.l.google.com:19302

      >やはりWiFi接続とBT接続ではGoogleのSTUNサーバでも通話は出来ません。((T_T))

      テザリングを使うことによって、NATが1つ増えるためでしょうか。
      ただ、それでもSTUNサーバを介せば通りそうな気がするのですが・・・。

      P.S.
      確かめてみました。(親機:L-01F)
      WiFiテザリング、BTテザリングともに通りません(>_<)
      音声パケットのUPは通じていますが、DOWNが流れてこないという状況でした。

      なお、SPモードを使ったので、グローバルIPが割り振られています。
      これで通らないとなると、テザリングは厳しいですね。
      もしかするとWiFiルータならばうまくNATを変換してくれるのかもしれませんが、こちらは未確認です。

      返信削除
    11. wertさん

      やはりダメでしたか...
      小生の場合、テザリングでの通話をしたい訳では有りません。
      公衆無線LANを使用しての【つなぐ】の通話をしたいのですが、これが出来ないのですよ。(ToT)
      自宅では公衆無線LANの電波が無いので試験が出来ないので、スマホでのWiFiテザリングを利用してWiFi接続しての通話が出来れば公衆無線LANの通話も出来るはずですので検証している次第です。(^o^;)

      返信削除
    12. wertさん

      WiFiテザリング、BTテザリングは親機と子機の組み合わせで出来るものと出来ないものが有るみたいです。
      ただ、一つ言える事はWiFi接続、BT接続した後でVPN接続すると全て通話はOKと成ります。
      多分、公衆無線LANでもWiFi接続した後でVPN接続すれば通話は出来ると思います。
      完璧なNAT越えをするには、やはりVPN接続しか無いのかなと思っています。(ToT)
      ただ、これだとVPN接続するよりWiFi接続をオフにした方が簡単ですね。(^o^;)

      返信削除
    13. BitBadOldManさん

      公衆無線LANので接続は、場所によって設備の設定自体が異なるため、確実なNAT越えは難しいと思います。
      結論としては、「公衆無線LAN使用の場合はVPNで接続する」ということでしょうね。
      セキュリティ面から考えても、きっと一番良い方法だと思います。

      返信削除
    14. wertさん

      GP-708を使用するとNAT越えは困難ですね。(ToT)
      会社のIP-PBXを構築した際は、今回の様なNAT越えの問題は一切発生していないんですよ。自宅のWiFiでも公衆無線LANでも何もしなくても普通に通話が出来ます。
      WiFiテザリングでもBTテザリングでも全て問題有りませんでした。
      使用するIP-PBXにもかなり依存する見たいですね。(^o^;)

      返信削除
    15. wertさん

      ヤフオクでWX03SHを新品・未使用で6510円で落札しました。(^o^;)
      で、スマホとの連携機能を色々と試験して見ました。Nexus5とは相性が悪い見たいで、小生の想定した動作には成っていません。((T_T))

      一番やりたかったのは、WX03SHで【つなぐ】の発着信と通話を出来る様にしたかったのですが、Groundwireのアプリが一覧に出て来ません。Csipsimpleも出て来ません。出るのは標準の通話アプリとSkype等のSIPアプリだけです。(ToT)
      で、スマホで発着信をして通話だけは出来るだろうと思っていたら、こちらの声は届くのですが、相手の声が聞こえません。
      通話アプリに寄って動作が異なる見たいです。SIPアプリは大半は一方通行に成ります。何故かViberだけは問題無く通話出来ます。(^o^;)

      で、面白い事を発見しました。
      標準の通話アプリには【つなぐ】のSIPアカウントを設定して有るのですが、これで発着信は出来るのですが通話はお互いに無音に成るのは、以前の試験で確認済みです。
      WX03SHから発信すると、不思議な事にお互いに通話が出来てしまうんですよ。
      但し、通話品質はかなり悪いです。
      また、30秒程で強制的に切断されるのは
      同じです。

      また、iphone4sは適合端末ですが標準の通話アプリしか発着信が出来ません。
      iphone4sで【つなぐ】の発着信をしても通話は一方通行に成るのは同じです。((T_T))

      返信削除
    16. wertさん

      WX03SHで【つなぐ】の発着信の制御と通話が出来る様に成りました。(^o^)
      スマホ側の標準の通話アプリに下記のSIPアカウントを全て設定するとWX03SHだけで通話が出来る様に成ります。
      ・【つなぐ】
      ・050IP電話
      ・会社の内線電話
      ・自宅のひかり電話
      PHSの端末でスマホの電話を完璧に制御出来るのは標準の電話アプリだけ見たいです。LINEは着信音はPHSに鳴動するのですが、応答ボタンが表示されないのでスマホで応答する必要が有ります。(ToT)
      後はスマホのGmailをPHSの端末で受信出来るのですが、これがまだ出来ていません。

      取り敢えず小生のやりたかった事の8割方は出来ましたので満足です。\(^-^)/

      返信削除
    17. BitBadOldManさん

      最初、何をしようとしているのかが理解できていませんでした。(やっとわかった!)
      現在のBitBadOldManさんの構成は以下のような感じですね?

      PHS →【つなぐ】→ Nexus5 →【BT】→ WX03SH

      (Nexus5には各SIPアカウントが登録されている状態)

      すごいことをなさっていますね!
      なるほどこれは、人によっては物凄いメリットが詰まっています。

      それにしても、「PHS-BT-VoIP-3G網-スマホ-BT-PHS」こんな構成はきっと世界でただ一人、BitBadOldManさんだけだと思いますよ(笑)

      >PHSの端末で通話するとSIPアプリで直接通話するより音質がかなり良く成った気がします。(^o^)

      これってもしかして内部処理をバイパスしているのでしょうか???
      端末のSIPアプリは、コーデックがGSM固定でしょうから、通常ですと音質はかなり低下すると思います。
      さらに、BTにより再エンコードがかかるため、音質低下に拍車をかけそうなものですが・・・。
      もし内部処理をバイパスできるようであれば、色々チャレンジしたくなります。(妄想が膨らみます)
      うーん・・・、深くは考えないことにします!(^_^;)

      >Csipsimpleも出て来ません。

      CSipSimpleは「標準通話アプリ」を選んだ後に選択できるように設定できます。(CSipSimple内の設定から)

      返信削除
    18. Wertさん

      小生のやりたかった事を理解して頂きありがとうございます。
      世界広しといえ、小生のやりたかった事を理解して貰えるのは、小生が唯一同志と認めたwertさんだけかなと思っています。(^o^)
      カミさんに自慢しても何が凄いのか分からない人にはいくら説明しても理解して貰えるません。((T_T))
      一人でも理解して貰える人がいると嬉しいですね。持つべき者は友よりも同志ですね。\(^-^)/

      シロートにはLineの無料の通話がPHSで出来る事に驚いているんですよ。
      それは特別なスキルが無くても誰にでも出来る事なんですけどね。(^o^;)

      因みににPHSの端末だと音質が良く成るのは、スーパーソニックレシーバの機能の性かなと思っています。
      一時期流行った骨伝導による通話の為、音声がかなりクリアに聞こえるのかなと思っています。
      IP電話でもかなりクリアに聞こえますが、流石に遅延だけは解消は出来ませんね。(^o^;)

      返信削除
    19. BitBadOldManさん

      >カミさんや同僚に自慢しても何が凄いのか分からない人にはいくら説明しても理解して貰えません。((T_T))

      普通は理解できませんっ!(笑)
      通信系に精通している人でも、なかなか理解はできないのではないでしょうか。
      色々なジャンルの集合体みたいな方法ですからね。

      >因みににPHSの端末だと音質が良く成るのは、スーパーソニックレシーバの機能の性かなと思っています。

      これはやはり効果あるのでしょうね。
      確かに、音質云々というより「聞き取りやすい」です。

      >NAT越えの険しい壁が見えない人には理解出来ない話ですよね。

      これは越えてみないとわからない話ですよね。
      理屈の上では越えられるはずなのに、なぜか越えられなかったり、せっかく越えたのに帰ってこれなかったり(笑)

      「NAT」については、普段何気なく使っているルータの凄さを思い知りました。

      返信削除