gpt4 book ai didi

javascript - 为什么我不能在 SpeechSynthesisUtterance() 中选择女性 "Microsoft Zira"声音?

转载 作者:行者123 更新时间:2023-12-04 07:19:22 24 4
gpt4 key购买 nike

我下面的 HTML 页面正确地说出了文本,但它不是以女性的声音说话 Microsoft Zira Desktop - English (United States) . 问题 :我在这里可能缺少什么,我们如何让它以女性的声音说话?
备注 : 我在 MS Edge 中试过这个 html和 Google Chrome多次刷新和不刷新页面,但它一直用相同的男性声音说话。似乎它忽略了 msg.voice下面的 JavaScript 中的值。我正在使用 Windows 10 - 这可能无关紧要。

<!DOCTYPE html>
<html>
<head>
<script>
function myFunction() {
var msg = new SpeechSynthesisUtterance();
msg.voice = speechSynthesis.getVoices().filter(function(voice) {
return voice.name == "Microsoft Zira Desktop - English (United States)"})[0];
msg.text = document.getElementById("testDiv").textContent;
window.speechSynthesis.speak(msg);
}
</script>
</head>
<body>

<h2>JavaScript in Head</h2>

<div id="testDiv">SQL Managed Instance gives you an instance of SQL Server but removes much of the <b>overhead</b> of managing a <u>virtual machine</u>. Most of the features available in SQL Server are available in SQL Managed Instance. This option is ideal for customers who want to use instance-scoped features and want to move to Azure without rearchitecting their applications.</div>

<button type="button" onclick="myFunction()">Try it</button>

</body>
</html>
更新
根据用户的建议 @Frazer ,我跑了 speechSynthesis.getVoices()在我的 google chrome 控制台中并得到以下结果 - 确实包含 Microsoft Zira .... 语音:
enter image description here
观察 :
关注 this建议,我动了 <script>阻塞到主体阻塞的末尾(就在 </body> 之前)但仍然是相同的男声。 然而 ,当我替换来自 Microsoft Zira Desktop - English (United States) 的声音时至 Google UK English Female ,发生以下情况:第一次点击 Try it按钮,扬声器仍然是默认的男性,但每次点击此按钮时,我都会正确地得到 Google UK English Female语音。注意: Microsoft Zira Desktop - English (United States)在上面的场景中什么都不做。这让我相信这项技术仍然是经验性的 - 如前所述 here .

最佳答案

为什么它适用于某些浏览器?
我在这里有一个类似问题的答案,Why is the voiceschanged event fired on page load? ,但我认为您的情况完全不同,值得一个新的答案。
首先,为什么它有时会起作用?因为 "Microsoft Zira Desktop - English (United States)"通过 API 调用从 Web 检索,并且在下一行执行时该数据不可用。 基本上 , 你应该等到 onvoiceschanged在实际调用 getVoices() 之前调用获得声音。
引用文档...

With Chrome however, you have to wait for the event to fire before populating the list, hence the bottom if statement seen below. (Source: MDN WebDocs: SpeechSynthesis.onvoiceschanged) (Emphasis mine.)


如果列表未填充,并且您没有可用的女性语言,则默认情况下男性将播放。
由于构造函数`getVoices()` 进行了API 调用,因此将其视为异步
尝试像这样运行你的代码......
var msg = new SpeechSynthesisUtterance();
var voices = window.speechSynthesis.getVoices();

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

function myFunction() {
console.log(voices);
msg.voice = voices.filter(function(voice) {
return voice.name == "Microsoft Zira - English (United States)"})[0];
console.log(msg.voice);
msg.text = document.getElementById("testDiv").textContent;
window.speechSynthesis.speak(msg);
}
附言这是我自己的编码示例,说明我如何处理文本到音频阅读器上加载的声音: GreenGluon CMS: text-audio.js也在这里: PronounceThat.com pronounce-that.js

关于javascript - 为什么我不能在 SpeechSynthesisUtterance() 中选择女性 "Microsoft Zira"声音?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68598976/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com