Anzeige
Smartes Cloud Hosting für anspruchsvolle Projekte.
↬ Loslegen und Spaces testen ↬ Jetzt testen!
Denis Potschien 8. April 2019

HTML5: Texte vorlesen lassen mit SpeechSynthesis

Was Navigationsgeräte schon lange können, können nun auch die Browser. SpeechSynthesis aus der Web-Speech-API erlaubt es, Texte mit einer menschlichen Sprechstimme auszugeben. Dabei stehen Stimmen für mehrere Sprachen zur Verfügung – teilweise auch mehrere Stimmen pro Sprache. Per Knopfdruck können sich deine Besucher den Text eines HTML-Dokumentes einfach vorlesen lassen.

Anzeige

SpeechSynthesis, also die Sprachsynthese, ist eine Technologie, mit der Anwendungen Text-Inhalte unter Verwendung einer menschlichen Stimme vorlesen können. Ebenfalls Teil der Web-Speech-API ist die SpeechRecognition, die Spracherkennung. Damit ist es möglich, asynchron Spracheingaben aufzunehmen und inhaltlich zu erkennen. So machten es Siri, Cortana, der Google Assistant und einige andere, nur eben nicht via Web, sondern nativ in der App oder dem Betriebssystem.

Ich konzentriere mich im folgenden Text aber auf SpeechSynthesis. Den Grund liest du ganz unten am Ende des Beitrags ;)

speechsynthesis

Vorleser mit Sprachen- und Stimmenvielfalt

SpeechSynthesis bringt natürlich nur dann etwas, wenn Ausgaben nicht nur in einer Sprache möglich sind. Die Zahl der verfügbaren Stimmen pro Sprache hingegen, ist da schon eher Geschmackssache, oder meinetwegen eine Frage der Gleichberechtigung.

Generell ist die Anzahl der zur Verfügung stehenden Sprachen und Stimmen abhängig vom Browser. Chrome unterstützt derzeit mehr als ein Dutzend Sprachen, darunter britisches und amerikanisches Englisch, Deutsch, Französisch, Spanisch und Italienisch, aber auch Russisch und Chinesisch. Es ist möglich, wenn auch zumeist wenig sinnvoll, beispielsweise einen deutschen Text mit französischer Stimme auszugeben. Dann wird der Text deutsch, mit französischem Akzent wiedergegeben.

So einfach startest du die Wiedergabe

Um einen Text sprechen zu lassen, muss zunächst eine neue Äußerung (utterance) erstellt werden. Damit der Browser weiß, in welcher Sprache die Äußerung wiedergegeben werden soll, kann entweder direkt einer der Stimmen per voice oder per lang-Eigenschaft die Sprache übergeben werden. Anschließend lässt man den Browser die Äußerung sprechen.

var worte = new SpeechSynthesisUtterance("Herzlich willkommen.");
worte.lang = "de-DE";
window.speechSynthesis.speak(worte);var worte = new SpeechSynthesisUtterance("Herzlich willkommen.");

Im Beispiel wird die Sprache auf Deutsch gesetzt. Da Sprachen teilweise – wie im Englischen – nach Land unterschieden werden, erfordert lang die Angabe einer Sprache einschließlich des Landes. So lässt sich zwischen amerikanischem en-US und britischem Englisch en-UK unterscheiden. Per Methode speak() wird der Text im Beispiel mit einer deutschen Stimme gesprochen.

var worte = new SpeechSynthesisUtterance("Herzlich willkommen.");
var stimmen = window.speechSynthesis.getVoices();
worte.voice = stimmen[6];
window.speechSynthesis.speak(worte);

Im zweiten Beispiel wird statt einer Sprache direkt eine Stimme gewählt. Dazu werden per getVoices() alle zur Verfügung stehenden Stimmen abgerufen. Über die voice-Eigenschaft wird eine der Stimmen der Äußerung hinzugefügt. Stimme 6 entspricht der deutschen Stimme. Im Ergebnis unterscheiden sich die beiden Beispiele nicht voneinander.

So fragst du im Browser verfügbaren Stimmen ab

Sobald du per getVoices() auf die Stimmen des Browsers zugreifst, ist es wichtig, mit Event-Listenern zu arbeiten. Denn der Browser lädt die Stimmen nicht zusammen mit dem Dokument. Das heißt, es ist nicht möglich, getVoices() direkt beim Aufruf der Seite auszuführen. Wichtig ist, dass zunächst über den Event-Listener DOMContentLoaded eine Funktion geladen wird, die über eine if-Abfrage prüft, ob SpeechSynthesis bereits zur Verfügung steht, beziehungsweise ob sie überhaupt vom Browser unterstützt wird. Anschließend sollte die Sprachausgabe per click-Event aufgerufen werden.

window.addEventListener("DOMContentLoaded", function() {
  if (window.speechSynthesis != undefined) {
    document.getElementById("wiedergabe").addEventListener("click", function() {
      var stimmen = window.speechSynthesis.getVoices();
      for(var i = 0; i < stimmen.length; i++ ) {
        console.log("Stimme " + i.toString() + " " + stimmen[i].name);
      }
    }, false)
  }
}, false)

Im Beispiel wird beim Klick auf das Element mit der ID wiedergabe eine Funktion ausgeführt, die alle Stimmen mit der internen Nummer und ihrem Namen in die Konsole schreibt. Die deutsche Stimme trägt im Chrome den Namen „Google Deutsch“.

Dieses nützliche Script, das ich auf Stack Overflow fand, listet dir die im jeweiligen Browser enthaltenen Stimmen, allerdings nur für den Browser, mit dem es aufgerufen wird.

So regelst du Stimmfrequenz und Geschwindigkeit

Neben den Stimmen für die einzelnen Sprachen gibt es auch eine Standardstimme, die für alle Sprachen funktioniert. Um das bestmöglich anzupassen, hat man die Möglichkeit, die Frequenz der verwendeten Stimme sowie die Sprechgeschwindigkeit zu definieren.

var worte = new SpeechSynthesisUtterance("Das geht schneller und höher.");
var stimmen = window.speechSynthesis.getVoices();
worte.voice = stimmen[10];
worte.pitch = 4;
worte.rate = 10;
window.speechSynthesis.speak(worte);

Die Eigenschaft pitch bestimmt die Stimmfrequenz. Erlaubt ist ein Wert zwischen 0 und 2, wobei der Wert 1 der normalen Frequenz der Stimme entspricht. Alles unterhalb von 1 führt zu einer niedrigeren Frequenz, alles darüber zu einer höheren.

Mit rate wird die Sprechgeschwindigkeit geregelt. Erlaubt sind hierbei Werte zwischen 0.1 und 10, wobei der Wert 1 für die normale Sprechgeschwindigkeit steht. Werte darunter sorgen dafür, dass sehr langsam gesprochen wird. Werte über 1 sorgen für eine entsprechend schnellere Sprachwiedergabe.

Der Nachteil dieser Standardstimme ist, dass sie im Vergleich zu den anderen Stimmen wesentlich synthetischer klingt. Die eigens für die einzelnen Sprachen verfügbaren Stimmen wirken deutlich natürlicher.

Sprachausgabe steuern

Neben der Methode speak(), welche die Sprachausgabe beginnt, lässt sich mit pause() die Wiedergabe anhalten. Mit der Methode resume() wird eine zuvor angehaltene Wiedergabe fortgesetzt.

document.getElementById("pause").addEventListener("click", function() {
  window.speechSynthesis.pause();
}, false);

Über volume wird die Lautstärke der Wiedergabe gesteuert. Erlaubt sind Werte zwischen 0 und 1. Außerdem gibt es mehrere Event-Listener, mit denen Funktionen beispielsweise beim Start und beim Beenden der Sprachausgabe ausgeführt werden können.

worte.addEventListener("start", function() {
  document.title = "Hören Sie zu …";
}, false);

worte.addEventListener("end", function() {
  document.title = "… vorbei.";
}, false);

Startet man mehrere Sprachausgaben gleichzeitig oder beginnt eine Ausgabe, während eine andere noch in der Wiedergabe ist, werden die einzelnen per speak() initiierten Sprachausgaben nacheinander abgearbeitet. Über die Eigenschaft pending fragst du ab, ob noch Instanzen von speechSynthesis in der Warteschlange sind. Die Eigenschaft gibt entweder true oder false aus. Mit speaking kann zudem festgestellt werden, ob aktuell eine Sprachwiedergabe stattfindet.

Browserunterstützung

Obschon es sich bei SpeechSynthesis immer noch um ein als experimentell gekennzeichnetes Feature handelt, ist die Browserunterstützung durchaus gut. Einschränkungen gibt es lediglich hinsichtlich einiger Funktionen im Opera und Safari für den Desktop. Opera für Android unterstützt die API gar nicht, ist allerdings auch ein eher unbedeutenderer Vertreter im Browser-Game. SpeechRecognition wird derzeit nur von Chrome voll unterstützt und ist damit derzeit noch nicht ernsthaft für den Einsatz zu erwägen.

Beitragsbild: Depositphotos

(Der Beitrag erschien erstmals im Juli 2014 und wird seitdem aktuell gehalten. Das letzte Update erfolgte im April 2019.)

Denis Potschien

Denis Potschien

Denis Potschien ist seit 2005 freiberuflich als Kommunikationsdesigner tätig, seit Anfang 2010 im Kreativkonsulat in Iserlohn, einem Büro für Gestaltung und Kommunikation. Dort betreut er kleine und mittelständische Unternehmen ebenso wie kommunale Körperschaften und Organisationen aus Südwestfalen und dem Ruhrgebiet. Als Webdesigner und -entwickler gehören HTML5 und CSS3 zu seinen Kernthemen, weshalb er dazu 2013 ein Buch geschrieben hat. „Pure HTML5 und CSS3“ richtet sich an alle, die Vorkenntnisse haben, sich aber bisher mit HTML5 und CSS3 nicht oder nur am Rande beschäftigt haben.

7 Kommentare

  1. … so langsam wird es doch. Eine Frage: Wie kann man „Atempausen“ oder Betonung am Satzende direkt im vorzulesenden Text beeinflussen?

  2. Hallo Felix, hier gibt es eine ziemlich ausgereifte Demo auf codepen.io
    http://codepen.io/matt-west/full/wGzuJ

    Liebe Grüße
    Jens

  3. Klingt ziemlich interessant. Wenn die Speech-Synthesis-API von allen gängigen Browsern unterstützt wird, wäre ja die Grundlage für einen JavaScript-basierten Text-Reader geschaffen, der dann Artikel, Blog-Beiträge und alle anderen Webinhalte vorlesen könnte.

    So etwas gibt es von der Funktionalität her zwar breites schon, z.B. mit dem Voice Reader Web von Linguatec. Allerdings basiert diese Anwendung auf Flash, berechnet die Stimme nicht im Browser sondern sendet eine Audio-Datei die vorher auf dem Server berechnet wurde, und zudem kostet das Programm auch noch Geld für den Webseiten-Betreiber .

    Hierzu könnte die Speech-Synthesis-API eine super Alternative bieten, die völlig kostenfrei ist, kein Flash-Player benötigt, und zudem auch keine Audio-Dateien vom Server anfordern, berechnen lassen und herunterladen muss.

  4. Ziemlich interessant! Gibt es irgendwo eine online-Demo?

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.