Zur Navigation

Text in Deutsch vorlesen [2]

11 Jörg Kruse

speech.voice = voices[selectedVoice.value];

selectedVoice.value entspricht in diesem Fall dem Wert 0:

<option value="0">Google Deutsch</option>

ensprechend musst du selectedVoice.value ersetzen:

speech.voice = voices[0];

28.06.2021 15:56

12 Tim (Gast)

Hallo Jörg,

Danke für deinen Hinweis!

Habe das ganze ausgebessert, aber es funktioniert leider noch nicht.
https://www.ergotherapie-wiesinger.de/Vorlesen/22/

Habe vieles probiert, aber ich bekomme es nicht hin.

Ist die folgende Zeile korrekt?
    let tts = document.getElementById("textToSpeech");
das div, in dem sich der vorzulegende Text befindet, ist mit der korrekten ID angegeben.

Habe auch probiert, die folgende Zeile
    let tts = document.getElementById("textToSpeech");
folgendermaßen abzuändern:
    let tts = document.getElementById("textToSpeech").innerText;
aber das funktioniert auch nicht. Siehe hier:
https://www.ergotherapie-wiesinger.de/Vorlesen/22/index2.html

Braucht man die folgende Zeile noch?
    let selectedVoice = document.getElementById("voiceSelect");
die Stimme ist schließlich schon festgelegt.

29.06.2021 14:03

13 Tim (Gast)

Hallo Jörg, hast du noch einen Tipp für mich?
Oder geht das nicht, was ich haben möchte?

30.06.2021 17:13

14 Jörg Kruse

Momentan bin ich zeitlich stark ausgelastet, so dass ich da nur kurz darauf eingehen kann:

    let tts = document.getElementById("textToSpeech");
    speech.text = tts.value;

Der Text befindet sich ja jetzt innerhalb von div#text. Also muss die ID entsprechend angepasst werden. Und da es sich um ein div handelt, kann auf den Text-Inhalt über innerText zugegriffen werden

    let tts = document.getElementById("text");
    speech.text = tts.innerText;

30.06.2021 18:07

15 Tim (Gast)

vielen Dank Jörg für deine erneute Hilfe.
Werde das ganze jetzt gleich ausprobieren.

Tut mir leid, ich wollte dich nicht drängen.
Bin sehr froh, dass du mir hilft und es macht nichts, wenn es mal länger mit einer Antwort von dir dauert.

01.07.2021 15:24

16 Tim (Gast)

Hallo Jörg,

Habe deinen Tipp umgesetzt, aber es funktioniert leider nicht.
Siehe hier:
https://www.ergotherapie-wiesinger.de/Vorlesen/23/

Die Konsole im Chrome zeigt folgende Fehlermeldung:
script.js:53 Uncaught TypeError: Cannot read property 'appendChild' of null
at SpeechSynthesis.setVoices (script.js:53)

Zeile 53 im Skript ist folgende:
voicesSelect.appendChild(option);


Habe dann vieles probiert, aber mehr als das folgende ist nicht dabei herausgekommen und es funktioniert auch nicht:
https://www.ergotherapie-wiesinger.de/Vorlesen/23/index2.html

Habe unter anderem den folgenden Absatz entfernt, denn die Sprache soll ja nicht ausgewählt werden sondern sie ist bereits definiert
var setVoices = function () {
    let voices = speechSynthesis.getVoices();
    let voicesSelect = document.getElementById("voiceSelect");
    for (let index in voices) {
        let option = document.createElement("OPTION");
        option.value = index;
        option.innerHTML = voices[index].name;
        voicesSelect.appendChild(option);
    }
};

Dann habe ich mir gedacht, dass in folgendem Absatz noch die eine oder andere Zeile entfernt werden kann, denn die Sprache ist definiert.
var play = function () {
    var self = this;
    this.disabled = true;
    let voices = speechSynthesis.getVoices();
    let speech = new SpeechSynthesisUtterance();
    let selectedVoice = document.getElementById("voiceSelect");
    let tts = document.getElementById("lesen");
    speech.text = tts.innerText;
    speech.voice = voices[0];
    speechSynthesis.speak(speech);
    speech.onend = function () {
        self.disabled = false;
    };
};

Habe dann auch im ersten Abschnitt etwas entfernt.
var init = function () {
    if (window.speechSynthesis) {
        if ("onvoiceschanged" in speechSynthesis) {
            speechSynthesis.onvoiceschanged = setVoices;
        } else {
            setVoices();
        }
    }
so schaut das ganze dann aus:

Habe dann auch im ersten Abschnitt etwas entfernt.
var init = function () {
    if (window.speechSynthesis) {
    }

Aber es funktioniert eben leider nicht.

05.07.2021 14:59

17 Jörg Kruse

Ich empfehle immer, nur eine einzelne Sache zu ändern, und die nächste erst dann, wenn weiterhin alles funktioniert.

Das mit dem Entfernen der Funktionsaufrufe und der Definition von setVoices war schon richtig so, die Fehlermeldung ist dann ja auch verschwunden. Den leeren if Block kannst du auch noch rausnehmen:

    if (window.speechSynthesis) {
    }

Aber es funktioniert eben leider nicht.

Weil es wohl noch ein weiteres Problem gibt. Probier es erstmal mit einem kleinen Vorlese-Text ohne Umlaute, z.B. "Hallo Welt".

05.07.2021 17:18 | geändert: 05.07.2021 17:20

18 Tim (Gast)

Hallo Jörg,

Habe deinen Tipp umgesetzt.
Ein kurzer Text ohne Umlaute funktioniert.
https://www.ergotherapie-wiesinger.de/Vorlesen/24/index1.html

Mein gewünschter Text, der Umlaute enthält, funktioniert jedoch nicht:
https://www.ergotherapie-wiesinger.de/Vorlesen/24/index.html

Wo liegt denn das Problem?

Kann es sein, dass man die Sprache anderweitig definieren muss?
speech.lang = 'de-DE'



Habe dann noch ein bisschen probiert und die folgenden Zeilen im Skript entfernt
    let voices = speechSynthesis.getVoices();

Leider erhalte ich dann die Fehlermeldung, dass keine Sprache ausgewählt wurde.
https://www.ergotherapie-wiesinger.de/Vorlesen/24/index2.html
https://www.ergotherapie-wiesinger.de/Vorlesen/24/index21.html


07.07.2021 14:20

19 Jörg Kruse

Das Original kann auch keine Umlaute:

https://www.ergotherapie-wiesinger.de/Vorlesen/2/Original/

Wenn ä, ö, ü und ß in ae, oe, ue und ss umgewandelt werden, geht's

Siehe auch Fazit auf dieser Seite:

Allerdings sollte man auf jeden Fall die Umlaute vorher umwandeln, da die Speech Synthesis API mit den Sonderzeichen ä,ö,ü und ß noch erste Probleme hat und man den Browser neu starten muss, bevor er wieder spricht.

Das Umwandeln könnte man auch in JavaScript vornehmen, beispielsweise mit dieser Lösung von Andreas Richter (ungetestet):

https://stackoverflow.com/questions/11652681/replacing-umlauts-in-js/11653019#answer-54346022

... und dessen Funktion replaceUmlaute() auf tts.innerText anwenden:

speech.text = replaceUmlaute(tts.innerText);

07.07.2021 16:41 | geändert: 07.07.2021 16:41

20 Tim (Gast)

vielen Dank Jörg für deine Tipps!
Werde mich daran versuchen


Aber wieso funktioniert das vorlesen dann mit dem anderen Beispiel?
Also das Beispiel, dass keine Pause-Schaltfläche hat?

08.07.2021 10:04