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側でこれらのコーデックにちゃんと対応されるのかもわかりません。(私の技量が足りなくて・・・。)