Start · Sprachen · JavaScript · Referenz · SpeechSynthesisVoice.lang

SpeechSynthesisVoice.lang

Eigenschaft

Schreibgeschützte Eigenschaft, die einen BCP-47-Sprachcode wie <code>"de-DE"</code> oder <code>"en-US"</code> liefert, der die Sprache einer Sprachausgabe-Stimme angibt.

seit JavaScript Web Speech API – Baseline: alle modernen Browser ( Kategorie: webapi

Signatur

SpeechSynthesisVoice.lang

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

Typ
string
Beschreibung
Ein BCP-47-Sprach-Tag, z. B. "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);
Google Deutsch – de-DE Google US English – en-US Microsoft Katja - German (Germany) – de-DE (Standard) …

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!');
Verwendete Stimme: Google Deutsch

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)`);
  }
});
Deutsch: 3 Stimme(n) Englisch: 12 Stimme(n) Französisch: 2 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 Ereignis voiceschanged, bevor du nach lang filterst. 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.lang wird stillschweigend ignoriert (im Strict Mode ohne Fehler, da es ein Getter ist). Setze stattdessen SpeechSynthesisUtterance.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.