Empreinte

Fingerprinting synthese vocale : suivi par voix

Comment la liste de voix de l'API SpeechSynthesis révèle votre système d'exploitation et votre plateforme, et les techniques pour contrôler les signaux d'empreinte vocale.

Documentation

Vous préférez la doc produit maintenue ?

Cet article a une page équivalente dans le centre de documentation. Utilisez les docs pour le flux canonique, les flags à jour et la référence durable.

Introduction

L'interface SpeechSynthesis de l'API Web Speech a été conçue pour donner aux applications web des capacités de synthèse vocale. Elle permet aux développeurs de convertir du texte en audio parlé, permettant des fonctionnalités d'accessibilité, des outils d'apprentissage des langues et des expériences vocales interactives. La méthode speechSynthesis.getVoices() retourne une liste des voix disponibles, chacune avec des propriétés comme le nom, la langue et si elle fonctionne localement ou via un service distant.

Bien que l'API serve un objectif clair d'accessibilité, la liste de voix qu'elle expose varie significativement entre les systèmes d'exploitation, les versions de navigateur et les packs de langues installés. Un système Windows 11 pourrait rapporter plus de 40 voix incluant Microsoft David, Zira et diverses voix Cortana. Un système macOS rapporte des voix entièrement différentes comme Alex, Samantha et une gamme de voix basées sur Siri. Les systèmes Linux utilisant speech-dispatcher rapportent encore un autre ensemble. Cette variation spécifique à la plateforme fait de la liste de voix un signal fiable pour identifier le système d'exploitation et la configuration sous-jacents.

Impact sur la vie privée

La liste de voix SpeechSynthesis est un vecteur de fingerprinting particulièrement efficace car elle combine une haute entropie avec une faible sensibilisation. La plupart des utilisateurs ne savent pas que les sites web peuvent énumérer leurs voix de synthèse vocale installées, et il n'y a pas de demande de permission ni de notification lorsque cela se produit.

La préoccupation de confidentialité va au-delà de la simple identification du système d'exploitation. Les listes de voix varient non seulement par système d'exploitation mais par :

  • Version du système d'exploitation : Windows 10 et Windows 11 fournissent différents ensembles de voix par défaut.
  • Packs de langues : les utilisateurs qui installent des packs de langues supplémentaires gagnent de nouvelles voix, créant une empreinte plus distinctive.
  • Logiciels TTS tiers : les applications comme Balabolka, NaturalReader ou les lecteurs d'écran NVDA peuvent ajouter des voix au système.
  • Version du navigateur : Chrome, Firefox et Edge exposent chacun des sous-ensembles différents des voix disponibles du système.

Une étude de 2021 par des chercheurs de l'Université d'Iowa a démontré que les listes de voix de synthèse vocale, combinées avec d'autres signaux du navigateur, pouvaient augmenter l'unicité de l'empreinte de 12-18%.

Contexte technique

Comment les listes de voix sont générées

Lorsqu'un navigateur démarre, il interroge le sous-système de synthèse vocale du système d'exploitation pour les voix disponibles. Sous Windows, cela signifie l'API Speech (SAPI) et la plateforme OneCore plus moderne. Sous macOS, le navigateur interroge le framework NSSpeechSynthesizer. Sous Linux, il utilise typiquement speech-dispatcher ou interroge directement les moteurs installés comme eSpeak, Festival ou Piper.

Chaque objet voix retourné par speechSynthesis.getVoices() a plusieurs propriétés :

  • name : le nom d'affichage de la voix
  • lang : le tag de langue BCP 47
  • localService : si la voix fonctionne localement ou nécessite une connexion réseau
  • voiceURI : un URI identifiant la voix
  • default : si c'est la voix par défaut pour sa langue

Signatures de voix spécifiques à la plateforme

La liste de voix agit comme une signature de plateforme. Une installation Windows 11 standard rapporte des voix avec des noms commençant par "Microsoft" et inclut des variantes spécifiques à la plateforme. macOS rapporte des voix avec des noms spécifiques à Apple et inclut des voix Siri sur les versions récentes. Chrome sur Android rapporte un ensemble entièrement différent, incluant souvent des voix de marque Google.

Comportement de chargement asynchrone

Le chargement des voix est asynchrone dans la plupart des navigateurs. L'appel initial à getVoices() peut retourner un tableau vide, la liste complète devenant disponible après le déclenchement de l'événement voiceschanged. Le timing de cet événement, et si getVoices() retourne une liste vide initialement, varie entre les navigateurs et les plateformes. Ce comportement de chargement est lui-même un signal de fingerprinting.

Approches de protection courantes et leurs limites

VPN et serveurs proxy

Les VPN changent l'adresse IP mais n'ont aucun effet sur la liste de voix de synthèse vocale. Les données vocales proviennent du système d'exploitation local, pas du réseau.

Les modes de navigation privée n'altèrent pas la liste de voix. Les mêmes voix sont disponibles en mode privé qu'en fenêtre normale, car la liste de voix est lue depuis le système d'exploitation, pas depuis le stockage du navigateur.

Extensions de navigateur

Les extensions qui modifient speechSynthesis.getVoices() font face à plusieurs défis : usurper la valeur de retour, contrôler le timing de l'événement voiceschanged, et la détection des descripteurs de propriétés modifiés.

Blocage de l'API

Désactiver entièrement speechSynthesis est détectable : un site web peut vérifier si l'API existe et si elle retourne des résultats. Un navigateur qui rapporte speechSynthesis comme disponible mais ne retourne aucune voix est lui-même un signal distinctif.

L'approche de BotBrowser au niveau du moteur

BotBrowser contrôle les listes de voix de synthèse vocale au niveau du moteur du navigateur. Lorsqu'un profil d'empreinte est chargé, la liste de voix est configurée pour correspondre à la plateforme cible du profil avant l'exécution de tout code de page.

Listes de voix contrôlées par le profil

chrome --bot-profile="/path/to/profile.enc" \
       --user-data-dir="$(mktemp -d)"

Lorsqu'un profil représentant un système Windows 11 est chargé, speechSynthesis.getVoices() retourne la liste exacte de voix attendue sur cette plateforme, incluant les noms corrects, langues, flags localService et ordonnancement. C'est vrai indépendamment du système d'exploitation hôte réel.

Cohérence multiplateforme

C'est là que l'approche au niveau du moteur de BotBrowser apporte le plus de valeur. Exécuter un profil Windows sur un serveur Linux exposerait normalement les voix natives de Linux (eSpeak, Festival), révélant immédiatement que le navigateur ne tourne pas sur la plateforme rapportée. BotBrowser remplace la liste de voix par les voix attendues du profil, maintenant la cohérence de plateforme sur toutes les surfaces d'empreinte.

Comportement vocal réaliste

BotBrowser ne retourne pas juste une liste statique. Le comportement de chargement des voix, y compris le timing de l'événement asynchrone voiceschanged et le pattern de retour initial de getVoices(), correspond au comportement attendu pour le navigateur et la plateforme cibles du profil.

Configuration et utilisation

Utilisation CLI de base

La protection de la liste de voix est automatique lors du chargement d'un profil :

chrome --bot-profile="/path/to/profile.enc" \
       --user-data-dir="$(mktemp -d)"

Aucun flag supplémentaire n'est nécessaire. Le profil contient la liste de voix complète pour la plateforme cible.

Intégration Playwright

const { chromium } = require('playwright-core');

(async () => {
  const browser = await chromium.launch({
    executablePath: '/path/to/botbrowser/chrome',
    args: [
      '--bot-profile=/path/to/profile.enc',
    ],
    headless: true,
  });

  const context = await browser.newContext({ viewport: null });
  const page = await context.newPage();

  const voices = await page.evaluate(() => {
    return new Promise(resolve => {
      const v = speechSynthesis.getVoices();
      if (v.length > 0) return resolve(v.map(voice => ({
        name: voice.name, lang: voice.lang, local: voice.localService,
      })));
      speechSynthesis.onvoiceschanged = () => {
        resolve(speechSynthesis.getVoices().map(voice => ({
          name: voice.name, lang: voice.lang, local: voice.localService,
        })));
      };
    });
  });

  console.log(`Voice count: ${voices.length}`);
  console.log('Voices:', JSON.stringify(voices, null, 2));
  await browser.close();
})();

Vérification

Points de vérification :

  1. Le nombre de voix correspond au nombre attendu pour la plateforme cible du profil
  2. Les noms de voix utilisent la convention de nommage correcte de la plateforme (par ex. préfixe "Microsoft" pour Windows)
  3. Les tags de langue sont appropriés pour la configuration de locale cible
  4. La propriété localService est cohérente avec les types de voix attendus de la plateforme
  5. La liste de voix ne contient pas de voix du système d'exploitation hôte
  6. Les outils de test d'empreinte ne montrent aucune incohérence inter-signaux entre les données vocales et les autres indicateurs de plateforme

Bonnes pratiques

  1. Utilisez toujours un profil complet. La protection de la liste de voix dépend du profil fournissant des données vocales précises pour la plateforme cible.

  2. Vérifiez la cohérence multiplateforme. Lorsque vous exécutez des profils sur un système d'exploitation différent de la cible, vérifiez que la liste de voix correspond à la plateforme cible, pas à l'hôte.

  3. Considérez l'alignement de la locale. Un profil configuré pour une locale japonaise devrait inclure des voix japonaises.

  4. N'installez pas d'extensions TTS aux côtés de BotBrowser. Les extensions TTS tierces peuvent enregistrer des voix supplémentaires qui entrent en conflit avec la liste de voix contrôlée du profil.

Questions fréquentes

Combien de voix une plateforme typique rapporte-t-elle ?

Windows 11 rapporte typiquement 30-50 voix selon les packs de langues installés. macOS rapporte 60-80 voix incluant les variantes Siri. Chrome sur Android rapporte 5-15 voix. Le nombre exact est l'un des signaux de fingerprinting que BotBrowser contrôle.

La protection de la liste de voix fonctionne-t-elle en mode headless ?

Oui. BotBrowser applique la liste de voix du profil que le navigateur s'exécute en mode headless ou avec affichage. C'est important car les environnements headless n'ont typiquement pas de sous-système TTS, et une liste de voix vide en mode headless est un signal de détection fort.

Résumé

La liste de voix de l'API SpeechSynthesis est un signal de fingerprinting à haute entropie qui révèle le système d'exploitation, la version du navigateur et la configuration de langue. Les outils de confidentialité standard ne peuvent pas le traiter car les données vocales proviennent du système d'exploitation, pas du réseau ou du stockage du navigateur. BotBrowser contrôle les listes de voix au niveau du moteur via son système de profils, garantissant la cohérence multiplateforme et l'alignement avec tous les autres signaux d'empreinte. Pour une protection connexe, voir navigator properties protection, font fingerprint control, et timezone and locale configuration.

#Speech-Synthesis#fingerprinting#Privacy#Tts#Voice#Platform

Faites passer BotBrowser de la recherche à la production

Utilisez ces guides pour comprendre le modèle, puis passez à la validation multi-plateforme, aux contextes isolés et au déploiement navigateur prêt pour l'échelle.