記事一覧へ戻る
プライバシー深掘り

音声カテゴリで扱う 3 種類のリスク — 会話内容・声紋・環境情報

録音された会話の文字起こし、生体情報としての声紋、ID3 タグや環境音から滲み出るコンテキスト — 音声処理には固有のプライバシーリスクが 3 層あります。NoSend Tools の音声カテゴリがそれぞれをブラウザ内で完結させる仕組みを、Whisper・Web Audio API・lamejs といった実装の固有名詞とともに整理します。

リスク 1 — 会話内容そのものと文字起こしの密度

音声ファイルが含む情報のうち、もっとも生に近いリスクは「何が話されたか」です。会議の議事録、医療相談、法律相談、家族の口論、子供との会話 — どれも文字起こしを通せば即座にテキストとして検索可能になり、後から内容を引用される素材になります。音声のままなら聞き返しに時間がかかるため心理的な障壁がありますが、Whisper クラスのモデルにかければ数分の録音が数秒でテキスト化されます。クラウドの文字起こしサービスにアップロードした瞬間、その音声と書き起こされたテキストの両方が運営者のインフラを通過し、契約上は「サービス提供のために利用する」と明示されていても、実際の保持期間やアクセス権限はユーザーの手の外にあります。

voice-transcribe と audio-transcribe は、OpenAI が公開している Whisper モデル (tiny / base / small の量子化版) を transformers.js + ONNX Runtime Web でブラウザ内推論します。モデルファイル (約 40 MB から 240 MB) は初回のみ CDN からダウンロードされてキャッシュされ、それ以降は完全にオフラインで動作します。入力された音声波形は Web Audio API の AudioContext で decodeAudioData により PCM に展開され、Float32Array としてメモリに乗ったまま ONNX セッションへ渡されます。録音音声もテキスト結果もどこにも送信されません。サーバーサイドの同等サービスでは、生の音声バイナリがアップロードパスとリバースプロキシのバッファ、そして書き起こしテキストはアプリケーションログにそれぞれ最低 1 度ずつ書き出されるのが構造的な前提です。

リスク 2 — 声紋という生体情報

声は顔と並ぶ生体識別情報です。EU GDPR では「特別カテゴリの個人データ」に該当し、同意のない処理が原則禁止されています。最近の音声合成モデル (Tortoise TTS や ElevenLabs クラスの話者クローン) は数十秒の音声サンプルがあれば話者の声を再現できるため、第三者に渡した瞬間に「自分の声で別の文章を読み上げさせる」攻撃の素材になります。録音をそのままクラウドの編集ツールにアップロードする習慣は、この素材を運営者と、運営者がデータを共有しうるすべての関係者の手に渡すことを意味します。

voice-rec は getUserMedia でマイク入力を直接受け取り、AudioWorkletNode で取り出した PCM サンプルを @breezystack/lamejs (CDN 経由の lamejs ではなく npm パッケージ版) で MP3 へエンコード、または同じ PCM を RIFF コンテナに包んで WAV として書き出します。ライブラリも音声バイトもブラウザ内で完結します。audio-pitch-shift と audio-tempo-shift は SoundTouch のアルゴリズムを WebAssembly に移植した実装で動作し、声の特徴量 (F0 や フォルマント分布) を変えずにピッチだけ変える / テンポだけ変える処理をブラウザ内で実行します。話者が誰か特定されたくない録音の匿名化に使えますが、いずれにせよ「処理のために音声を外部に渡す」工程が無い設計です。

リスク 3 — メタデータと環境音、断片の集約

音声ファイルにも画像の EXIF に相当するメタデータがあります。MP3 の ID3v2 タグには、作曲者・アーティスト・コメント・録音日時・録音機材、場合によっては GPS 座標を含めることが規格上許されており、DAW やレコーダーアプリが自動でこれらを書き込むことがあります。AAC コンテナ (MP4) には iTunes 由来のメタデータアトムが、WAV には INFO チャンクが同様の機能を持っています。録音ファイルをそのまま共有すると、本人が意識していない情報 — 使った機材、録音した日付、編集者名 — が同梱されたまま相手に渡ります。

audio-meta-strip は MP3 の ID3v2 ヘッダー、MP4 の moov atom 内 udta ボックス、WAV の INFO チャンクをそれぞれバイトオフセットで識別し、再エンコードなしでメタデータ領域だけを除去します。音質は完全に保持されます。さらに、複数の音声断片を組み合わせると情報が質的に増幅される構造は画像と同じです。10 秒だけの音声には「電車の音」しか残らなくても、3 つの断片を audio-merge で繋ぐと路線図・到着駅・待ち合わせた人物の声まで連続して聞き取れる素材になります。audio-cut で切り出し、audio-merge で結合し、audio-spectrum で可視化する一連の流れがすべて Web Audio API の AudioBuffer 上で完結するため、断片を 1 つもアップロードせずに最終成果物だけを手元に残せます。

DevTools で送信ゼロを確かめる

3 つのリスクカテゴリに共通するのは「処理がどこで走るか」という 1 点です。NoSend Tools の音声カテゴリは、Web Audio API (AudioContext / AudioWorkletNode / OfflineAudioContext)、@breezystack/lamejs、transformers.js + ONNX Runtime Web、SoundTouch.js といった標準的なブラウザ API とオープンソースライブラリだけで実装されており、外部エンドポイントへの fetch は一切含まれていません。

確かめるには、任意の音声ツールページで DevTools の Network タブを開き、Preserve log を有効にしてから録音・文字起こし・編集を完走させてください。発生するリクエストは、HTML / JS / WASM / Whisper モデルの初回ロード分だけのはずです。実装は GitHub の otomomik/nosend-tools で公開しているのでコードレベルでも検証できます。会話の中身、声紋、メタデータ — 音声に含まれるどの情報層も、あなたのブラウザの外には出ません。