Start · Sprachen · JavaScript · Referenz · SpeechSynthesis.getVoices()

SpeechSynthesis.getVoices()

Methode

Gibt ein Array von <code>SpeechSynthesisVoice</code>-Objekten zurück, das alle Stimmen enthält, die auf dem aktuellen Gerät für die Sprachausgabe verfügbar sind.

seit JavaScript Baseline: alle modernen Browser (seit ca. 2018) Kategorie: webapi

Signatur

SpeechSynthesis.prototype.getVoices()

Beschreibung

speechSynthesis.getVoices() liefert die Liste aller Stimmen, die die Web Speech API auf dem aktuellen System für Text-zu-Sprache nutzen kann. Jedes Element ist ein SpeechSynthesisVoice mit Eigenschaften wie name, lang (BCP-47-Sprachcode, z. B. de-DE), localService, default und voiceURI.

Diese Methode brauchen Sie, wenn Sie eine bestimmte Stimme gezielt auswählen möchten, etwa eine deutsche Stimme für deutschen Text oder eine Stimmen-Auswahl im Einstellungsdialog Ihrer Anwendung. Die gewählte Stimme weisen Sie der Eigenschaft voice einer SpeechSynthesisUtterance zu, bevor Sie speechSynthesis.speak() aufrufen.

Wichtig: In vielen Browsern (vor allem Chrome) werden die Stimmen asynchron geladen. Ein Aufruf direkt beim Laden der Seite liefert dann oft ein leeres Array. Die Liste ist erst vollständig, wenn das Ereignis voiceschanged auf speechSynthesis ausgelöst wurde. Robuster Code prüft deshalb zuerst die Länge und wartet notfalls auf dieses Ereignis.

Rückgabewert

Typ
SpeechSynthesisVoice[]
Beschreibung
Ein normales Array mit SpeechSynthesisVoice-Objekten. Es kann leer sein, wenn die Stimmen noch nicht geladen sind oder das System keine Stimmen bereitstellt.

Beispiele

Alle verfügbaren Stimmen auflisten

const logVoices = () => {
  const voices = speechSynthesis.getVoices();
  voices.forEach((voice) => {
    console.log(`${voice.name} (${voice.lang})${voice.default ? ' – Standard' : ''}`);
  });
};

logVoices();
// In Chrome ist die Liste anfangs oft leer – daher zusätzlich auf das Ereignis hören
speechSynthesis.addEventListener('voiceschanged', logVoices);
Google Deutsch (de-DE) Google US English (en-US) Microsoft Katja - German (Germany) (de-DE) – Standard …

Stimmen zuverlässig per Promise laden

const loadVoices = () =>
  new Promise((resolve) => {
    const voices = speechSynthesis.getVoices();
    if (voices.length > 0) {
      resolve(voices);
      return;
    }
    speechSynthesis.addEventListener(
      'voiceschanged',
      () => resolve(speechSynthesis.getVoices()),
      { once: true }
    );
  });

const speakGerman = async (text) => {
  const voices = await loadVoices();
  const german = voices.find((v) => v.lang.startsWith('de'));

  const utterance = new SpeechSynthesisUtterance(text);
  utterance.lang = 'de-DE';
  if (german) utterance.voice = german;
  speechSynthesis.speak(utterance);
  console.log(`Verwendete Stimme: ${german?.name ?? 'Systemstandard'}`);
};

speakGerman('Willkommen auf programmierung.net!');
Verwendete Stimme: Google Deutsch

Auswahlliste für Stimmen befüllen

// HTML: <select id="voice-select"></select> <button id="speak">Vorlesen</button>
const select = document.querySelector('#voice-select');

const populateVoiceList = () => {
  const voices = speechSynthesis.getVoices();
  select.replaceChildren(
    ...voices.map((voice, index) => {
      const option = new Option(`${voice.name} (${voice.lang})`, index);
      option.selected = voice.default;
      return option;
    })
  );
};

populateVoiceList();
speechSynthesis.onvoiceschanged = populateVoiceList;

document.querySelector('#speak').addEventListener('click', () => {
  const voice = speechSynthesis.getVoices()[select.value];
  const utterance = new SpeechSynthesisUtterance('Dies ist ein Test.');
  utterance.voice = voice;
  speechSynthesis.speak(utterance);
});

// Wichtig · Fallstricke

  • Leeres Array beim ersten Aufruf: Chrome und Edge laden Stimmen asynchron. Hören Sie auf voiceschanged, statt sich auf den ersten Aufruf zu verlassen. Firefox und Safari liefern die Liste meist sofort; Safari löst voiceschanged teilweise gar nicht aus. Prüfen Sie deshalb immer beides.
  • Plattformabhängig: Welche Stimmen verfügbar sind, hängt von Betriebssystem, Browser und installierten Sprachpaketen ab. Chrome bietet zusätzlich Online-Stimmen („Google …“, localService === false), die eine Netzwerkverbindung brauchen und Text an einen Server senden. Das ist für den Datenschutz relevant.
  • Keine festen Stimmen-Namen voraussetzen: Filtern Sie nach lang und sehen Sie immer einen Rückfall auf die Standardstimme vor.
  • Fingerprinting: Die Stimmenliste kann zur Identifizierung von Geräten beitragen. Einige Browser (z. B. Firefox mit privacy.resistFingerprinting, Tor Browser) schränken sie deshalb ein.
  • Feature-Erkennung: Prüfen Sie vorher mit 'speechSynthesis' in window, ob die API vorhanden ist. In Node.js gibt es sie nicht.
  • Auf Android (Chrome) werden oft nur wenige oder gruppierte Stimmen gemeldet; die Eigenschaft voice wird dort teilweise ignoriert.