我有一个 speech.synthesis Web 应用程序,效果很好,但我想将一些文本更改为男性声音,反之亦然。它在Chrome和Mac台式机中完美运行,但对于我的生活,我无法让它在移动ios(iPhone 11.3.1),iPhone和iPad上运行。 这是相关的位(反应):
createSpeech(text) {
let speech = new SpeechSynthesisUtterance(text);
let gender = this.state.gender;
speech.volume = 1;
speech.rate = 1;
speech.pitch = 1;
speech.lang = 'en-US';
speech.voice = voices[gender];
speech.voiceURI = voices[gender].voiceURI;
return speech;
}
语音被加载(一个男性和一个女性)到称为声音的变量中。 这是有效的。 然后在每个句子上运行上面的位。
同样,这在我测试的Chrome和Mac台式机中完美运行。 但是,在我的iPhone上,我总是得到手机本身设置的默认语音。
奇怪的是,我可以切换到英语以外的其他语言,比如意大利语或西班牙语,并获得正确的声音,但英语总是只作为内部设置的默认语音播放。
有人知道为什么会这样吗? 这是一个错误吗? 我错过了什么吗? 有没有人让iPhone获得不同的英语声音,
而不是一套?>SpeechSynthesisUtterance
需要浏览器支持来提供不同的声音。换句话说,浏览器决定合成哪个声音。
因此,在不同的系统和浏览器中看到声音不同是正常的,因为基本支持也各不相同。
如果您希望在不同的平台上拥有固定的声音,您更喜欢使用在线API。
这家伙也有一些相关的研究:http://ejb.github.io/2015/06/07/html5-speech-synthesis-api.html
在iOS上,似乎有一个长期存在的错误,即您从getVoices()返回的声音并非全部可供选择。 具体来说,每个区域设置只能选择一个语音。 系统知道其他声音在那里,如果您尝试选择其中一个"禁止"声音,您将获得可用于该区域设置的声音。 因此,对于en-US,"Samantha"有效,但是如果您尝试选择"Alex",则只会得到"Samantha"。 如果你想要一个英语男声,你需要选择"Daniel"(en-GB)。 尝试使用女性en-GB声音"Serena"也会让你得到"Daniel"。 请注意,每个区域设置有一个语音,而不是每个语言一个语音。 因此,对于英语,您可以选择Samantha(en-US),Daniel(en-GB),Karen(en-AU),Moira(en-IR),Tessa(en-SA),Rishi(en-IN)。 有关完整列表,请查看 https://talkrapp.com/speechSynthesis.html
某些语言似乎有效,因为该区域设置中只有一个语音。但是,任何具有多个语音(zh-CN、ru-RU、es-ES、es-MX、it-IT、fr-FR、fr-CA 等)的区域设置都会受到影响。
这纯粹是猜想,但奇怪的巧合是,早在iOS 8和iOS 9中,返回的声音的名称是"区域设置"。 因此,从历史上看,每个区域设置仅支持一种语音是有充分理由的。 当他们更新系统以使用实际的语音名称时,他们没有以允许您选择所有语音的方式进行操作,但getVoices()确实可以访问它们。