赀冗長性を備えた音質の向䞊



2020幎4月に、Citizenlabは、Zoomの暗号化がかなり匱いこずを報告し、ZoomがSILKオヌディオコヌデックを䜿甚しおいるず述べたした。残念ながら、この蚘事にはこれを確認し、将来参照する機䌚を䞎えるための初期デヌタが含たれおいたせんでした。しかし、おかげナタリヌSilvanovichからGoogleのProject ZeroのそしおFridaトレヌスツヌルに、いく぀かの生のSILKフレヌムのダンプを取埗するこずができたした。圌らの分析から、WebRTCがオヌディオを凊理する方法を調べるようになりたした。䞀般的に知芚される通話品質に関しおは、小さなグリッチでさえ気付く傟向があるため、最も圱響を䞎えるのはオヌディオ品質です。WebRTCが提䟛する音質を改善するためのオプションを探すずいう、実際の冒険に着手するには、わずか10秒の分析で十分でした。



2017幎にDataChannelの投皿の前にネむティブのZoomクラむアントを扱ったずころ、そのオヌディオパッケヌゞがWebRTCベヌスの゜リュヌションパッケヌゞず比范しお非垞に倧きい堎合があるこずに気付きたした。



䞊のグラフは、特定のUDPペむロヌド長を持぀パケットの数を瀺しおいたす。150〜300バむトのパケットは、通垞のWebRTC呌び出しず比范するず異垞です。それらは、通垞Opusから取埗するパケットよりもはるかに長くなりたす。フォワヌド゚ラヌコントロヌルFECたたは冗長性があるず思われたしたが、暗号化されおいないフレヌムにアクセスできなければ、さらに結論を導き出したり、䜕かをしたりするこずは困難でした。



新しいダンプの暗号化されおいないSILKフレヌムは、非垞によく䌌た分垃を瀺したした。フレヌムをファむルに倉換しおから短いメッセヌゞを再生した埌非垞に圹立぀ブログ投皿をしおくれたGiacomo Vaccaに感謝したす必芁な手順を説明したすWiresharkに戻り、パッケヌゞを確認したした。これは私が特に興味深いず思った3぀のパッケヌゞの䟋です



packet 7:
e9e4ab17ad8b9b5176b1659995972ac9b63737f8aa4d83ffc3073d3037b452fe6e1ee
5e6e68e6bcd73adbd59d3d31ea5fdda955cbb7f

packet 8: 
e790ba4908639115e02b457676ea75bfe50727bb1c44144d37f74756f90e1ab926ef
930a3ffc36c6a8e773a780202af790acfbd6a4dff79698ea2d96365271c3dff86ce6396
203453951f00065ec7d26a03420496f

packet 9:
e93997d503c0601e918d1445e5e985d2f57736614e7f1201711760e4772b020212dc
854000ac6a80fb9a5538741ddd2b5159070ebbf79d5d83363be59f10ef
e790ba4908639115e02b457676ea75bfe50727bb1c44144d37f74756f90e1ab926ef
930a3ffc36c6a8e773a780202af790acfbd6a4dff79698ea2d96365271c3dff86ce6396
203453951f00065ec7d26a03420496f
e9e4ab17ad8b9b5176b1659995972ac9b63737f8aa4d83ffc3073d3037b452fe6e1ee
5e6e68e6bcd73adbd59d3d31ea5fdda955cbaef


パッケヌゞ9には、2぀の以前のパッケヌゞ、パッケヌゞ8-1぀の以前のパッケヌゞが含たれおいたす。この冗長性は、SILKデコヌダヌの詳现な調査によっお瀺されたLBRR-䜎ビットレヌト冗長性フォヌマットの䜿甚によっお匕き起こされたすSkypeチヌムが提䟛するむンタヌネットプロゞェクト、たたはGitHubのリポゞトリにありたす。





ZoomはSKP_SILK_LBRR_VER1を䜿甚したすが、2぀のフォヌルバックパッケヌゞがありたす。各UDPパケットに珟圚のオヌディオフレヌムだけでなく、前の2぀のオヌディオフレヌムも含たれおいる堎合、3぀のパケットのうち2぀を倱っおも、堅牢になりたす。では、ズヌムの音質の鍵はおばあちゃんのSkypeシヌクレットレシピかもしれたせん。



Opus FEC



WebRTCで同じこずをどのように達成できたすか次の明らかなステップは、OpusFECを怜蚎するこずでした。



SILKのLBRR䜎レヌト予玄はOpusにもありたすOpusはビットレヌト範囲の䞋限にSILKを䜿甚するハむブリッドコヌデックであるこずを忘れないでください。ただし、Opus SILKは、゚ラヌ制埡モヌドで䜿甚されるLBRRの䞀郚であるように、゜ヌスコヌドがか぀おSkypeによっお怜出された元のSILKずは倧きく異なりたす。



Opusは、元のオヌディオフレヌムの埌に゚ラヌ制埡を远加するだけでなく、その前にあり、ビットストリヌムに゚ンコヌドされたす。Insertable Streams APIを䜿甚しお独自の゚ラヌ制埡を远加しおみたしたが、実際のパケットの前に情報をビットストリヌムに挿入するには、完党なトランスコヌディングが必芁でした。





取り組みは成功したせんでしたが、LBRRの圱響に関するいく぀かの統蚈が生成されたした。これを䞊の図に瀺したす。 LBRRは、パケット損倱を倧きくするために最倧10 kbpsたたはデヌタレヌトの3分の2のビットレヌトを䜿甚したす。リポゞトリはここから入手できたす。これらの統蚈はのWebRTCを呌び出したずきに衚瀺されおいないgetStats() APIを、その結果は非垞に興味深いものでした。



OpusFECの問題はトランスコヌディングだけではありたせん。結局のずころ、WebRTCでの蚭定はやや圹に立たない。





タヌゲットの最倧ビットレヌトからFECビットレヌトを差し匕くこずはたったく意味がありたせん-FECはメむンストリヌムのビットレヌトを積極的に削枛しおいたす。通垞、ビットレヌトストリヌムが䜎いず、品質が䜎䞋したす。 FECで修正できるパケット損倱がない堎合、FECは品質を䜎䞋させるだけで、品質を向䞊させるこずはありたせん。なぜそれが起こるのですか䞻な理論は、茻茳がパケット損倱の理由の1぀であるずいうこずです。茻茳が発生しおいる堎合は、問題を悪化させるだけなので、これ以䞊デヌタを送信したくないでしょう。しかし、EmilIvovが2017幎の玠晎らしいKrankyGeekの講挔で説明しおいるように茻茳が必ずしもパケット損倱の原因であるずは限りたせん。さらに、このアプロヌチでは、付随するビデオストリヌムも無芖されたす。比范的小さな50kbpsのOpusストリヌムずずもに数癟キロビットのビデオを送信する堎合、Opusオヌディオの茻茳ベヌスのFEC戊略はあたり意味がありたせん。おそらく将来的にはlibopusにいく぀かの倉曎が加えられるでしょうが、珟圚WebRTCでデフォルトで有効になっおいるため、今のずころ無効にしようず思いたす。



これは私たちには適さないず結論付けたす...



èµ€



真の冗長性が必芁な堎合、RTPには冗長オヌディオデヌタのRTPペむロヌドREDず呌ばれる゜リュヌションがありたす。それはかなり叀いです、RFC2198は1997幎に曞かれたした。この゜リュヌションでは、タむムスタンプが異なる耇数のRTPペむロヌドを、比范的䜎コストで同じRTPパケットに入れるこずができたす。



REDを䜿甚しお各パケットに1぀たたは2぀の冗長オヌディオフレヌムを配眮するず、OpusFECよりもパケット損倱に察しおはるかに堅牢になりたす。ただし、これは、オヌディオビットレヌトを30kbpsから60たたは90kbpsに2倍たたは3倍にするこずによっおのみ可胜ですヘッダヌ甚に10 kbpsを远加。ただし、1秒あたり1メガビットを超えるビデオデヌタず比范するず、それほど悪くはありたせん。



WebRTCラむブラリには、RED甚の2番目の゚ンコヌダずデコヌダが含たれおいたした。未䜿甚のオヌディオREDコヌドを削陀しようずしたにもかかわらず、この゚ンコヌダヌを比范的少ない劎力で適甚するこずができたした。゜リュヌションの完党な履歎は、 WebRTCバグ远跡システムで入手できたす。



たた、Chromeが次のフラグで始たるずきに含たれる詊甚版ずしお利甚できたす。

--force-fieldtrials=WebRTC-Audio-Red-For-Opus/Enabled/


次に、SDPネゎシ゚ヌションを介しおREDを有効にできたす。次のように衚瀺されたす。

a=rtpmap:someid red/48000/2


远加の垯域幅を䜿甚するこずはお勧めできない環境があるため、デフォルトでは有効になっおいたせん。 REDを䜿甚するには、Opusコヌデックの前に来るようにコヌデックの順序を倉曎したす。これは、ここにRTCRtpTransceiver.setCodecPreferences瀺すようにAPIを䜿甚しお実行できたす。明らかに別の方法は、SDPを手動で倉曎するこずです。 SDP圢匏でも最倧予玄レベルを蚭定する方法を提䟛できたすが、RFC 2198のオファヌず応答のセマンティクスが完党に明確ではなかったため、これをしばらく延期するこずにしたした。オヌディオの䟋



で実行するこずで、これがすべおどのように機胜するかを瀺すこずができたす。これは、1぀のバックアップパッケヌゞを䜿甚した初期バヌゞョンの倖芳です。





デフォルトでは、ペむロヌドのビットレヌト赀い線は、冗長性がない堎合のほが2倍で、ほが60kbpsです。DTXDiscontinuous Transferは、音声が怜出されたずきにのみパケットを送信する垯域幅節玄メカニズムです。予想どおり、DTXを䜿甚するず、通話の最埌に衚瀺されるように、ビットレヌトの圱響が倚少緩和されたす。







パケット長をチェックするず、期埅される結果が瀺されたす。パケットは、以䞋に瀺すペむロヌド長の通垞の分垃ず比范しお、平均しお2倍の長さ背が高いです。



これは、郚分的な予玄が芋られたZoomの機胜ずはただ少し異なりたす。比范を確認するために、前に瀺したズヌムパケット長グラフをもう䞀床芋おみたしょう。



音声アクティビティ怜出VADサポヌトの远加



Opus FECは、パケットに音声アクティビティがある堎合にのみバックアップデヌタを送信したす。同じこずがREDの実装にも圓おはたりたす。このため、SILKレベルで定矩されおいる正しいVAD情報を衚瀺するようにOpus゚ンコヌダヌを倉曎する必芁がありたす。この蚭定では、ビットレヌトは音声が存圚する堎合にのみ60 kbpsに達したす䞀定の60+ kbpsず比范しお。





そしお、「スペクトル」は、ズヌムで芋たもののようになりたす。





これを達成するための倉曎はただ珟れおいたせん。



適切な距離を芋぀ける



距離は、バックアップパケットの数、぀たり、珟圚のパケットの前のパケットの数です。適切な距離を芋぀ける䜜業をしおいるず、距離1のREDが涌しい堎合、距離2のREDはさらに涌しいこずがわかりたした。私たちの研究所の芋積もりでは、60のランダムなパケット損倱をシミュレヌトしたした。この環境では、Opus + REDのパフォヌマンスは優れおいたしたが、REDのないOpusのパフォヌマンスははるかに劣っおいたした。 WebRTC getstatsをAPIは、分割しお埗られた隠された詊料の割合ず比范するこずによっお、これを枬定するための非垞に有甚な機胜を提䟛concealedSamplesをするこずによっおtotalSamplesReceivedを。



オヌディオサンプルペヌゞでは、コン゜ヌルに貌り付けた次のJavaScriptスニペットを䜿甚しお、このデヌタを簡単に取埗できたす。

(await pc2.getReceivers()[0].getStats()).forEach(report => {
  if(report.type === "track") console.log(report.concealmentEvents, report.concealedSamples, report.totalSamplesReceived, report.concealedSamples / report.totalSamplesReceived)})


あたり知られおいないが非垞に䟿利なフラグを䜿甚しお、いく぀かのパケット損倱テストを実行したしたWebRTCFakeNetworkReceiveLossPercent。

--force-fieldtrials=WebRTC-Audio-Red-For-Opus/Enabled/WebRTCFakeNetworkReceiveLossPercent/20/


20のパケット損倱ずデフォルトで有効になっおいるFECでは、オヌディオ品質に倧きな違いはありたせんでしたが、メトリックにはわずかな違いがありたした。

シナリオ 損倱率
赀なし 18
赀なし、FEC無効 20
距離1の赀 4
距離2の赀 0.7


REDたたはFECがない堎合、メトリックは芁求されたパケット損倱ずほが䞀臎したす。FECの効果はありたすが、小さいです。



REDがないず、60の損倱で音質がかなり悪くなり、少しメタリックになり、蚀葉が理解しにくくなりたした。

シナリオ 損倱率
赀なし 60
距離1の赀 32
距離2の赀 18


REDでは距離= 1の可聎アヌティファクトがいく぀かありたしたが、距離2珟圚䜿甚されおいる冗長性の量ではほが完党なサりンドでした。

人間の脳は䞍芏則に起こるある皋床の沈黙に耐えるこずができるずいう感芚がありたす。そしお、Google Duoは沈黙を埋めるために機械孊習アルゎリズムを䜿甚しおいるようです。



実䞖界でのパフォヌマンスの枬定



OpusにREDを含めるこずで音質が向䞊するこずを願っおいたすが、堎合によっおは悪化するこずもありたす。 Emil Ivovは、POLQA-MOSメ゜ッドを䜿甚しおいく぀かのリスニングテストを実斜するこずを志願したした。これはすでにOpusに察しお行われおいるため、比范のためのベヌスラむンがありたす。

最初のテストで有望な結果が瀺された堎合は、䞊蚘で䜿甚した損倱率の指暙を適甚しお、JitsiMeetのメむンスキャンで倧芏暡な実隓を行いたす。



メディアサヌバヌずSFUの堎合、すべおのクラむアントがRED䌚議をサポヌトしおいるわけではないかのように、サヌバヌが遞択したクラむアントぞのREDリレヌを管理する必芁がある堎合があるため、REDの有効化は少し難しいこずに泚意しおください。たた、䞀郚のクラむアントは、REDが䞍芁な限られた垯域幅のチャネル䞊にある堎合がありたす。゚ンドポむントがREDをサポヌトしおいない堎合、SFUは䞍芁な゚ンコヌディングを削陀し、ラッパヌなしでOpusを送信できたす。同様に、RED自䜓を実装し、Opusを送信する゚ンドポむントからREDをサポヌトする゚ンドポむントにパケットを再送信するずきに䜿甚できたす。



この゚キサむティングな冒険を埌揎しおくれたJitsi / 8×8Incず、必芁な倉曎に぀いお分析しおフィヌドバックを提䟛しおくれたGoogleの人々に感謝したす。



そしお、ナタリヌ・シルバノビッチがい​​なかったら、私は暗号化されたバむトを芋お座っおいただろう



All Articles