
サーバーレス、ピアツーピア、音声によるローカルファイル共有
WebRTCシグナリングを音で行うための概念実証です。マイクとスピーカーを備えたすべてのデバイスで動作します。ブラウザ上で実行します。
近くのデバイスは、一連のオーディオトーンを介して必要なSession Description Protocol (SDP)データを交換することで、WebRTC接続をネゴシエーションします。ネゴシエーションが成功すると、ブラウザ間でローカルのWebRTC接続が確立され、LAN経由でデータを交換できるようになります。
動作の様子(2分の動画):
自分で試す: ggerganov.github.io/wave-share
最新ニュース:
データオーバーサウンドのアルゴリズムを ggwave というスタンドアロンライブラリに抽出しました。
他のプロジェクトに簡単に組み込むことができます。
WebRTC 技術により、異なるデバイス上で動作する2つのブラウザが互いに接続し、データを交換できます。プラグインのインストールやアプリケーションのダウンロードは必要ありません。接続を開始するために、ピアは連絡先情報(IPアドレス、ネットワークポート、セッションIDなど)を交換します。このプロセスを「シグナリング」と呼びます。WebRTC仕様ではシグナリングの標準は定義されておらず、連絡先の交換は任意のプロトコルや技術で実現できます。
このプロジェクトでは、シグナリングを音を使って行います。シグナリングのシーケンスは次のようになります:

説明したシグナリングシーケンスにはシグナリングサーバーは関与しません。そのため、例えば音によるシグナリングを使用するアプリケーションは静的なWebページで提供できます。唯一の要件は、オーディオ出力/キャプチャデバイスを制御できることです。
現在のアプローチの明らかな制限(機能)は、近くのデバイス(例:同じ部屋の中)どうしでしか接続を確立できないことです。さらに、NATが利用できないため、デバイスは同じローカルネットワークに接続されている必要があります。
音で通信されるデータには、WebRTC接続を初期化するために必要な連絡先情報が含まれています。このデータは Session Description Protocol (SDP) 形式で保存されます。データオーバーサウンドには帯域幅と堅牢性の点で大きな制限があるため、送信するデータはできるだけ少なくすることが望ましいです。そのため、SDPからは無関係な情報をすべて取り除き、接続の確立に必要なデータのみを送信します。現在、最小限のSDPデータを含むサウンドパケットは以下の形式です:
音声パケットの合計サイズは112バイトです。現在のオーディオエンコーディングアルゴリズムでは、SDPパケットは5〜10秒で送信できます(使用するTxプロトコルに依存)。低速なプロトコルを使用すると、ノイズの多い環境や通信デバイスが離れている場合により信頼性の高い送信が可能です。
現在のアプローチでは、マルチ周波数 Frequency-Shift Keying (FSK) 変調方式を使用しています。送信するデータは最初に4ビットのチャンクに分割されます。各時刻において、6つのトーンを使用して3バイトが送信されます — 各4ビットチャンクに対して1トーンです。6つのトーンは、96の等間隔の周波数に分割された4.5kHzの範囲で発せられます:
すべてのプロトコルで: dF = 46.875 Hz。非超音波プロトコルでは: F0 = 1875.000 Hz。超音波プロトコルでは: F0 = 15000.000 Hz。
利便性のため、シンプルなWebRTCハック を使用してマシンのローカルIPアドレスを自動検出しているため、手動で指定する必要はありません。ただし、最新のWebRTC仕様ではセキュリティ上の理由からこれが不可能になっているため、いずれこの「機能」はすべてのブラウザで動作しなくなります。例えば、Safariではすでに動作しません。
wave.wasmEmscriptenコンパイラが必要です。compile.sh スクリプトを実行してください。
wave-share重要: このCLIツールは、現在スタンドアロンライブラリである ggwave のプロトタイプでした。このデータオーバーサウンド通信方式の応用に関する最新の例が含まれているので、ぜひチェックしてください。
これは、説明した wave-share サウンドTx/Rxプロトコルを使用してデータを受信および送信するシンプルなツールです。標準入力にテキストを入力してEnterキーを押すと送信されます。
# ビルド
git clone https://github.com/ggerganov/wave-share
cd wave-share && mkdir build && cd build
cmake ..
make
# 実行
./wave-share
CLIツールの使用方法を示す短い動画:
| サイズ [B] | 説明 |
|---|
| 1 | SDPのタイプ - オファーまたはアンサー |
| 1 | パケットサイズ(バイト単位、ECCバイトは含まない) |
| 4 | 送信ピアのIPアドレス |
| 2 | 通信に使用するネットワークポート |
| 32 | セッションデータのSHA-256フィンガープリント |
| 40 | ICE認証情報 - 16バイトのユーザー名 + 24バイトのパスワード |
| 32 | 送信時のエラー訂正に使用するECC訂正バイト |
| 周波数 [Hz] | 値 [ビット] | 周波数 [Hz] | 値 [ビット] | ... | 周波数 [Hz] | 値 [ビット] |
|---|
F0 + 00*dF | チャンク0: 0000 | F0 + 16*dF | チャンク1: 0000 | ... | F0 + 80*dF | チャンク5: 0000 |
F0 + 01*dF | チャンク0: 0001 | F0 + 17*dF | チャンク1: 0001 | ... | F0 + 81*dF | チャンク5: 0001 |
F0 + 02*dF | チャンク0: 0010 | F0 + 18*dF | チャンク1: 0010 | ... | F0 + 82*dF | チャンク5: 0010 |
| ... | ... | ... | ... | ... | ... | ... |
F0 + 14*dF | チャンク0: 1110 | F0 + 30*dF | チャンク1: 1110 | ... | F0 + 94*dF | チャンク5: 1110 |
F0 + 15*dF | チャンク0: 1111 | F0 + 31*dF | チャンク1: 1111 | ... | F0 + 95*dF | チャンク5: 1111 |