api语音合成_语音网页和语音合成API
api语音合成 几周前,我简要讨论了NLP及其相关技术。 在处理自然语言时,要考虑两个不同但互补的方面:自动语音识别( ASR )和文本转语音( TTS )。 在介绍Web语音API的文章中,我讨论了Web语音API,这是一种在Web浏览器中提供语音输入和文本到语音输出功能的API。 您可能已经注意到,我只介绍了如何在网站中实现语音识别,而不是语音合成。 在本文中,我们将填补描述语音合成API的空
api语音合成
几周前,我简要讨论了NLP及其相关技术。 在处理自然语言时,要考虑两个不同但互补的方面:自动语音识别( ASR )和文本转语音( TTS )。 在介绍Web语音API的文章中,我讨论了Web语音API,这是一种在Web浏览器中提供语音输入和文本到语音输出功能的API。 您可能已经注意到,我只介绍了如何在网站中实现语音识别,而不是语音合成。 在本文中,我们将填补描述语音合成API的空白。
语音识别为用户(尤其是残障人士)提供了向网站提供信息的机会。 回顾我强调的用例:
在网站中,用户可以使用自己的声音浏览页面或填充表单字段。 用户也可以在驾驶时与页面进行交互,而不会将视线移开。 这些不是平凡的用例。
因此,我们可以将其视为从用户到网站的渠道。 语音合成是另一种方式,使网站能够通过阅读文本向用户提供信息。 这对于盲人以及通常有视力障碍的人特别有用。
语音合成具有与语音识别一样多的用例。 想想看,在一些新车中实现的系统会读取您的文本或电子邮件,这样您就不必将视线移开。 使用计算机的视力障碍人士熟悉JAWS之类的软件,该软件可以读取桌面上的所有内容,从而使他们能够执行任务。 这些应用程序很棒,但是花费很多钱。 多亏了语音合成API,我们可以帮助人们使用我们的网站,无论他们身在何处。
例如,假设您正在博客上写文章(就像我现在所做的那样),为了提高其可读性,您将其分为几段。 这不是使用语音合成API的好机会吗? 实际上,我们可以对我们的网站进行编程,以便一旦用户将鼠标悬停在(或专注于)文本上时,屏幕上就会出现一个扬声器图标。 如果用户单击该图标,我们将调用一个函数,该函数将合成给定段落的文本。 这是不平凡的改进。 更好的是,对于我们作为开发人员而言,它的开销非常低,对用户而言则没有开销。 下面的JS Bin中显示了此概念的基本实现。
语音合成API演示
现在,我们进一步了解了此API的用例,让我们了解其方法和属性。
方法和属性
语音合成API定义了一个称为SpeechSynthesis
的接口,其结构在此处介绍。 像上一篇文章一样,本文不会涵盖规范中描述的所有属性和方法。 原因是它太复杂而无法在一篇文章中介绍。 但是,我们将解释足够的元素,以使您轻松理解那些未涵盖的内容。
SpeechSynthesisUtterance
对象
我们需要学习的第一个对象是SpeechSynthesisUtterance
对象。 它代表合成器将要说的话语(即文本)。 该对象非常灵活,可以通过多种方式自定义。 除文本外,我们还可以设置用于发音的语言,速度甚至音高。 以下是其属性的列表:
-
text
–一个字符串,指定要合成的语音(文本)。 -
lang
–表示语音合成语音的语言的字符串(例如“ en-GB”或“ it-IT”)。 -
voiceURI
–一个字符串,它指定语音合成语音和Web应用程序希望使用的语音合成服务的位置。 -
volume
–代表文本volume
的数字。 取值范围是0(最小值)到1(最大值),且默认值为1。 -
rate
–一个数字,表示发声的说话率。 它与语音的默认速率有关。 默认值是1。值2表示发声的速度是默认速度的两倍。 小于0.1或大于10的值是不允许的。 -
pitch
–代表发声的pitch
的数字。 范围从0(最小)到2(最大)。 预设值是1。
要实例化此对象,我们可以将文本传递给synthesize作为构造函数参数,也可以忽略该文本并在以后进行设置。 以下代码是第一种情况的示例。
// Create the utterance object
var utterance = new SpeechSynthesisUtterance('My name is Aurelio De Rosa');
下面显示了第二种情况,该情况构造了SpeechSynthesisUtterance
,然后分配了参数。
// Create the utterance object
var utterance = new SpeechSynthesisUtterance();
utterance.text = 'My name is Aurelio De Rosa';
utterance.lang = 'it-IT';
utterance.rate = 1.2;
该对象公开的一些方法是:
-
onstart
–设置在综合开始时触发的回调。 -
onpause
–设置在语音合成暂停时触发的回调。 -
onresume
–设置在恢复综合时触发的回调。 -
onend
–设置综合结束时触发的回调。
SpeechSynthesisUtterance
对象允许我们设置SpeechSynthesisUtterance
的文本以及配置说的方式。 目前,我们仅创建了代表话语的对象。 我们仍然需要将其绑定到合成器。
SpeechSynthesis
对象
SpeechSynthesis
对象不需要实例化。 它属于window
对象,可以直接使用。 该对象公开了几种方法,例如:
-
SpeechSynthesisUtterance
speak()
–接受SpeechSynthesisUtterance
对象作为其唯一参数。 此方法用于合成话语。 -
stop()
–立即终止综合过程。 -
pause()
–暂停综合过程。 -
resume()
–恢复综合过程。
另一个有趣的方法是getVoices()
。 它不接受任何参数,用于检索特定浏览器可用的语音列表(数组)。 列表中的每个条目都提供诸如name
,助记符名称之类的信息,以便为开发人员提供语音提示(例如“ Google US English”), lang
,语音语言(例如it-IT)和voiceURI
,此语音的语音合成服务的位置。
重要说明 :在Chrome和Safari中, voiceURI
属性改为名为voice
。 因此,我们将在本文中构建的演示使用voice
而不是voiceURI
。
浏览器兼容性
不幸的是,在撰写本文时,唯一支持语音合成API的浏览器是具有完全支持的Chrome 33和具有部分支持的Safari for iOS 7。
演示版
本部分提供了语音合成API的简单演示。 该页面允许您输入一些文本并进行合成。 此外,还可以设置速率,音高和您要使用的语言。 您还可以随时使用提供的相应按钮停止,暂停或恢复文本的合成。
在将侦听器附加到按钮之前,由于对此API的支持非常有限,我们对实现进行测试。 像往常一样,测试非常简单,由以下代码组成:
if (window.SpeechSynthesisUtterance === undefined) {
// Not supported
} else {
// Read my text
}
免费学习PHP!
全面介绍PHP和MySQL,从而实现服务器端编程的飞跃。
原价$ 11.95 您的完全免费
如果测试失败,我们会向用户显示消息“不支持API”。 验证支持后,我们会在标记中放置的特定选择框中动态加载可用的语音。 请注意,Chrome中的getVoices()
方法存在问题( #340160 )。 因此,我使用setInterval()
为它创建了一种解决方法。 然后,我们为每个按钮附加一个处理程序,以便它们可以调用其特定的动作(播放,停止等)。
此处提供了代码的实时演示。 另外,该演示以及到目前为止我已经构建的所有其他演示都可以在我的HTML5 API演示存储库中找到。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<title>Speech Synthesis API Demo</title>
<style>
*
{
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
body
{
max-width: 500px;
margin: 2em auto;
padding: 0 0.5em;
font-size: 20px;
}
h1,
.buttons-wrapper
{
text-align: center;
}
.hidden
{
display: none;
}
#text,
#log
{
display: block;
width: 100%;
height: 5em;
overflow-y: scroll;
border: 1px solid #333333;
line-height: 1.3em;
}
.field-wrapper
{
margin-top: 0.2em;
}
.button-demo
{
padding: 0.5em;
display: inline-block;
margin: 1em auto;
}
</style>
</head>
<body>
<h1>Speech Synthesis API</h1>
<h3>Play area</h3>
<form action="" method="get">
<label for="text">Text:</label>
<textarea id="text"></textarea>
<div class="field-wrapper">
<label for="voice">Voice:</label>
<select id="voice"></select>
</div>
<div class="field-wrapper">
<label for="rate">Rate (0.1 - 10):</label>
<input type="number" id="rate" min="0.1" max="10" value="1" step="any" />
</div>
<div class="field-wrapper">
<label for="pitch">Pitch (0.1 - 2):</label>
<input type="number" id="pitch" min="0.1" max="2" value="1" step="any" />
</div>
<div class="buttons-wrapper">
<button id="button-speak-ss" class="button-demo">Speak</button>
<button id="button-stop-ss" class="button-demo">Stop</button>
<button id="button-pause-ss" class="button-demo">Pause</button>
<button id="button-resume-ss" class="button-demo">Resume</button>
</div>
</form>
<span id="ss-unsupported" class="hidden">API not supported</span>
<h3>Log</h3>
<div id="log"></div>
<button id="clear-all" class="button-demo">Clear all</button>
<script>
// Test browser support
if (window.SpeechSynthesisUtterance === undefined) {
document.getElementById('ss-unsupported').classList.remove('hidden');
['button-speak-ss', 'button-stop-ss', 'button-pause-ss', 'button-resume-ss'].forEach(function(elementId) {
document.getElementById(elementId).setAttribute('disabled', 'disabled');
});
} else {
var text = document.getElementById('text');
var voices = document.getElementById('voice');
var rate = document.getElementById('rate');
var pitch = document.getElementById('pitch');
var log = document.getElementById('log');
// Workaround for a Chrome issue (#340160 - https://code.google.com/p/chromium/issues/detail?id=340160)
var watch = setInterval(function() {
// Load all voices available
var voicesAvailable = speechSynthesis.getVoices();
if (voicesAvailable.length !== 0) {
for(var i = 0; i < voicesAvailable.length; i++) {
voices.innerHTML += '<option value="' + voicesAvailable[i].lang + '"' +
'data-voice-uri="' + voicesAvailable[i].voiceURI + '">' +
voicesAvailable[i].name +
(voicesAvailable[i].default ? ' (default)' : '') + '</option>';
}
clearInterval(watch);
}
}, 1);
document.getElementById('button-speak-ss').addEventListener('click', function(event) {
event.preventDefault();
var selectedVoice = voices.options[voices.selectedIndex];
// Create the utterance object setting the chosen parameters
var utterance = new SpeechSynthesisUtterance();
utterance.text = text.value;
utterance.voice = selectedVoice.getAttribute('data-voice-uri');
utterance.lang = selectedVoice.value;
utterance.rate = rate.value;
utterance.pitch = pitch.value;
utterance.onstart = function() {
log.innerHTML = 'Speaker started' + '<br />' + log.innerHTML;
};
utterance.onend = function() {
log.innerHTML = 'Speaker finished' + '<br />' + log.innerHTML;
};
window.speechSynthesis.speak(utterance);
});
document.getElementById('button-stop-ss').addEventListener('click', function(event) {
event.preventDefault();
window.speechSynthesis.cancel();
log.innerHTML = 'Speaker stopped' + '<br />' + log.innerHTML;
});
document.getElementById('button-pause-ss').addEventListener('click', function(event) {
event.preventDefault();
window.speechSynthesis.pause();
log.innerHTML = 'Speaker paused' + '<br />' + log.innerHTML;
});
document.getElementById('button-resume-ss').addEventListener('click', function(event) {
event.preventDefault();
if (window.speechSynthesis.paused === true) {
window.speechSynthesis.resume();
log.innerHTML = 'Speaker resumed' + '<br />' + log.innerHTML;
} else {
log.innerHTML = 'Unable to resume. Speaker is not paused.' + '<br />' + log.innerHTML;
}
});
document.getElementById('clear-all').addEventListener('click', function() {
log.textContent = '';
});
}
</script>
</body>
</html>
结论
在本文中,我们介绍了语音合成API。 这是一个API,可以为我们的网站用户(尤其是有视觉障碍的用户)合成文本并改善其整体体验。 如我们所见,该API公开了多个对象,方法和属性,但是使用起来并不难。 不幸的是,目前它的浏览器支持非常差,Chrome和Safari是唯一支持它的浏览器。
希望有更多的浏览器会效仿这种领导方式,让您切实考虑在网站上使用它。 我决定了 如果您喜欢这篇文章,请不要忘了演示该示例并发表评论。 我真的很想听听您的意见。
翻译自: https://www.sitepoint.com/talking-web-pages-and-the-speech-synthesis-api/
api语音合成
更多推荐
所有评论(0)