$30 off During Our Annual Pro Sale. View Details »

WebRTC の映像を Python から自由に加工する sora-python-sdk の仕組み

tnoho
June 30, 2023

WebRTC の映像を Python から自由に加工する sora-python-sdk の仕組み

WebRTC Meetup Tokyo #24 で発表させていただきました。
WebRTC の映像を Python から自由に加工する sora-python-sdk の仕組み
の資料です。

WebRTC Meetup Tokyo #24
https://webrtcmeetup.connpass.com/event/284848/

Sora Python SDK
https://github.com/shiguredo/sora-python-sdk

tnoho

June 30, 2023
Tweet

More Decks by tnoho

Other Decks in Programming

Transcript

  1. 自己紹介 @tnoho うぇぶふろんとえんどえんじにゃー🐈 良く書く組み合わせ: React, Redux, TypeScript, BootStrap, Sass, Java,

    Go 最近書きたいの: Svelte 書いてると自己満足できるの: C++ (14 以降に限る) 書かないか?と言われるとイラっとするの: Rust
  2. Sora Python SDK って? 時雨堂社の WebRTC SFU Sora に Python

    から接続できるライブラリ 特徴 • Python で WebRTC のメディアチャネルとデータチャネルを扱える • Chrome の WebRTC 実装である libwebrtc を採用 • Sora C++ SDK をベースとし、各種メディアアクセラレータに対応 ←Python が 36% あるように見えますが、ほとんどビルドスクリプトなので  ライブラリ本体の Python は 28 行しかありません
  3. Sora Python SDK で目指したところ WebRTC のメディアストリームを手軽に扱えるようにする 気を遣ったところ • Python らしく雑に扱える

    • 既存の機械学習が使いやすいよう OpenCV や Pillow が併用できる • サーバーとかでも動かせるようにデバイスは巻き込まない • JavaScript レベルの WebRTC の自由度は損なわない
  4. サンプル2: 映像受信 OnTrack で受け取った VideoTrack を VideoSink にセットすれば、 フレームが来るたび VideoSink

    の OnFrame が呼ばれる! 引数で渡される frame はそのまま、 OpenCV の imshow に渡せる!
  5. サンプル3: 1 に顔隠し追加 というわけで、割と簡単に Google の機械学習ライブラリ mediapipe の 高速顔検出で検出した顔に Python

    で一般的な画像加工ライブラリ Pillow を使って画像を重ねるとかできる! 座標変換とかの方がだるい!
  6. サンプル4: 音声受信 OnTrack で受け取った AudioTrack を AudioSink にセットすれば、 受信データを read

    で読みだせる! read で読み出したデータを sounddevice に渡せば再生できる!
  7. libwebrtc のデフォルトの Audio 処理 RemoteAudioTrack … … EchoCanceller AudioInputDevice …

    AudioMixer AudioOutputDevice Remix Resample OnData … LocalAudioTrack 特に設定しないと 3 本まで 出力音でエコキャンする 当たり前だけど ブラウザは違うよ AudioMixer の前に 出力するRemoteTrack のチャネル数と サンプリングレートを合わせる ループを回してるのはコイツ AudioTrack の OnData はここで呼ばれる 発表後追加 今後は制限がなくなるようです
  8. sora-python-sdk の Audio 処理 RemoteAudioTrack … … … DummyAudioMixer DummyAudioOutputDevice

    Remix Resample OnData … SoraAudioSink Remix Resample Buffer Read 全 RemoteTrack をカバーする ループを回してるのはコイツ 出力もエコキャンもしないので ループを回すだけ 全 Track のチャネル数とサンプリングレートを合 わせる必要はないのでここでやる 10ms ごと 10ms ごとにコールバックされると辛い 貯めてユーザープログラム側から読む
  9. Sora Python SDK の構造 Sora C++ SDK libwebrtc nanobind ユーザープログラム

    シグナリング メディア アクセラレーター Audio 処理系 PeerConnection Track Source Sink Python nanobind だけだと GC がうまくいかなかった Sora C++ SDK はアシストライブラリみたいなものなので、 メディア処理は自由にカスタムできる Momo の匂いが残ってる libwebrtc って PeerConnectionFactory 経由で中の挙動弄れるんです pybind11 っていう幅広く使われてる兄がいる ndarray のハンドリングが早くなったと聞いて採用
  10. なぜ libwebrtc を使うのか WebRTC のプロトコルスタック実装自体はいくつかあるが、 WebRTC と同時に生まれた libwebrtc にクライアントとして匹敵するものはない •

    C++ で書かれていて高速である • フィードバック制御が網羅されている • 全ての SFU や WebRTC クライアントのチューニングの基準になっている • Simulcast がちゃんと動く • リップシンクで音声と映像の同期が取れるようにケアされる • ペーサーでビットレートがコントロールされる…などなど
  11. 今後について なんだかんだで GIL (排他制御) が辛いのでなるべく SDK にオフロードしたい 例: Audio のルートをもう少し変えたい

    OnData には流れてこない AudioFrame に含まれる VAD の情報などが欲しい VAD があれば、機械学習などに流す時に全てを流す必要がなくなる PeerConnection 受信のみ RemoteVideoTrack RemoteAudioTrack PeerConnection 送信のみ VideoSink Python(加工) VideoSource
  12. EOF