2017-10-03 1 views
0

Ich versuche, eine kleine Webseite mit einem Javascript zu realisieren, das erlaubt, einen spechsynthesis Teil vom Text zwischen zwei mp3 zu spielen.SpeechSynthesis.speaking nie wahr

Aus welchem ​​Grund auch immer die eine Aussage des gesprochenen Teils nicht funktioniert, ich wollte eine rekursive Funktion erstellen, die mir hilft. Dazu benutze ich die "sprechende" Methode der SpeechSynthesis. Aber aus welchem ​​Grund auch immer, Sprechen ist niemals wahr.

Ich debuggte und versuchte auch mehrere Aussagen (siehe Code), aber es stellt sich nie heraus, um wahr zu sein. Gibt es etwas mit dem Code? Wie kann man sonst einen Fehler dieser Bibliothek melden?

playEnd() spielt nur ein mp3, wenn der Synthesizer spricht. Bitte beachten Sie, wenn ich playEnd() in die if-Anweisung einfügen, wird es nicht abgespielt. Ich kann irgendeinen Code dort hineinlegen, er wird nie erreicht, da das Synthesizer-Sprechen niemals wahr sein wird. Dieses Beispiel ähnelt dem Beispiel der Mozilla-Grundlagen-Dokumentation (https://developer.mozilla.org/en-US/docs/Web/API/SpeechSynthesis/speaking). Ich wollte es testen, da die Rekursion nie funktioniert hat.

EDIT: Rekursion wird es immer noch nicht in meiner spezifischen Codierung tun. Fehle ich hier etwas?

function doSpeech() { 
      var synth = window.speechSynthesis; 
      var speech = new SpeechSynthesisUtterance(); 
      speech.text = getText(); 
      speech.lang = "en-US"; 
      speech.voice = speechSynthesis.getVoices().filter(function(voice) { return voice.name == 'Google UK English Male'; })[0]; 

      speech.addEventListener('start', function(){ 
       speechEndLoop(synth); 
      }); 


      synth.speak(speech); 
    } 

    function speechEndLoop(x) { 
      if (x.speaking) { 
       speechEndLoop(x); 
      } else { 
       playEnd(); 
      } 
     } 

Antwort

1

Es funktioniert perfekt, das Problem ist, dass Sie nach Ihrem Code sofort für den Status überprüfen. Dies kann ein Problem sein, weil es hängt davon ab, wie die API, um den Text, Audio konvertiert (unter Verwendung des lokalen Text-zu-Sprache des Betriebssystems oder die Google-Server verwenden):

function doSpeech() { 
    var synth = window.speechSynthesis; 

    var utterance1 = new SpeechSynthesisUtterance('How about we say this now? This is quite a long sentence to say. Make it longer !'); 
    var utterance2 = new SpeechSynthesisUtterance('We should say another sentence too, just to be on the safe side. even longer !'); 

    synth.speak(utterance1); 

    // If you check immediately (js code executed in less than ms) the 
    // status won't be true 
    if (synth.speaking) { 
     console.log("This is usually printed, if the utterance uses the default voice of the browser (native)"); 
    } 

    // Wait 500ms to check for the status of the utterance 
    setTimeout(function(){ 
     if (synth.speaking) { 
      console.log("This will be printed if starts after 500ms :)"); 
     } 
    }, 500); 
} 

doSpeech(); 

In meinem Fall, die beide die console.log-Anweisungen werden gedruckt. Aber wenn in Ihrem Fall ist es nicht gedruckt wird, führen Sie den Code erst nach dem Startereignis der Äußerung:

function doSpeech() { 
    var synth = window.speechSynthesis; 
    var msg = new SpeechSynthesisUtterance(); 
    msg.text = "We should say another sentence too, just to be on the safe side. even longer !"; 

    msg.addEventListener('start', function() { 
     if(synth.speaking){ 
      console.log("This will be printed !"); 
     } 
    }); 

    synth.speak(msg); 
} 

doSpeech(); 

ist ziemlich schön selbst mit der Ebene API zu arbeiten, aber wenn Sie etwas robustere Um das Text-zu-Sprache-Problem zu lösen, empfehle ich Ihnen use the JS Library Artyom.js, bietet es eine ziemlich schöne Wrapper für die Sprachsynthese-API. Auch mit dieser Bibliothek werden Sie das gleiche Verhalten sehen:

function doSpeech() { 
    let assistant = new Artyom(); 

    assistant.say('How about we say this now? This is quite a long sentence to say. Make it longer !', { 
     onStart: function() { 
      if(assistant.isSpeaking()){ 
       console.log("This will be shown"); 
      } 
     } 
    }); 

    if(assistant.isSpeaking()){ 
     console.log("This won't appear !"); 
    } 
} 

doSpeech(); 
+0

Oh ja, es macht es mit der Nachricht Beispiel (2.). Trotzdem habe ich Probleme mit der Ausführung der Rekursion. Fehle ich hier etwas grundsätzlich? (siehe oben Bearbeiten). – Kaibear