Javascript 我们可以使用JS SpeechSynthesis创建一个经过调制的GLaDOS声音吗?

Javascript 我们可以使用JS SpeechSynthesis创建一个经过调制的GLaDOS声音吗?,javascript,html,text-to-speech,speech-synthesis,Javascript,Html,Text To Speech,Speech Synthesis,使用内置的,是否可以像JavaScript一样创建调制语音? 我目前拥有的代码(如下)split()s将短语合成为单独的单词,每个单词以随机确定的音调发出,以尝试产生所需的效果。 在所说的话之间有太长的休息时间,调制不令人满意 if('speechSynthesis'在窗口中){ var speechSynthesis=window.speechSynthesis; speechSynthesis.onvoiceschanged=函数(){ console.log(语音合成) var phra

使用内置的,是否可以像JavaScript一样创建调制语音?

我目前拥有的代码(如下)
split()
s将短语合成为单独的单词,每个单词以随机确定的音调发出,以尝试产生所需的效果。
在所说的话之间有太长的休息时间,调制不令人满意

if('speechSynthesis'在窗口中){
var speechSynthesis=window.speechSynthesis;
speechSynthesis.onvoiceschanged=函数(){
console.log(语音合成)
var phrase=“你好,我是格拉多斯”;
变量部分=短语。拆分(“”);
用于(var i部分){
变量词=部分[i];
var text=新演讲(word);
text.voice=speechSynthesis.getVoices[2];//英语女声
文本。比率=1.2;
text.pitch=Math.random()*.5+1.50;
演讲综合。演讲(文本);
}
}
}
自动调谐 这个答案主要是出于善意的意见,旨在提供帮助

不幸的是,我相信,对格拉多斯声音的影响必须通过好莱坞所谓的“后遗症”来实现;声音发出后需要进行处理

调整音调和/或速率总是只会影响整个话语的输出,一旦被调用,其结果似乎是一成不变的。
你的想法是将话语分割成单词,并以随机的音高和速率输出每个单词,这是聪明的,这可能是我们在不进行后期处理的情况下所能得到的最接近的结果

顺便说一句:我不知道我们是否可以对话语进行后处理,并且怀疑如果可能的话,它将需要某种形式的浏览器扩展/插件

但是,如果音高和音速设置正确(取决于声音),可以强制有效地播放一些声音(我强烈怀疑声音的可用性可能会以相对不可预测的方式发生变化)

话虽如此,我无法提供标准界面之外的任何内容。
但我注意到,如果您计划进行实验,您发布的代码示例中有几个问题需要解决

特别是,您的代码:

text.voice=speechSynthesis.getVoices[2]

不会选择第三种可用语音。如果尝试更改索引值,您会注意到语音不会更改,因为
window.speechSynthesis.getVoices
返回函数而不是函数的返回。
你可以做:

text.voice = speechSynthesis.getVoices()[2];
但这有点自以为是

。。。返回表示当前设备上所有可用语音的对象列表

和(铬合金和边缘†)

。。。当
SpeechSynthesis.getVoices()
方法返回的
SpeechSynthesisVoice
对象列表发生更改时(当触发
voiceschanged
事件时),将运行

当在服务器端进行语音合成并异步确定语音列表时,或者在语音合成应用程序运行时安装/卸载客户端语音时,可能会发生这种情况

同样地,的触发可†用于启动语音列表的编译,然后可访问该列表,如下所示:

var voices = SpeechSynthesis.getVoices();
utterance.voice = voices[ 2 ];
请注意,Firefox目前不支持该功能,只会在触发
SpeechSynthesis.getVoices()
时返回语音列表。但是,使用Chrome,您必须等待事件触发后才能填充列表

“欢迎来到光圈科学计算机辅助浓缩中心” 虽然下面的代码不会神奇地提供自动调谐的GLaDOS语音,但它将提供一种更简单的方法来尝试各种可能性,并演示如何正确地访问可用的语音

插入更新(2019年1月6日): 在编写下面的代码时,谷歌默认的声音是女性,因此效果比现在可能听到的要好。这些API及其相关资源和服务可能会发生变化

还要注意的是,Chrome中的
SpeechSynthesis.speak()
(其他浏览器可能会跟进)将“在文档未收到用户激活时立即触发错误”

结束更新。
if(window.hasOwnProperty(“speechSynthesis”)){
语言、声音、话语;
const speechSynth=window.speechSynthesis,
表单=document.querySelector(“表单”),
playSample=()=>{
如果(speechSynth.speaking){
speechSynth.cancel();
//Windows上Chrome上的默认语音无法正常工作
}
话语=新的话语合成(form.sample.value);
outrance.voice=语音[form.voice.selectedIndex];
outrance.volume=form.volume.valueAsNumber*0.01;
outrance.pitch=form.pitch.valueAsNumber*0.01;
outrance.rate=form.rate.valueAsNumber*0.01;
讲话(话语);
},
初始化=()=>{
如果(!voices){//修复了三重触发的古怪
voices=speechSynth.getVoices();
voices.forEach((v)=>{
opt=document.createElement(“选项”);
opt.textContent=v.name;
如果(v.name==“谷歌美国英语”){
opt.selected=true;
form.rate.value=65;
}
形式.语音.附加子项(opt);
} );
表单。addEventListener(“输入”,播放样本,假);
form.play.addEventListener(“单击”,播放示例,false);
playSample();
}
};
if(speechSynth.onvoi