Signatur
Beschreibung
Die Eigenschaft lang eines SpeechSynthesisVoice-Objekts gibt an, in welcher Sprache und oft auch in welcher regionalen Variante eine Stimme spricht. Der Wert ist ein Sprach-Tag nach BCP 47, z. B. "de-DE" (Deutsch, Deutschland), "de-AT" (Deutsch, Österreich) oder "en-GB" (Englisch, Großbritannien).
Am häufigsten braucht man lang, um aus der Liste von speechSynthesis.getVoices() eine passende Stimme auszuwählen – etwa eine deutsche Stimme für deutschsprachige Texte oder eine Stimme, die zur Sprache der Seite (document.documentElement.lang) bzw. des Browsers (navigator.language) passt. Die gefundene Stimme wird dann an SpeechSynthesisUtterance.voice übergeben.
Die Eigenschaft ist schreibgeschützt: Die Sprache einer Stimme lässt sich nicht ändern. Soll ein einzelner Text in einer anderen Sprache gesprochen werden, setzt man stattdessen SpeechSynthesisUtterance.lang oder wählt eine andere Stimme.
Rückgabewert
"de-DE". Je nach Browser und Betriebssystem kann der Wert auch nur aus dem Sprachcode bestehen ("de"), einen Unterstrich statt Bindestrich enthalten ("de_DE", v. a. ältere Android-Versionen) oder leer sein.Beispiele
Alle verfügbaren Stimmen mit Sprache auflisten
const listVoices = () => {
const voices = speechSynthesis.getVoices();
voices.forEach((voice) => {
console.log(`${voice.name} – ${voice.lang}${voice.default ? ' (Standard)' : ''}`);
});
};
// Stimmen werden in vielen Browsern asynchron geladen
listVoices();
speechSynthesis.addEventListener('voiceschanged', listVoices);
Deutsche Stimme auswählen und Text vorlesen
const getVoicesAsync = () =>
new Promise((resolve) => {
const voices = speechSynthesis.getVoices();
if (voices.length) return resolve(voices);
speechSynthesis.addEventListener('voiceschanged',
() => resolve(speechSynthesis.getVoices()), { once: true });
});
const speakGerman = async (text) => {
const voices = await getVoicesAsync();
// Normalisieren: Unterstrich → Bindestrich, Kleinschreibung
const norm = (tag) => tag.replace('_', '-').toLowerCase();
const voice =
voices.find((v) => norm(v.lang) === 'de-de') ??
voices.find((v) => norm(v.lang).startsWith('de'));
const utterance = new SpeechSynthesisUtterance(text);
if (voice) {
utterance.voice = voice;
utterance.lang = voice.lang;
}
speechSynthesis.speak(utterance);
console.log('Verwendete Stimme:', voice?.name ?? 'Browser-Standard');
};
speakGerman('Willkommen auf programmierung.net!');
Stimmen nach Sprache gruppieren (z. B. für ein Auswahlmenü)
speechSynthesis.addEventListener('voiceschanged', () => {
const byLang = Object.groupBy
? Object.groupBy(speechSynthesis.getVoices(), (v) => v.lang.split(/[-_]/)[0])
: speechSynthesis.getVoices().reduce((acc, v) => {
const key = v.lang.split(/[-_]/)[0];
(acc[key] ??= []).push(v);
return acc;
}, {});
const displayNames = new Intl.DisplayNames(['de'], { type: 'language' });
for (const [code, voices] of Object.entries(byLang)) {
console.log(`${displayNames.of(code)}: ${voices.length} Stimme(n)`);
}
});
// Wichtig · Fallstricke
- Uneinheitliches Format: Nicht jede Plattform hält sich genau an BCP 47. Manche liefern
"de_DE", andere nur"de", und die Groß-/Kleinschreibung kann abweichen. Vergleiche deshalb immer normalisiert (Unterstrich ersetzen,toLowerCase()) oder nur mit dem Sprachpräfix. - Stimmen laden asynchron: In Chrome und anderen Browsern gibt
speechSynthesis.getVoices()beim ersten Aufruf oft ein leeres Array zurück. Warte auf das Ereignisvoiceschanged, bevor du nachlangfilterst. Safari löst dieses Ereignis teilweise gar nicht aus – dann hilft nur erneutes Abfragen. - Verfügbarkeit hängt vom System ab: Welche Sprachen es gibt, bestimmen Betriebssystem und Browser. Rechne damit, dass keine passende Stimme vorhanden ist, und sieh eine Ausweichlösung vor (Standardstimme oder Hinweis an die Nutzerin bzw. den Nutzer).
- Schreibgeschützt: Eine Zuweisung an
voice.langwird stillschweigend ignoriert (im Strict Mode ohne Fehler, da es ein Getter ist). Setze stattdessenSpeechSynthesisUtterance.lang. - Datenschutz: Die Liste der Stimmen samt Sprachen kann zum Browser-Fingerprinting genutzt werden; manche Browser geben deshalb nur eine eingeschränkte Auswahl zurück.
- Die Web Speech API (Sprachausgabe) wird von allen aktuellen Desktop- und Mobil-Browsern unterstützt, in Node.js gibt es sie nicht.