我正在尝试创建一个轻量级双音素语音合成器.一切似乎都很简单,因为我的母语有非常简单的发音和文本处理规则.我偶然发现的唯一问题是音高控制.
据我所知,为了控制语音的音调,大多数语音合成器都使用LPC(线性预测编码),它基本上将音调信息与录制的语音样本分开,然后在合成期间,我可以提供自己的音调.需要.
问题是我不是DSP专家.我使用了Ooura FFT库来提取AFR信息,我对使用Hann和Hamming窗口(我自己实现了C++代码)有一点了解,但我主要将DSP算法视为黑盒子.
我希望找到一些开源库,它只是带有使用示例的LPC代码,但我找不到任何东西.大多数可用的代码(如Festival引擎)都紧密集成在合成器中,分离它并学习如何使用它将是一项非常艰巨的任务.
有没有任何C/C++/C#/ Java开源DSP库带有"黑盒子"风格的LPC算法和用法示例,所以我可以在其上抛出PCM样本数据并获得LPC编码输出,然后抛出编码数据和合成解码的语音数据?
我试图使这个代码工作,不知道为什么它不在本地工作.我在CodePen.io上尝试过相同的功能.
<html>
<head>
<title>Voice API</title>
</head>
<body>
<button onClick="func()">Click Me</button>
<script>
function func()
{
alert('Hello');
var recognition = new webkitSpeechRecognition();
recognition.continuous = true;
recognition.interimResults = true;
recognition.onresult = function(event)
{
alert(event.results[0][0].transcript);
}
recognition.start();
}
</script>
</body>
Run Code Online (Sandbox Code Playgroud)
有什么建议?
所以我注意到,在您使用 进行第一次发言后speechSynthesis.speak,它提供结果的速度显着加快。所以我下面的目标是通过预初始化综合来加速它,这样当我们打电话时,speakIt()我们不必等待它。它根本没有加速。关于为什么它没有加速以及我如何解决它的任何建议?
完整脚本:
var speech = new SpeechSynthesisUtterance("test");
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';
function speakIt(word){
speech.text = word;
window.speechSynthesis.speak(speech);
}
Run Code Online (Sandbox Code Playgroud)
chrome.tts.speak似乎有点快,但肯定不存在,但这不是重点 - 这应该仍然有效。在有人找到答案之前,我将迁移到 Chrome 的用法。
我正在使用HTML5 SpeechSynthesis API编写一个简单的拼写测试应用程序.我希望我的应用程序说出来的文字如下:"拼写单词是Cat.猫追着狗."
从第一句到第二句,API往往没有太多停顿.我想知道是否有办法在两个句子之间插入一点暂停.我意识到我可以创建2个单独的话语并使用pause()调用.但是,如果我可以简单地插入语法提示,代码将更简单,更简单.
通常在英语口语中,人们倾向于在段落间停留一段时间.所以我在文本中插入了换行符,但没有明显的影响.
我也试过使用省略号.
有没有办法做到这一点,还是我把一切都分成了不同的话语?
○
我正在尝试制作一个应用程序(仅适用于我自己),可以正确地发音奇怪(幻想)的名字。我找到了 chrome 的 TTS api 和 W3C 的 SpeechSynthesis API,但是看起来 Chrome 在说出剩余的文本之前去除了所有 SSML 标签:
<?xml version="1.0"?>
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3.org/2001/10/synthesis
http://www.w3.org/TR/speech-synthesis/synthesis.xsd"
xml:lang="en-US">
<!-- Phoneme representation is cut short to exaggerate problem -->
<phoneme alphabet="ipa" ph="təmei̥"> tomato </phoneme>
</speak>
Run Code Online (Sandbox Code Playgroud)
如何让 JSFiddle 中的 SSML 在 Chrome 中正确发音?
仅供参考,我正在运行 Windows,因此我无法使用特定于 mac 的发音标记。
提前致谢!
html javascript google-chrome text-to-speech speech-synthesis
我想在Chrome中使用window.SpeechSynthesis的cancel方法来切断话语并开始一个新的话(这样您就不必听到仍在排队的所有话语了)
var test = new SpeechSynthesisUtterance("Test");
window.speechSynthesis.speak(test);
window.speechSynthesis.cancel();
var test2 = new SpeechSynthesisUtterance("Test2");
window.speechSynthesis.speak(test2);
Run Code Online (Sandbox Code Playgroud)
预期:以var test开始语音,但由于cancel()立即取消语音。然后使用var test2重新开始语音,这应该可以正常工作。
当然,那没有发生。但是什么都没发生。:D似乎在cancel()之后调用了say()却什么也不做。
API说明如下:
此方法从队列中删除所有语音。如果说出话语,则说话立即停止。此方法不会更改全局SpeechSynthesis实例的暂停状态。
谢谢答案:)
使用SpeechSynthesisUtterance API 时可以选择正在读取的单词吗?
我可以用来获取当前语音和光标位置的事件吗?
这是我到目前为止的内容:
var msg = new SpeechSynthesisUtterance();
var voices = window.speechSynthesis.getVoices();
msg.voice = voices[10]; // Note: some voices don't support altering params
msg.voiceURI = 'native';
msg.volume = 1; // 0 to 1
msg.rate = 1; // 0.1 to 10
msg.pitch = 2; //0 to 2
msg.text = 'Hello World';
msg.lang = 'en-US';
msg.onend = function(e) {
console.log('Finished in ' + event.elapsedTime + ' seconds.');
};
speechSynthesis.speak(msg);
Run Code Online (Sandbox Code Playgroud)
这里的例子。
我正在寻找 onmark 事件的工作示例(https://developer.mozilla.org/en-US/docs/Web/API/SpeechSynthesisUtterance/onmark)。
我遵循 MDN 实现(Chrome 72),但 onmark 回调从未被调用。
我将结构良好的 SSML 指定为带有标记标签的文本值,如下所示:
"<?xml version='1.0'?><speak version='1.1' xmlns='http://www.w3.org/2001/10/synthesis' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:schemaLocation='http://www.w3.org/2001/10/synthesis http://www.w3.org/TR/speech-synthesis11/synthesis.xsd' xml:lang='en-US'> Go from <mark name='here'/> here, to <mark name='there'/> there!</speak>"
Run Code Online (Sandbox Code Playgroud)
希望有任何例子/想法。
谢谢你,G
这个问题在某种程度上是为了理解原型get-set。
我有一个场景,需要将SpeechSynthesis支持的语音映射到Google Translation API支持的语言代码。例如,
现在,我可以通过获取语音运行时或存储语音并在 javascript 中的某种方法中对映射进行硬编码来执行相同的操作。如果我采用运行时方法,我需要调用getVoice()并speechSynthesis.onvoiceschanged = () => {}映射号码,这些号码在每个语音更改事件中都会被调用。所以,我想要进行硬编码。
现在,当我将映射数组存储在变量中并通过索引调用它时,我得到了 SpeechSynthesisVoice 对象,就像我们在getVoices()[index].
此外,如果我将此对象值设置为speechSynthesis.voice,则会收到错误:
Uncaught TypeError: Failed to set the 'voice' property on 'SpeechSynthesisUtterance': The provided value is not of type 'SpeechSynthesisVoice'.
Run Code Online (Sandbox Code Playgroud)
这是由于手动存储的对象值的原型不匹配造成的。
例如,
1.SpeechSynthesisVoice对象:
2. 手动存储SpeechSynthesisVoice对象的值:
为了解决这个问题,我使用 获取了 SpeechSynthesisVoice 对象的原型getVoice(),然后将其设置为一个变量,并进一步将此变量设置为我的手动映射对象。喜欢,
得到:
voicePrototype = getVoices()[9].__proto__;
Run Code Online (Sandbox Code Playgroud)
放:
voices[index].SpeechSynthesisVoice.__proto__ = voicePrototype;
Run Code Online (Sandbox Code Playgroud)
并且,它已设置,如下面的屏幕截图所示:
我也尝试过Object.setPrototypeOf()并得到了相同的结果。
现在,当我再次想要将此对象设置为 时speechSynthesis.voice,尽管我的原型匹配,但我仍然遇到相同的错误。
任何人都可以请建议,是否可以同样设置对象原型并使用它?提前致谢。
我正在尝试使用 Web Speech API 来读取网页上的文本。但我发现我的Windows 10中安装的一些SAPI5语音不会显示在输出中speechSynthesis.getVoices(),包括Microsoft Eva MobileWindows 10上通过导入注册表文件“解锁”的语音。这些声音可以在本地 TTS 程序中正常工作Balabolka,但它们只是不会在浏览器中显示。浏览器是否有特定的规则来选择是否列出语音?