文字转语音 (TTS) 可以使内容更易访问,但到目前为止,还没有简单且通用的方法在 Web 上实现这一点。一种可能的方法如此演示所示,该演示由 speak.js 提供支持,speak.js 是一个新的 100% 纯 JavaScript/HTML5 TTS 实现。speak.js 是对 eSpeak 的移植,eSpeak 是一个开源语音合成器,从 C++ 移植到 JavaScript 使用了 Emscripten。
将现有的语音合成引擎编译到 JavaScript 是一个很好的方法,可以避免从头开始编写像 eSpeak 这样复杂的项目。编译完成后,speak.js 中的 eSpeak 代码并不知道它正在 Web 上运行:speak.js 使用 Emscripten 模拟文件系统 来“伪造”eSpeak C++ 代码具有的正常文件读写调用(fopen、fread 等)。这允许使用正常的 eSpeak 数据文件(通过 xhr,或者通过将它们转换为 JSON 并与脚本文件捆绑在一起)。运行编译后的 eSpeak 代码的结果是,它会将生成的音频写入模拟文件系统中的 .wav 文件。然后 speak.js 会获取该数据,使用 base64 对其进行编码,并创建数据 URL。该 URL 然后在 HTML5 音频元素中加载,让浏览器处理播放。(请注意,虽然这是一种非常简单的方法,但它并不是最有效的方法。speak.js 还没有关注速度,但通过一些额外的努力,它可以更快,如果这是个问题的话。)
为什么您需要在 JavaScript 中使用 TTS?好吧,使用 speak.js,您可以在您的网站中捆绑一个 .js 文件,然后生成语音就像编写一样简单
speak("hello world")
(有关说明,请参阅 speak.js 网站)。生成的语音在所有平台上将完全相同,不像用户以他们自己的方式进行 TTS(使用操作系统功能或单独的程序)那样。speak.js 还可以用于构建浏览器插件,因为它是纯 JavaScript - 不需要平台相关的二进制文件,并且插件在所有操作系统上都能以相同的方式工作。
其他一些评论
- JavaScript 正在变得越来越强大。如今,顶尖 JavaScript 引擎的开发版本可以运行从 C++ 编译的代码,其速度仅比快速 C++ 编译器慢 3-5 倍,而且还在不断改进。因此,在许多情况下,可以扩展 Web 平台的功能,可以通过 JavaScript 实现,或者通过编译到 JavaScript 实现,而不是向浏览器本身添加新代码,因为这不可避免地需要更长的时间 - 特别是如果您等待所有浏览器实现某个特定功能。
- 虽然 speak.js 只使用基于标准的 API,但由于浏览器的限制,它还不能在所有地方工作。它不能在 IE、Safari 或 Opera 中工作,因为它们不支持类型化数组,也不能在 Chrome 中工作,因为它不支持 WAV 数据 URL。因此,目前 speak.js 只能在 Firefox 中正常工作。但是,上述缺少的功能并不大,希望这些浏览器制造商能够尽快实现它们。也可以在 speak.js 中实现针对这些问题的解决方法(请参阅下一条评论)。
- 非常欢迎您帮助改进 speak.js!我们需要做的一件重要的事情是实现解决方法,解决阻止 speak.js 在其当前无法运行的浏览器上运行的问题。另一个目标是使用 speak.js 构建浏览器插件。如果您想帮助我们,请通过 github 与我们联系。
- eSpeak 支持多种语言,因此 speak.js 也支持多种语言。但是,您需要包含其他语言文件。这里 是一个实验性的构建,您可以在其中切换英语和法语支持(请注意,这是一个未优化的构建,因此运行速度会比较慢)。
14 条评论