如何使用 JavaScript 构建文本转语音应用程序?本教程将介绍如何使用 JavaScript 将文本转换为语音WebSpeechAPI
。在文本区域中输入您想要的任何内容,选择您编写的语言,然后单击按钮收听结果!
WebSpeechAPI 简介
这WebSpeechAPI
是一个 JavaScript API,
开发人员通过speechSynthesis
组件添加语音功能。
SpeechSynthesis
允许您传递文本内容和其他参数例如:语音。
它还具有多种启动、暂停、恢复和取消的方法。要从文本生成语音,首先是创建组件的实例,SpeechSynthesisUtterance
如下所示:
utterance = new SpeechSynthesisUtterance();
SpeechSynthesisUtterance
是代表您希望系统说出的文本的部分。下一步是使用 text 属性指定文本内容,如下所示;
utterance.text = "Hello world";
这里我们希望计算机说“Hello world”。
最后,调用该speak()
方法,该方法将说出上面定义的给定话语(SpeechSynthesisUtterance
对象)。
speechSynthesis.speak(utterance);
我们还可以设置语言,例如英语-US,
utterance.lang = 'en-US'
控制器SpeechSynthesis
还提供了一种getVoices()
方法,
该方法返回当前设备系统支持的语音列表,
允许用户选择自定义语音。
HTML结构
好的,让我们开始构建吧。 HTML 结构将包含以下元素:
<textarea>
要转换的文本</textarea>
。<select>
。在选择元素内填充语言。单击时会生成所
<button>
提供的文本内容。
在标头中添加 Bootstrap 的CSS链接,
如下所示:
<link href = "https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel = ‘stylesheet’ integrity = "sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin = "anonymous" />
添加 HTML 结构。
<div class = ‘container’ > <div class = ‘message alert alert-warning’ role = ‘alert’ > </div> <h1>Text to Voice Converter</h1> <form> <div class = ‘form-group’ > <label for=‘text’>Enter your text:</label> <textarea name="text" class="content form-control form-control-lg" rows="6"></textarea> </div> <div class = ’form-group‘ > <label for = ‘voices’ > Choose your language: </label> <select class = ‘select-voices form-control form-control-lg’ name = ‘voices’ > </select> </div> <button type = ’button‘ class = ’convert btn btn-primary‘ >? Convert Text to Voice </button> </form> </div>
使用 CSS
Bootstrap 几乎为我们处理了所有的样式。但让我们在设计中添加一些自定义 CSS 属性。这些将为我们提供自定义字体、容器、表单中元素的一些额外间距以及隐藏警报消息的规则。
@import url("https://fonts.googleapis.com/css2?family=DM+Mono:ital,wght@0,300;0,400;0,500;1,300;1,400;1,500&display=swap"); body { font-family: ‘DM Mono’, monospace; } .container { width: 100%; max-width: 600px; padding: 2rem 0; } .form-group { margin: 2rem 0; } label { margin-bottom: 1rem; } .message{ display: none; }
我们已设置display:none
警报组件,以便仅在有错误消息要显示时才会出现。
JavaScript 功能
正如我在简介中所解释的,我们可以使用该speechSynthesis.getVoices()
方法获取声音;让我们首先获取它们并将它们存储在这样的数组中。
const voices = [ { name: ‘Google Deutsch’, lang: ‘de-DE’ }, { name: ’Google US English‘, lang: ’en-US‘ }, { name: ’Google UK English Female‘, lang: ’en-GB‘ }, { name: ‘Google UK English Male’, lang: ’en-GB‘ }, { name: ‘Google español’, lang: ‘es-ES’ }, { name: ‘Google español de Estados Unidos’, lang: ‘es-US’ }, { name: ’Google français‘, lang: "fr-FR" }, { name: ‘Google हिन्दी’, lang: ’hi-IN‘ }, { name: ‘Google Bahasa Indonesia’, lang: ‘id-ID’ }, { name: ’Google italiano‘, lang: ‘it-IT’ }, { name: ’Google 日本語‘, lang: ‘ja-JP’ }, { name: ‘Google 한국의’, lang: ‘ko-KR’ }, { name: ’Google Nederlands‘, lang: "nl-NL" }, { name: ’Google polski‘, lang: ‘pl-PL’ }, { name: ’Google português do Brasil‘, lang: ’pt-BR‘ }, { name: ‘Google русский’, lang: ’ru-RU‘ }, { name: ‘Google 普通话(***大陆)", lang: ‘zh-CN’ }, { name: ’Google 粤語(***)‘, lang: ’zh-HK‘ }, { name: ’Google 國語(臺灣)‘, lang: ‘zh-TW’ } ];
确定所需的元素
要使用 ( DOM ) ,
获取警报、选择和按钮等。
const optionsContainer = document.querySelector(‘.select-voices’) ; const convertBtn = document.querySelector(’.convert‘) ; const messageContainer = document.querySelector(‘.message’)
创建声音选择
代表声音下拉列表的元素,用户可以从中选择一个选项optionsContainer
。<select>
我们想用声音数组中的声音填充它。创建一个名为 的函数addVoices()
。
function addVoices() { // populate options with the voices from array }
在函数内部,
使用forEach(),
循环 voices 数组,
并为每个 voice 对象设置 option.value = voice.lang
和option.text = voice.name
,
然后附加到 select 元素。
function addVoices() { console.log(voices); voices.forEach((voice) => { let option = document.createElement(’option‘); option.value = voice.lang; option.textContent = voice.name; optionsContainer.appendChild(option); if ( voice.lang === ’en-US‘ ) { option.selected = true ; } }); }
我们需要调用该addVoices()
函数来应用功能,
但是,对于谷歌浏览器,
我们需要***事件voiceschanged
,
然后调用addVoices()
函数。
所以我们要添加一个条件:
if (navigator.userAgent.indexOf(’Chrome‘) !== -1) { speechSynthesis.addEventListener(’voiceschanged‘, addVoices); } else { addVoices(); }
该voiceschanged
事件是当可用语音合成声音列表更改时触发的 JavaScript 事件。
当可用语音列表可供使用时,会发生该事件。
按钮事件***器
为生成按钮添加点击事件***器。
convertBtn.addEventListener(’click‘, function () { // display an alert message if content is empty // pass the arguments to convertToSpeech() });
在事件***器函数中,
我们希望在未提供内容时显示警报,
从文本区域获取文本,
获取所选语言,
并将值传递给函数convertToSpeech()
。
按如下方式更新事件***器。
convertBtn.addEventListener(’click‘, function () { convertText = document.querySelector(‘.content’).value; if (convertText === "") { messageContainer.textContent = " Please provide some text"; messageContainer.style.display = "block"; setTimeout(() => { messageContainer.textContent = ""; messageContainer.style.display = "none"; }, 2000); return; } const selectedLang = optionsContainer.options[optionsContainer.selectedIndex].value; convertToSpeech(convertText, selectedLang); });
创建convertToSpeech()
函数并添加以下代码:
function convertToSpeech(text, lang) { if (!(’speechSynthesis‘ in window)) { messageContainer.textContent = ’ Your browser is not supported, try another browser‘; messageContainer.style.display =‘block’ return; } let utterance = new SpeechSynthesisUtterance(); utterance.lang = lang; utterance.text = text; speechSynthesis.speak(utterance); }
该covertToSpeech()
函数将采用两个参数,即要转换的文本和文本应使用的语言。
让我们来分解一下:
如果浏览器不支持支持语音合成,我们将显示消息“您的浏览器不受支持;尝试另一个浏览器”
如果支持语音合成,我们将创建一个新
SpeechSynthesisUtterance
实例并将其分配给变量 utterance。然后我们将文本应用到语音请求
utterance.text
和语言utterance.lang
。浏览器朗读文本
speechSynthesis.speak(utterance)
。
结论
我希望您喜欢本教程并学到一些有用的东西!我们涵盖了利用WebSpeechApi
.在您的应用程序中加入文本转语音功能将满足不同的用户需求,并提高其整体可访问性。
最终演示效果:
See the Pen Text to voice Converter by Envato Tuts+ (@tutsplus) on CodePen.
- 确定所需的元素
- 创建声音选择
- 按钮事件***器
发表评论