Signatur
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
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);
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!');
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östvoiceschangedteilweise 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
langund 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
voicewird dort teilweise ignoriert.