先日 Google から低ビットレートでの音声通話を実現する Lyra の V2 が発表されました。
どのくらい低ビットレートかというと 6 kbps です。Opus が普通 32k~64k なので、1/5 です。転送量が 1/5 になると考えると、わけがわかりません。
リアルタイムコミュニケーションにおいて、音声は最重要です。なぜなら映像は乱れても困らない場合がありますが、音声が聞き取れない場合はどうしようもなくなるためです。
そのため、Lyra のような低ビットレートで音声通話を実現できるコーデックは理想となるのですが、 Lyra は独自コーデックということもあり、WebRTC でさくっと動くわけではありません。そもそも WebRTC で利用できるコーデックというのは決められています。
Lyra を WebRTC で利用する
まず思いつくのは DataChannel を利用して音声を流してしまおうというところでしょうか、ただこれだと映像とのリップシンクが行われなくなりメリットが全くなくなります。
音声データを DataChannel で流すという戦略は WebRTC を使うのであれば悪手です。
となると、まずは自由に手を入れられないブラウザを諦めてそれ以外のプラットフォームで利用可能にするという戦略をとることにしました。
ただし Lyra は WebRTC で利用している SDP や RTP 向けの仕様は一切ありません。であれば、仕様を勝手に作ってしまうことにします。Opus の仕様を真似して以下のような SDP を考えました。
a=rtpmap:109 lyra/16000/1
a=fmtp:109 version=1.2.0;bitrate=6000;usedtx=1
Lyra は 16khz でシングルチャネルなので 16000/1 としています。/1 は本来いらないのですがマルチチャネル関連のコードがあったので /1 としています。
また、Lyra はまだ開発途上でバージョン毎に互換性が失われる可能性があるので、version を指定できるようにしたのと、ビットレートが 3.2 / 6 / 9.2 とあるのでそれも指定できるようにし、DTX も有効/無効が選択できるようにしました。前述したとおりマルチチャネル関連のコードがあったのですが、Lyra 開発者が「今はステレオに対応していない」と名言していたのでここちらの設定では省略しました。
この SDP を WebRTC SFU Sora の libwebrtc ベースの C++ SDK で利用可能にしたものが、以下のブランチです。
この SDK を利用する前提で、C++ 側での実装をしています。そのため Lyra を libwebrtc のコーデックの一つとして扱っていますので、音声は Lyra で映像は AV1 という配信が可能になります。もちろん Opus との併用も可能になります。
WebRTC SFU での Lyra 対応
自社製品はすでに独自 SDP を処理できるようにしてあります。Sora Labo の Canary にデプロイ済みです。
ブラウザで WebRTC MediaChannel + Lyra 対応
まだ、うまくいくかはわかりませんが、ブラウザでの WebRTC MediaChannel で Lyra も実現する予定です。楽しみにしててください。Lyra を気軽に使える環境を提供していければと思います。
WebAssembly を利用して Lyra をブラウザ上で試すサンプルが公開されていましたので、ここで紹介しておきます。是非 Lyra のすごさに触れてみてください。これは 3kbps
ソースコードは以下で公開されています。
Lyra V2 は「音声通話」に特化しているため音楽などには全く向いていません。
音楽には Meta が開発した EnCodec が良さそうです。
サンプルが以下で試せるので是非試してみてください。