7

Ho utilizzato la nuova API Speech Synthesis in Chrome (33 e versioni successive) per creare un supporto di comunicazione basato sul web. Vorrei che l'utente fosse in grado di cambiare la voce tra maschio e femmina, che l'API mi consente di fare. Tuttavia, quando la pagina viene caricata per la prima volta e la prima volta che viene eseguita la funzione (da un evento onclick) utilizza la voce femminile predefinita. Quindi, ogni volta che viene eseguito dopo, usa la voce maschile a cui sto cercando di usare. Come posso far funzionare la voce maschile anche per la prima volta?Perché la voce dell'API di sintesi vocale cambia quando la funzione viene eseguita più di una volta?

Ecco il pulsante che chiama il javascript:

<button type="button" name="speakMe"id="speakMe" onclick="speakPhrase($('phraseBar').getValue());" ><img src="images/speakMe.png" /></button> 

E qui è la funzione speakPhrase che sta chiamando:

function speakPhrase(phrase) { 
    if(phrase =="") 
    { 
     alert("Please enter a phrase before asking me to speak for you. Thank you!"); 
    } 
    else 
    { 
     var speech = new SpeechSynthesisUtterance(phrase); 
     var voices = window.speechSynthesis.getVoices(); 
     speech.voice = voices.filter(function(voice) { return voice.name == 'Google UK English Male'; })[0]; 
     window.speechSynthesis.speak(speech); 

    } 
} 

Chiunque può aiutare?

risposta

0

Con un po 'di fortuna sono riuscito a risolvere il problema impostando l'attributo di default su false prima di impostare la voce

function speakPhrase(phrase) { 
    if(phrase =="") 
    { 
     alert("Please enter a phrase before asking me to speak for you. Thank you!"); 
    } 
    else 
    { 
     var speech = new SpeechSynthesisUtterance(phrase); 
     var voices = window.speechSynthesis.getVoices(); 
     speech.default = false; 
     speech.voice = voices.filter(function(voice) { return voice.name == 'Google UK English Male'; })[0]; 
     speech.lang = 'en-GB'; //Also added as for some reason android devices used for testing loaded spanish language 
     window.speechSynthesis.speak(speech); 
    } 
} 
+0

stesso problema. Non ha funzionato per me. – agoldev

+0

Il problema è facile da vedere se si ascoltano le voci console.log dopo la prima chiamata. onVoices Aggiornamenti modificati non appena disponibili. –

7

Sembra che l'array voci è vuota alla prima chiamata. Da quello che ho letto ha qualcosa a che fare con una chiamata asincrona per caricare le voci. Quindi, è sempre vuoto la prima volta che viene chiamato. Per me questo ha fatto la magia:

var speech_voices; 
if ('speechSynthesis' in window) { 
    speech_voices = window.speechSynthesis.getVoices(); 
    window.speechSynthesis.onvoiceschanged = function() { 
    speech_voices = window.speechSynthesis.getVoices(); 
    }; 
} 

Chiama da qualche parte al di fuori della funzione vocale.

0

Ho risolto il problema.

Causa principale: quando chiami API per la prima volta, le voci non vengono caricate per qualche motivo. E i carichi vocali predefiniti per la prima volta.

così ho aggiunto sotto riga di codice di caricamento della pagina o avviare o stato pronto che è anche prima che il mio codice si chiama:

voices = window.speechSynthesis.getVoices(); 

che ha risolto il mio problema, speranza che aiuta gli altri.

0

Risposta aggiornata. Questo è un lavoro per me.

$(window).load(function(){ voices = window.speechSynthesis.getVoices(); })