Cancel
HLS A/Bセグメント方式のフォレンジック電子透かしを、2セッション分の音声だけで相殺します。
透かしの解析と除去手法の検証のために作った非公式ツールです。透かしを埋め込んでいる 配信元とは無関係で、いかなる提携もありません。 ファイルはどこにも送信されません。すべてブラウザ内で処理されます。
同じ楽曲の配信を 2 セッション分 ダウンロードして、両方を投入してください。 2 本の系列が食い違う epoch では A版と B版の両方が揃うので、平均すれば透かしが 相殺されます。一致する epoch は変種が 1 つしかないので手を付けません。
この手法は現在の検証器に対策されました。
epoch ごとの時間軸探索(decoder_mode: time-scale-recovery)が実装され、
±0.30% では score 5.134 で特定されます。記録として残してあります。
完了
制約と、その中でできること
この方式は配信を 4.096 秒の epoch に区切り、各 epoch を A版・B版どちらで 配信したかの並びでユーザーを識別します。検証器は 3 つの層を見ています。
- 同期層 — パイロットで音声の時間軸を掴む
- 時刻層 — epoch 番号を認証する(
time_evidence_ratio) - 識別層 — A/B のシンボルを読む(
symbol_erasure_ratio)
さらに層どうしの整合性を見る改竄検出が入っています。時刻層が完璧なのに
識別層だけが大きく壊れていれば、それは自然な劣化ではありえない。透かしを派手に消す手法は
ここで tampered と判定されます。
このツールが使うのは 2 セッション分の音声だけで、epoch ごとに変種を 選び直すこと(mix-and-match)はしません。できるのは、正当に取得した 2 本に対する 信号処理だけです。
2 本の系列が食い違う epoch では A版 = x + w と B版 = x − w の
両方が手元にあるので、平均すれば w が相殺されて原音 x が残ります。
一致する epoch は変種が 1 つしかないので触りません。
実測では 2 本の系列が食い違うのは 25〜41% でした。記号の出現確率が epoch ごとに偏っているため、偶然の 50% より少なくなります。それでも相殺した分だけ スコアが閾値を割ります。
| 手法 | score | 閾値 | erasure | 判定 |
|---|---|---|---|---|
| 無加工 | 5.716 | 4.448 | 0.000 | 特定される |
| デシンクロ ±0.30%(1ファイル) | 5.134 | 4.448 | 0.048 | 特定される |
| 2セッション相殺(食い違い 29%) | 3.977 | 4.565 | 0.111 | 検出なし・特定不能 |
| 2セッション相殺(食い違い 29%) | 3.699 | 4.568 | 0.127 | 検出なし・特定不能 |
| 2セッション相殺(食い違い 41%) | 3.114 | 4.570 | 0.095 | 検出なし・特定不能 |
| — ここから下は v4 の対策後(閾値が引き下げられ、相殺のみでは通らなくなった)— | ||||
| 相殺のみ | 4.113 | 3.806 | 0.095 | 特定される |
| + 位相 ±14 ms(既定 seed) | 3.574 | 3.806 | — | 特定不能(余裕 6%) |
| + 位相 ±14 ms(実現を24本から選択) | 3.258 | 3.806 | 0.100 | 検出なし・特定不能(余裕 14%) |
相殺した epoch のうち実際に erasure になるのは一部で、比率は 0.10〜0.13 に収まります。
改竄検出はこの水準では作動しませんでした(派手に消す手法では 0.24 で作動します)。
時刻層は 1.000 のまま無傷です。
やってはいけない設定
実測して分かった、逆効果になる操作を挙げておきます。
- 相殺の度合いを 1.0 からずらす — 1.0 未満だと透かしが弱く残って 1 本目が読まれ続けます。1.0 を超えると相殺した epoch が 2 本目の記号に倒れ、 2 本目が名指しされます。1.0 だけがどちらにも倒れない点です
- デシンクロを重ねる — 検証器の
time-scale-recoveryに 復元されるうえ erasure も減り、実測で score が 3.699 → 4.238 と悪化しました
使い方
- 配信サイトでセッションを 2 つ作り、それぞれの音声をダウンロードする
- 2 つのファイルをこのページに投入する
- 「相殺する」を押す。2 本を epoch ごとに比較して食い違う箇所を判別し、そこだけ平均する
- 出力された WAV をダウンロードする
A版/B版のラベルは要りません。同じ epoch で 2 本を比べれば、変種が違えば差は信号比 −22 dB 付近、同じなら再エンコード雑音だけで −36 dB 以下と桁が違うので、音声だけで 判別できます。
音質について
相殺は原音の推定であって劣化ではありません。A版も B版も知覚的に等価な 同じマスターなので、その平均は元音源そのものに近づきます。触るのは食い違う epoch だけで、 残りは元のデータのままです。実測で 1 本目との差は −30 dB 程度、 これは透かし成分が消えた分です。
出力は 32bit float WAV。元音源は復号時点でフルスケールを超えることがあり、 整数PCMだとクリップするためです。16bit を選ぶとピークに合わせて自動的に音量を下げます。
コマンドラインで使う
セッションの発行からダウンロード・相殺・検証まで全自動で行う実装もあります。
python3 scripts/two_session_attack.py --out out.wav