该页面翻译自 Google Chrome Extensions 与 Google Chrome Apps。除非特别说明,该页面的内容遵循 Creative Commons Attribution 3.0 License,代码示例遵循 BSD License。
描述: |
使用 chrome.tts API 播放合成的文字语音转换(TTS),同时请您参见相关的 ttsEngine API,允许扩展程序实现语音引擎。
|
可用版本: |
从 Chrome 14 开始稳定支持。
|
权限: |
"tts"
|
了解更多: |
Chrome 浏览器办公时间:文字语音转换 API
|
Chrome 浏览器在 Windows(使用 SAPI 5)、Mac OS X 和 Chrome OS 上使用操作系统提供的语音合成功能提供原生支持。在所有平台上,用户都可以安装注册为替代语音引擎的扩展程序。
从您的扩展程序或 Chrome 应用中调用
speak()
开始朗读。例如:
chrome.tts.speak('您好!');
要立刻停止朗读,只要调用stop()
:
chrome.tts.stop();
您可以提供选项,控制语音的多种属性,例如速率、音调等等。例如:
chrome.tts.speak('您好!', {'rate': 2.0});
最好指定语言,这样会选择支持那种语言(以及方言,如果可用的话)的合成器。
chrome.tts.speak( '您好!', {'lang': 'zh-CN', 'rate': 2.0});
默认情况下每一次调用 speak()
都会中断当前正在进行的朗读,并立刻开始新的朗读。要确定某次调用是否会中断当前的朗读,您可以调用
isSpeaking()
。此外,您可以使用
enqueue
选项,将这一次朗读添加到队列中,等到当前朗读完成后再朗读队列中的内容。
chrome.tts.speak( '先说这句话。'); chrome.tts.speak( '等第一句话完成后再说这句话。', {'enqueue': true});
所有选项的完整描述可以在下面的 speak() 方法文档 中找到,不是所有的语音引擎都会支持所有选项。
要捕捉错误并确保您正确调用了
speak()
,请传递一个没有参数的回调函数。在回调函数中,检查
runtime.lastError
确定是否发生错误。
chrome.tts.speak( utterance, options, function() { if (chrome.runtime.lastError) { console.log('错误:' + chrome.runtime.lastError.message); } });
回调函数在引擎开始朗读前就立刻返回。这一回调函数的目的是提醒您在使用 TTS API 过程中的语法错误,而不是用来捕捉在合成和输出语音的过程中可能发生的错误。要捕捉这些错误,您应该使用事件处理,这将在下面描述。
要获得有关语音合成状态的实时信息,请在
speak()
的选项中传递一个事件监听器,如下列代码所示:
chrome.tts.speak( utterance, { onEvent: function(event) { console.log('在位置 ' + event.charIndex ' 处产生事件 ' + event.type); if (event.type == 'error') { console.log('错误:' + event.errorMessage); } } }, callback);
每一个事件包含事件类型、当前正在朗读的字符位置。对于错误事件,还有可选的错误消息。事件类型有:
'start'
:引擎开始朗读。
'word'
:遇到单词边界。使用
event.charIndex
确定当前朗读位置。
'sentence'
:遇到句子边界。使用
event.charIndex
确定当前朗读位置。
'marker'
:遇到 SSML 标记。使用
event.charIndex
确定当前朗读位置。
'end'
:引擎已完成朗读。
'interrupted'
:本次朗读由于另一个
speak()
调用或
stop()
调用而中断,并且没有完成。
'cancelled'
:朗读已放入队列,但后来由于另一个
speak()
调用或
stop()
调用中断,而从未开始朗读。
'error'
:发生了引擎特定的错误,无法开始朗读。有关详情请检查
event.errorMessage
。
这些事件类型中有四个——'end'
、'interrupted'
、'cancelled'
和 'error'
表示最终结果。发生这些事件中的某一个后,不会再朗读,也不会再收到其他事件。
某些语音可能不支持所有事件类型,某些语音甚至可能不发送任何事件。如果您需要语音发送某些事件,将您需要的事件放在选项对象的
requiredEventTypes
属性中,或者使用
getVoices()
选择符合您要求的语音。以下有它们的详细文档。
这一 API 中使用的朗读内容可以包含使用语音合成标记语言(SSML)(英文)的标记。如果您使用
SSML,speak()
的第一个参数应该是一个具有 XML 头和顶级
<speak>
标签的完整 SSML 文档,而不是文档片段。
例如:
chrome.tts.speak( '<?xml version="1.0"?>' + '<speak>' + ' 这一句话中第<emphasis>七</emphasis> ' + ' 个字要强调。' + '</speak>');
不是所有的语音引擎都支持所有 SSML 标记,甚至有一些可能完全不支持 SSML,但是所有引擎都会忽略它们不支持的 SSML 并继续朗读其中的文字。
默认情况下,Chrome 浏览器基于语言和性别选择您要朗读的内容所对应的最合适的语音。在大部分 Windows、Mac OS X 和 Chrome OS 系统上,操作系统提供的语音合成功能至少能用一种语言朗读任何文本,而某些用户可能会有多种可用的语音,来自操作系统或其他 Chrome 扩展程序实现的语音引擎。在这样的情况下,您可以实现自定义代码,选择合适的语音,或向用户展现可选的语音。
要获得所有语音的列表,请调用
getVoices()
并传递一个接受
TtsVoice
对象数组为参数的函数:
chrome.tts.getVoices( function(voices) { for (var i = 0; i < voices.length; i++) { console.log('第 ' + i + ' 种语音:'); console.log(' 名称:' + voices[i].voiceName); console.log(' 语言:' + voices[i].lang); console.log(' 性别:' + voices[i].gender); console.log(' 扩展程序标识符:' + voices[i].extensionId); console.log(' 事件类型:' + voices[i].eventTypes); } });
"start"
, "end"
, "word"
, "sentence"
, "marker"
, "interrupted"
, "cancelled"
, "error"
, "pause"
, or "resume"
)
使用文字语音转换朗读文本。
如果您指定了 callback 参数,它应该指定一个如下形式的函数:
function() {...};
停止当前的朗读,并清空未完成朗读的队列。此外,如果朗读暂停了,则会取消暂停,以便下一次调用时朗读。
暂停语音合成,可能正处于一次朗读的中间。调用 resume 或 stop 会取消暂停朗读。
如果朗读暂停了,从暂停的位置恢复朗读。