该页面翻译自 Google Chrome Extensions 与 Google Chrome Apps。除非特别说明,该页面的内容遵循 Creative Commons Attribution 3.0 License,代码示例遵循 BSD License。
描述: |
使用 chrome.ttsEngine API 用扩展程序实现文字语音转换(TTS)引擎。如果您的扩展程序注册了这一 API,当任何扩展程序或 Chrome 应用使用 tts 模块朗读时,它会收到事件,包含要朗读的内容以及其他参数。您的扩展程序可以使用任何可用的网络技术合成并输出语音,并向调用方发送事件报告状态。
|
可用版本: |
从 Chrome 14 开始稳定支持。
|
权限: |
"ttsEngine"
|
扩展程序可以将自己注册为语音引擎,这样,它就能处理部分或所有诸如 tts.speak 和 tts.stop 的函数调用,提供替代的实现。扩展程序可以自由地使用任何可用的网络技术提供语音,包括来自服务器的音频流、HTML5 音频、Native Client 或 Flash。扩展程序甚至可以做一些除朗读之外的事,例如在弹出式窗口中显示内容或者向远程服务器发送日志消息。
要实现 TTS 引擎,扩展程序必须在清单文件中声明 "ttsEngine" 权限,并声明它提供的所有语音,如下所示:
{ "name": "我的 TTS 引擎", "version": "1.0", "permissions": ["ttsEngine"], "tts_engine": { "voices": [ { "voice_name": "Alice", "lang": "en-US", "gender": "female", "event_types": ["start", "marker", "end"] }, { "voice_name": "Pat", "lang": "en-US", "event_types": ["end"] } ] }, "background": { "page": "background.html", "persistent": false } }
扩展程序可以指定任意数量的语音。
voice_name
参数是必选的,名称应该具有充分的描述性,标识使用的语音和引擎的名称。如果两个扩展程序注册了相同名称的语音(这种情况不太可能发生),客户端可以指定应该进行合成的扩展程序标识符。
gender
参数可选。如果您的语音对应于男性("male")或女性("female")语音,您可以使用该参数帮助客户端为应用程序选择最合适的语音。
lang
参数可选,但是强烈建议包含这一参数。大部分情况下语音只能进行一种语言的语音合成。如果引擎支持不止一种语言,它只要注册两个单独的语音,并在内部用相同的逻辑处理。然而,如果您想创建一个可以处理任何语言的语音,可以在扩展程序的清单文件中省略
lang
参数。
最后,如果引擎可以发送事件通知客户端语音合成的进度,则必须设置
event_types
参数。强烈建议至少应该支持
'end'
事件类型指示朗读何时完成,否则 Chrome
浏览器无法调度队列中的朗读。
注意:如果您的 TTS 引擎不支持 'end'
事件类型,Chrome
浏览器就无法将朗读放入队列,因为它无法知道您的朗读何时结束。为了缓解这一问题,Chrome
浏览器将向您的引擎的 onSpeak 事件处理函数传递布尔类型的
enqueue
选项,让您选择实现自己的队列。但是不建议您这么做,因为客户端将无法将其他语音引擎朗读的内容放入队列。
您可以发送的可能的事件类型对应于 speak()
可以接受的事件类型:
'start'
:引擎开始朗读。
'word'
:遇到单词边界。使用
event.charIndex
确定当前朗读位置。
'sentence'
:遇到句子边界。使用
event.charIndex
确定当前朗读位置。
'marker'
:遇到 SSML 标记。使用
event.charIndex
确定当前朗读位置。
'end'
:引擎已完成朗读。
'error'
:发生了引擎特定的错误,不能开始朗读。有关细节请检查
event.errorMessage
。
'interrupted'
和 'cancelled'
事件并不是由语音引擎发送,而是由 Chrome 浏览器自动生成。
如果您已经处理了如下描述的语音事件的话,文本语音转换客户端可以通过调用 tts.getVoices 从您的扩展程序的清单文件获取语音信息。
要在收到客户端的请求后开始朗读,您的扩展程序必须同时处理
onSpeak
和 onStop
事件,如下所示:
var speakListener = function(utterance, options, sendTtsEvent) { sendTtsEvent({'event_type': 'start', 'charIndex': 0}) // (开始朗读) sendTtsEvent({'event_type': 'end', 'charIndex': utterance.length}) }; var stopListener = function() { // (停止所有朗读) }; chrome.ttsEngine.onSpeak.addListener(speakListener); chrome.ttsEngine.onStop.addListener(stopListener);
重要提示:如果您的扩展程序不同时处理
onSpeak
和 onStop
事件,它不会收到任何语音调用,无论清单文件中如何描述。
是否向扩展程序发送语音请求完全取决于扩展程序是否支持清单文件中指定的语音参数以及是否已经处理
onSpeak
和 onStop
事件。换句话说,没有办法使扩展程序先接收语音事件再动态地决定是否处理。
当用户发出 tts.speak 调用并且扩展程序的清单文件中的任何一种语音首先匹配 options 对象时产生。
callback 参数应该指定一个如下形式的函数:
function(string utterance, object options, function sendTtsEvent) {...};
当发出 tts.stop 调用时发生,扩展程序可能正在朗读。如果扩展程序收到这一事件但是朗读已经结束,它应该什么都不做(而不是产生错误)。如果语音正处于暂停状态,它应该取消暂停状态。