如何让我的网络浏览器以编程方式说话?

时间:2018-01-29 15:04:06

标签: javascript

是否可以让网站以编程方式向用户说出欢迎信息?

假设我想在成功登录我的网站时用音频消息问候用户。我知道我可以录制问候语(即MP3),然后播放,但我希望能够以编程方式执行此操作,因为所有用户的名称都会有所不同。

例如,我可能想在John Doe登录时说Welcome, John Doe

我怎么能用普通的javascript做到这一点?

注意:这不适用于生产系统,而是用作较大的UX实验的较小部分。

2 个答案:

答案 0 :(得分:17)

要让window.speechSynthesis.speak()在Chromium浏览器中呈现音频输出,用户需要安装speech-dispatcher并使用--enable-speech-dispatcher标志启动浏览器。

需要调用

onvoiceschanged事件处理程序和window.speech.synthesis.getVoices()来填充可用语音列表。 API并不简单;可能需要为.getVoices()对象调用两次 SpeechSynthesisVoice来填充.getVoices()返回的数组。

请注意,.speak()的调用可能会被放入队列,不会呈现为音频输出,这不是立即显现的;调用window.speechSynthesis.cancel()清除队列,然后可以意外地呈现音频输出。

然后,您可以使用window.speechSynthesis.speak()

现在已经尝试了一段时间,默认情况下在Chromium浏览器中为* nix启用SSML解析;不使用外部网络服务,需要某种形式的EUA或不像啤酒那样免费。

已联系的实体列表和要求实现这一目标的问题非常冗长,例如

Firefox * * nix也不解析SSML。

也许广大用户对此感兴趣,我们最终可以默认启用此功能。

虽然在不使用外部Web服务的情况下有SSML解析的解决方法;下面的第一个链接仍未得到答复;虽然包含使用shell_exec()之后使用$_POST调用二进制文件到本地服务器

的PHP代码

注意,当前的Web Speech API实现存在一些错误,特别是在volume更改SpeechSynthesisUtterance属性对Chromium和Firefox的音频输出没有影响

使用.pause().resume()时也存在一个错误,在尝试以编程方式解析SSML的<break>元素时遇到错误

使用显然已失效的Web Speech API的替代方法是speak.js,它是通过将espeak移植到JavaScript或meSpeak.jsspeak.js的分支)创建的。现在正在积极维护espeak-ng,例如使用meSpeak.js

的修改版本

或使用提供反映单词

的语音文件的在线词典

有趣的是,在发帖后回答&#34; gstatic&#34; &#34;词典&#34;不再提供音频文件。

幸运的是,我们有

  

这是一个用于收集演讲捐赠的网络,Android和iOS应用   共同语音项目。

非常活跃。

我们也可以在Chromium / Chrome和Firefox上使用Native Message来调用与本机shell的交互并调用二进制文件

此代码使用Native Messaging

进行最少的修改,从而达到预期的结果

或作为一项重大措施,更改二进制文件

(意见,事后支持)

语音合成技术有一个庞大的网络服务市场,无论是在其生成阶段(&#34; [L] yrebird&#34;)还是认识 - 获取利润 ieg,& #34 *的LexA&#34 ;; &#34; *奥利&#34 ;; (* bm)&#34; * atson * luemix&#34 ;; (* oogle)&#34; * ctions&#34 ;;等

开源开发人员需要继续努力在开源浏览器中维护开源(FOSS; FLOSS)语音合成技术。如果我们希望默认情况下在浏览器中实现这些技术,开源开发人员必须编写代码才能实现这一点。

答案 1 :(得分:6)

这可以通过SpeechSynthesisUtterance实现  Web Speech API的界面。有关此here的更多信息。

以下javascript在Chrome中执行时会显示“欢迎John Doe”。确保音量调高!

const message = new SpeechSynthesisUtterance('Welcome, John Doe'); 
window.speechSynthesis.speak(message);

Web Speech API还提供语音识别界面。以下代码将语音字词打印到浏览器控制台。

const recognition = new webkitSpeechRecognition();
recognition.onresult = function(event) {
  for (let i = event.resultIndex; i < event.results.length; ++i) {
    console.log(event.results[i][0].transcript); 
  }
}

要开始捕捉语音,请运行recognition.start();
要停止捕获语音,请运行recognition.stop();

鉴于这是实验性技术,它并不完美,并不是所有浏览器和版本都支持它。查看browser compatibility table以获取支持的浏览器和版本。