2017-08-31 881 views
0

我使用语音识别与我的麦克风,并具有中继回我speechSynthesis数据。变化speechSynthesis语音与语音识别

我所做的声音是一个女声在页面加载,并希望能够通过说“男声”,然后将接力“我现在是一个人”,切换到一个男性的声音。我后来也希望能够做相反的事情 - 当它设定为男性的声音时,说出“女性的声音”,然后切换回来。

我目前能做到这一点,但男声将只说了一次的声音不被保存,仅作为参数传递。因此,然后说出接下来的事情会回来的女声:

let voices = []; 
window.speechSynthesis.onvoiceschanged = function() { 
    voices = window.speechSynthesis.getVoices(); 
}; 

function loadVoices(message, voice) { 
    const msg = new SpeechSynthesisUtterance(); 
    msg.voice = voice || voices[48]; // female voice 
    msg.text = message; 
    speechSynthesis.speak(msg); 
}; 

// asking for voice change here 
    if (transcript.includes('male voice')) { 
    let message = ('I am now a man'); 
    let voice = voices[50]; // male voice 
    loadVoices(message, voice); 
    } 

我想有一个全局变量,使得msg.voice指向一个全局变量,但是,这并不工作,再加上声音将恢复为默认值(电子语音):

let voiceGender = voices[48]; 
function loadVoices(message) { 
    const msg = new SpeechSynthesisUtterance(); 
    msg.voice = voiceGender // now a variable pointing to another. 
    msg.text = message; 
    speechSynthesis.speak(msg); 
}; 

    if (transcript.includes('male voice')) { 
    let message = ('I am now a man'); 
    let voiceGender = voices[50]; // changing the global variable 
    loadVoices(message); 
    } 

如果我声明voiceGenderloadVoices()内,然后我不能从if这是另一个函数内变化。

如何设置的JavaScript结构,这样我可以做到这一点?

// on pageload the voice is set to a female voice 
let femaleVoice = true; 

function loadVoices(message) { 
    const msg = new SpeechSynthesisUtterance(); 

    // checks the boolean 
    if (femaleVoice) { 
    msg.voice = voices[48]; 
    } else { 
    msg.voice = voices[50]; 
    } 

    msg.text = message; 
    speechSynthesis.speak(msg); 
}; 

// changes the boolean/changes the gender of the SpeechSynthesisUtterance voice 
function changeVoice() { 
    if (femaleVoice) { 
    femaleVoice = false; 
    } else { 
    femaleVoice = true; 
    } 
} 

if (transcript.includes('male voice') || transcript.includes('female voice')) { 
    // calls the function to change the boolean. 
    changeVoice(); 

    let message = ('I now have a different voice'); 
    loadVoices(message); 
} 

它确实增加了更多一点点线比原来想,但肯定的作品:

回答

1

我加入一个函数和一个布尔值与在loadVoices功能,使得条件来解决它。