Signatur
Beschreibung
Die Eigenschaft voiceURI eines SpeechSynthesisVoice-Objekts liefert eine Zeichenkette, die Art und Ort des Sprachsynthesedienstes angibt, der diese Stimme bereitstellt. Die Spezifikation beschreibt den Wert als URI. In der Praxis ist er aber oft nur eine vom Browser bzw. Betriebssystem vergebene Kennung, etwa "Google Deutsch" in Chrome oder "com.apple.voice.compact.de-DE.Anna" unter macOS/Safari.
Gut geeignet ist voiceURI, um eine Stimme eindeutig und dauerhaft wiederzuerkennen, zum Beispiel wenn eine Nutzerin in den Einstellungen eine Stimme auswählt und diese Auswahl in localStorage gespeichert werden soll. Der Anzeigename (name) ist dafür weniger verlässlich, weil mehrere Stimmen denselben Namen haben können.
Die Eigenschaft ist schreibgeschützt. Die Liste der Stimmen erhält man über speechSynthesis.getVoices(). Viele Browser laden diese Liste asynchron, deshalb sollte man auf das Ereignis voiceschanged warten, bevor man voiceURI auswertet.
Rückgabewert
Beispiele
Alle verfügbaren Stimmen mit voiceURI auflisten
const listVoices = () => {
const voices = speechSynthesis.getVoices();
voices.forEach(({ name, lang, voiceURI }) => {
console.log(`${name} (${lang}) → ${voiceURI}`);
});
};
// Stimmen werden oft asynchron geladen
listVoices();
speechSynthesis.addEventListener('voiceschanged', listVoices);
Gewählte Stimme dauerhaft speichern und wiederherstellen
const STORAGE_KEY = 'preferredVoiceURI';
const saveVoice = (voice) => {
localStorage.setItem(STORAGE_KEY, voice.voiceURI);
};
const getSavedVoice = () => {
const uri = localStorage.getItem(STORAGE_KEY);
return speechSynthesis.getVoices().find((v) => v.voiceURI === uri) ?? null;
};
speechSynthesis.addEventListener('voiceschanged', () => {
const voice = getSavedVoice();
const utterance = new SpeechSynthesisUtterance('Willkommen zurück!');
if (voice) utterance.voice = voice;
speechSynthesis.speak(utterance);
});
Auswahlliste mit voiceURI als Wert befüllen
const select = document.querySelector('#voice-select');
const fillSelect = () => {
select.replaceChildren(
...speechSynthesis.getVoices().map((voice) => {
const option = document.createElement('option');
option.value = voice.voiceURI;
option.textContent = `${voice.name} (${voice.lang})${voice.default ? ' – Standard' : ''}`;
return option;
})
);
};
fillSelect();
speechSynthesis.onvoiceschanged = fillSelect;
select.addEventListener('change', () => {
const voice = speechSynthesis.getVoices().find((v) => v.voiceURI === select.value);
const u = new SpeechSynthesisUtterance('Das ist meine Stimme.');
u.voice = voice;
speechSynthesis.speak(u);
});
// Wichtig · Fallstricke
- Kein einheitliches Format: Obwohl die Eigenschaft „URI“ heißt, ist der Wert selten eine echte URL. Er darf weder geparst noch für Netzwerkzugriffe verwendet werden, sondern dient nur als Kennung zum Vergleichen.
- Nicht plattformübergreifend stabil: Dieselbe Stimme kann in verschiedenen Browsern oder auf verschiedenen Geräten einen anderen
voiceURIhaben. Gespeicherte Werte immer mit einem Rückfall absichern, etwa auf eine Stimme mit passendemlangoder aufdefault. - Asynchrones Laden: In Chrome gibt
getVoices()beim ersten Aufruf oft ein leeres Array zurück. Deshalb aufvoiceschangedwarten. - Datenschutz: Die Liste der installierten Stimmen und ihre Kennungen können zum Browser-Fingerprinting beitragen. Manche Browser schränken die Liste deshalb ein.
- Die Web Speech API (Sprachsynthesis) wird in Chrome, Edge, Firefox und Safari unterstützt, auf Mobilgeräten stehen aber teils nur wenige Stimmen zur Verfügung.