← ブログに戻る

ブラウザの音声フィンガープリントとは?SpeechSynthesis音声リストが暴く環境の特徴

結論:音声フィンガープリントが読み取るのは、端末にインストール済みの合成音声の一覧です。OSに紐づく設定リストなので、プロキシを変えてもCookieを消しても変わりません。複数アカウント環境のシグナル整合性を点検するとき、CanvasやAudioContextの次に見落とされやすい項目です。

「プロキシを変えて、Cookieも消したのに、環境判定がどうしても合わない」。アカウントのトラブルシュートでは、答えがデバイス層のパラメータに隠れていることがよくあります。音声はその中でも見落とされがちです。Webサイトはマイクへのアクセスも、音の再生も必要としません。APIを一度呼ぶだけで、システム設定に関わるリストを手に入れられます。

このリストはOSと言語パックで決まり、端末に付いて回ります。IPを変えても不変です。MostMateは、まさにこの種の問題のために作られたアンチディテクトブラウザで、アカウントごとに独立したブラウザ環境を用意します。デバイス層のパラメータも管理対象で、音声はその一つです。

音声フィンガープリントとは?録音による声紋認証との違い

材料は音声合成の設定情報です。声紋とは別物です。

まず3つの用語を分けておきましょう。音声合成は、ブラウザがテキストを音声に変える機能、つまりページ読み上げの背後にある仕組みです。音声リストは、この機能が現在の環境で使える声の選択肢です。MDNのドキュメントの説明によれば、getVoices()を呼び出すと、端末で利用できる音声オブジェクトのリストが返ります。そして音声フィンガープリントは、サイトがこのリストの特徴を環境識別のシグナルとして扱うことを指します。3つは一段ずつ具体的になっていきます。

声紋認証と並べればはっきりします。声紋は録音が要ります。許可も要りますし、実際に声を出すことも要ります。音声フィンガープリントは終始無音で、権限も不要です。サイトが読むのは音ではなくメニューの方です。違いはそこにあります。そして見落とされる理由でもあります。ダイアログも出ず、気配もないのに、データはすでに渡っています。

SpeechSynthesisはどうやって音声リストをサイトに渡すのか?

読み取りの入口はspeechSynthesis.getVoices()です。一度の呼び出しで完全なリストが手に入ります。

フィールドは5つあります。意味は次の表のとおりです。

フィールド意味値の例
name音声の名前Microsoft David、Samantha
lang言語タグen-US、zh-CN
localServiceローカル合成かクラウドかtrueはローカル、falseはオンライン
defaultデフォルト音声かどうか言語ごとに最大1つ
voiceURI音声サービスの識別子システム内部の識別子を含む場合も

名前が人名にすぎないのに対し、下層の情報を運ぶのはvoiceURIです。FirefoxがmacOSで返す値は、urn:moz-tts:osx:にシステム内部の識別子が続く形になります。OS非公開の音声登録情報が、公開APIを通じてそのまま外に出ていくわけです。

読み取り結果に関わる細かい挙動ももう一つ。Chrome、Edge、Firefoxでは、初回の呼び出しで空の配列が返ることがよくあります。リストはvoiceschangedイベントが発火してから揃います。この読み込みタイミング自体もシグナルです。即座に発火するブラウザもあれば、遅れるもの、すでに読み込み済みで二度と発火しないものもあります。このAPIはWeb Speech API仕様で今も草案段階にあり、細かい挙動は各ブラウザの実装次第です。

音声リストからは、どんな環境特徴が読み取れるのか?

音声名が一つだけでは何も分かりません。識別力があるのは、リストの組み合わせの方です。

1つ目:OSと端末の手がかり。 音声はOSの音声サービスが提供します。定番は決まっています。WindowsならMicrosoft DavidやZira、macOSならSamanthaやDanielです。AndroidスマホにはGoogleの音声サービスが一式入っています。Linuxデスクトップは、音声サービスを入れていなければリストが空のままということも珍しくありません。

2つ目:言語と地域の設定。 langタグの組み合わせは、その端末にどんな言語パックが入ったかを物語ります。リストは正直です。日本語とアラビア語、ヒンディー語の音声が並んでいれば、多言語利用の背景がそのままサイトに伝わります。本人が覚えていない場合もあるほどです。

3つ目:ブラウザ実装の違い。 Chromeはシステム音声の上に、Googleのクラウド音声を重ねて返します。localServiceの値を見れば、ローカル合成とオンラインサービスを区別できます。同じ端末でも、ChromeとFirefoxではリストの構成が変わることがあります。

4つ目:デフォルト値と全体の組み合わせ。 件数、並び順、言語タグ、デフォルト音声。これらが揃うと、識別力のかなり高い環境シグナルになります。ここで補足です。これは手がかりの一つにすぎず、サイトは複数のシグナルを総合して初めて判断します。音声リスト1枚で特定の個人までは分かりません。

サイトが音声リストから読み取る4種類の環境特徴のイメージ

音声フィンガープリントはAudioContextやCanvasフィンガープリントと何が違うのか?

3つはよく一緒に語られますが、見ている対象はまったく違います。まずは表で比べてみましょう。

検出方式観測対象処理の特徴
SpeechSynthesis音声フィンガープリント利用可能な音声リストと各フィールド設定リストを読む。終始無音
AudioContextフィンガープリント音声処理の演算結果演算を実行し、出力の差を比べる
Canvasフィンガープリントグラフィック描画の出力画像をレンダリングし、ピクセルを比べる
フォントフィンガープリントシステムのフォントと描画フォントの有無を探る

音声リストの列挙とオーディオ描画は、別々の経路です。片方は静的なリストを読み、もう片方は動的な結果を演算します。同じ物差しでは測れません。AudioContextフィンガープリントの記事では、後者の経路の仕組みと設定を扱っています。型は同じです。フォントフィンガープリントも音声リストと同じ静的リスト型で、どちらも「端末に何が入っているか」を直接読み取ります。

自分のブラウザがどんな音声情報を晒しているか調べるには?

確認に必要なのは開発者ツールだけです。5分あれば、サイトから見えるリストをそのまま取り出せます。

  1. 開発者ツールのConsoleを開き、speechSynthesis.getVoices()と入力してEnterを押します。返り値を確認しましょう。
  2. リスト内の音声オブジェクトを展開し、name、lang、localService、voiceURIの値を記録します。
  3. ページを再読み込みしてすぐにもう一度確認します。初回が空配列かどうかを比べ、非同期読み込みの挙動をつかみましょう。
  4. 別のPCや別のOSで同じ手順を繰り返します。差異の出どころがOSの音声サービスか、ブラウザの実装かを見分けます。
  5. プロキシを付けてもう一度確認します。リストは通常変わりません。それがデバイス層のシグナルであることの確認になります。

結果の読み方には2つの心得があります。リストが空でも、音声フィンガープリントがない意味ではありません。空であること自体が一つの情報です。音声サービスのないLinuxや一部の自動化環境は、空配列を返しがちです。逆にリストが長いからといって識別されやすいわけでもありません。判断は、環境全体に矛盾がないかで下すべきものです。パラメータの数を数えることではありません。

MostMateは音声の環境特徴をどう管理するのか?

音声リストはデバイス層のパラメータです。アンチディテクトブラウザの対応は、放置ではなく環境設定への組み込みです。

MostMateで環境を作成・編集するときの「指紋設定(フィンガープリント設定)」には、SpeechVoicesが独立したパラメータとして並んでいます。Canvas、AudioContext、ClientRects、WebGL画像と同列です。段階はRealとNoiseの2つで、Noiseがノイズモードにあたります。

Noiseを選ぶと、右側のプレビューパネルのSpeechVoices欄に、6桁のコード付きの値が表示されます。CanvasやAudioContextにはそれぞれ別のコードが付きます。流用はできません。コードはノイズ設定の目印で、実際に晒されるハッシュ値は、環境を開いてアクセス検出ページで確認します。

MostMateの指紋設定にあるSpeechVoicesパラメータ

音声パラメータは単独でいじるものではありません。環境のOS、言語、タイムゾーンが、音声リストのあるべき姿を決めます。Windows環境なのにmacOSの音声が並んでいたら、明らかな矛盾です。順番が大事です。まずOSとプロキシを固めてから、音声のようなデバイス層のパラメータを突き合わせます。項目をばらばらに試すより確実です。

項目ごとに細かく制御したいときは、公式サイトの手動指紋設定のリストに沿って調整します。設定の手間を減らしたいなら、環境作成時におすすめ構成でまとめて指定し、あとで個別の項目を見直す方法もあります。ここでも限界には触れておきます。アンチディテクトブラウザが管理するのは環境設定です。サイトに環境を判別されないことを保証するものでも、アカウントがプラットフォームの認証に引っかからないことを保証するものでもありません。アカウント運用そのものは、各プラットフォームのルールに従う必要があります。

よくある質問

音声フィンガープリントは、私の声を録音しますか?

いいえ。読み取りの過程でマイクには触れませんし、音声の再生もありません。サイトが受け取るのは、システム音声サービスの設定リストだけです。声紋認証には録音の許可が必要ですが、音声フィンガープリントはどんな権限も要求しません。

パソコンが2台あると、音声リストはなぜ違うのですか?

音声はOS、言語パック、音声サービスで決まります。WindowsとmacOSでは内蔵音声が違います。入れている言語パックも違えば、ブラウザが重ねるクラウド音声も違います。リストが一致しないのは当然です。

音声リストが空なら、音声フィンガープリントはないということ?

空のリスト自体が一つの情報です。音声サービスのないLinuxや一部の自動化環境は、空配列を返しがちです。サイトの目には、それが一つの異常な特徴として映ります。ステルスとは言えません。

音声フィンガープリントとAudioContextフィンガープリントは同じものですか?

同じではありません。音声フィンガープリントは静的な設定リストを読み、AudioContextは動的な音声処理の結果を算出します。検出の経路が違うので、環境の点検では別々に確認してください。

MostMateでSpeechSynthesisの音声リストだけを変えることはできますか?

製品では指紋設定のSpeechVoicesパラメータがこれに当たります。RealとNoiseの2段階で、どこまで細かく調整できるかはクライアントの画面をご確認ください。設定後は、環境のアクセス検出ページを開いて、実際に晒されるリストを照らし合わせるのがおすすめです。

まとめ

音声フィンガープリントの正体は、この端末に何が入っているかをサイトに渡すことです。録音もせず、権限も要らないのに、OSに付いて回ります。IPを変えても動きません。だからこそ、よくあるやり方の辻褄が合います。それだけでは足りません。Cookieを消し、プロキシを変えても、環境を合わせるにはデバイス層のパラメータも揃える必要があります。

製品面では、MostMateはSpeechVoicesをCanvasやAudioContextと一緒に指紋設定に組み込んでいます。段階はRealとNoiseの2つです。機能の全体像は、MostMateの公式サイトで確認できます。

自分の環境が今何を晒しているか知りたければ、第5節の手順で音声リストを一度確認してみてください。環境を一つ作って比べてみるなら、MostMateのダウンロードからどうぞ。

MOSTMATE

安全な複数アカウント管理を、もっと簡単に

最初のアカウントから、MostMate でより安全でスマート、効率的な複数アカウント運用を始めましょう。

  • 独立したプロファイル。一貫した識別情報。
  • AI 自動化 · アカウント健全性 · チーム運用
MostMate をダウンロード