chrome.tts

描述 使用 chrome.tts API 播放合成的文字语音转换(TTS),同时请您参见相关的 ttsEngine API,允许应用实现语音引擎。
可用版本 从 Chrome 14 开始支持。
权限 "tts"

概述

百度浏览器在 Windows(使用 SAPI 5)、Mac OS X 和 Chrome OS 上使用操作系统提供的语音合成功能提供原生支持。在所有平台上,用户都可以安装注册为替代语音引擎的应用。

朗读

从您的应用或百度浏览器应用中调用 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() 选择符合您要求的语音。以下有它们的详细文档。

SSML 标记

这一 API 中使用的朗读内容可以包含使用语音合成标记语言(SSML)(英文)的标记。如果您使用 SSML,speak() 的第一个参数应该是一个具有 XML 头和顶级 <speak> 标签的完整 SSML 文档,而不是文档片段。

例如:

chrome.tts.speak(
          '<?xml version="1.0"?>' +
          '<speak>' +
          '  这一句话中第<emphasis>七</emphasis> ' +
          '  个字要强调。' +
          '</speak>');

不是所有的语音引擎都支持所有 SSML 标记,甚至有一些可能完全不支持 SSML,但是所有引擎都会忽略它们不支持的 SSML 并继续朗读其中的文字。

选择语音

默认情况下,百度浏览器基于语言和性别选择您要朗读的内容所对应的最合适的语音。在大部分 Windows、Mac OS X 和 Chrome OS 系统上,操作系统提供的语音合成功能至少能用一种语言朗读任何文本,而某些用户可能会有多种可用的语音,来自操作系统或其他百度浏览器应用程序实现的语音引擎。在这样的情况下,您可以实现自定义代码,选择合适的语音,或向用户展现可选的语音。

要获得所有语音的列表,请调用 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);
      }
      });

摘要

类型
TtsEvent
TtsVoice
方法
speak chrome.tts.speak(string utterance, object options, function callback)
stop chrome.tts.stop()
pause chrome.tts.pause()
resume chrome.tts.resume()
isSpeaking chrome.tts.isSpeaking(function callback)
getVoices chrome.tts.getVoices(function callback)

类型

TtsEvent

来自 TTS 引擎的事件,通知朗读状态。
属性
enum of "start", "end", "word", "sentence", "marker", "interrupted", "cancelled", "error", "pause", or "resume" type

类型可以为:
'start':朗读刚开始;
'word':遇到词语边界;
'sentence':遇到句子边界;
'marker':遇到 SSML 标记元素;
'end':朗读完成;
'interrupted':朗读停止或在到达结尾前中断;
'cancelled':朗读在合成前就从队列中移除;
'error':发生错误。
暂停语音时,如果某一次朗读从中间暂停了则产生 'pause' 事件,朗读恢复时产生 'resume' 事件。注意,如果语音在两次朗读之间暂停,可能不会产生暂停和恢复事件。

double (可选)
charIndex

当前朗读的字符索引。

string (可选)
errorMessage

如果事件类型为 'error',则包含错误描述。

TtsVoice

描述可用于语音合成的语音。
属性
string (可选)
voiceName

语音的名称。

string (可选)
lang

语音支持的语言,以语言-区域的形式表示。例如:'zh-CN'、'en'、'en-US'、'en-GB'。

enum of "male", or "female" (可选)
gender

语音的性别,"male" 表示男性,"female" 表示女性。

boolean (可选)
remote

从 Chrome 33 开始支持。

如果为 true,综合引擎是远程网络资源,可能有较高的延迟并且会增加带宽的开销。

string (可选)
extensionId

提供语音的应用的标识符。

array of string (可选)
eventTypes

这一语音能够发送的所有回调事件类型。

方法

speak

chrome.tts.speak(string utterance, object options, function callback)

使用文字语音转换朗读文本。

参数
string utterance

要朗读的文本,既可以是纯文本,也可以是完整的、形式正确的 SSML 文档。不支持 SSML 的语音引擎会忽略标签只朗读文本。这一文本的最大长度为 32 768 个字符。

object (可选)
options

朗读选项。

boolean (可选)
enqueue

如果为 true,若当前 TTS 正在朗读则将这一次朗读放入队列。如果为 false(默认值),则中断当前的朗读,清理语音队列,然后朗读新的文本。

string (可选)
voiceName

用来合成的语音名称。如果为空,使用任何可用的语音。

string (可选)
extensionId

要使用的语音引擎应用的标识符,如果已知的话。

string (可选)
lang

用于合成的语言,以语言-区域的形式。例如:'zh-CN'、'en'、'en-US'、'en-GB'。

enum of "male", or "female" (可选)
gender

语音合成所使用的性别,"male" 表示男性,"female" 表示女性。

double (可选)
rate

朗读速率,相对于这一语音的默认速率。1.0 表示默认速率,通常为每分钟 180 至 220 个单词。2.0 表示快一倍,而 0.5 是默认速率的一半。不允许 0.1 以下的值或者 10.0 以上的值,并且许多语音会进一步限制最低和最高速率,例如某种语音也许不可能朗读地比默认速率快三倍,即使您指定了大于 3.0 的值。

double (可选)
pitch

指定 0 到 2 之间(包括 0 和 2)的声调,0 表示最低,2 表示最高,1.0 对应于语音的默认声调。

double (可选)
volume

0 到 1 之间(包括 0 和 1)的朗读音量,0 为最低,1 为最高,默认为 1.0。

array of string (可选)
requiredEventTypes

语音必须支持的 TTS 事件类型。

array of string (可选)
desiredEventTypes

您需要处理的 TTS 事件类型。如果省略,会发送所有事件。

function (可选)
onEvent

该函数将在朗读过程中发生事件时调用。

参数
TtsEvent event

来自 TTS 引擎的更新事件,指示当前朗读的状态。

function (可选)
callback

在朗读完成前立即调用。检查 runtime.lastError 确保没有错误发生。使用 options.onEvent 获得更详细的反馈。

如果您指定了 callback 参数,它应该是一个如下形式的函数:

function() {...};

stop

chrome.tts.stop()

停止当前的朗读,并清空未完成朗读的队列。此外,如果朗读暂停了,则会取消暂停,以便下一次调用时朗读。

pause

chrome.tts.pause()

从 Chrome 29 开始支持。

暂停语音合成,可能正处于一次朗读的中间。调用 resume 或 stop 会取消暂停朗读。

resume

chrome.tts.resume()

从 Chrome 29 开始支持。

如果朗读暂停了,从暂停的位置恢复朗读。

isSpeaking

chrome.tts.isSpeaking(function callback)

检查引擎当前是否正在朗读。在 Mac OS X 中,只要系统的语音引擎正在朗读,即使此次朗读并不是由百度浏览器发起的,结果也是 true。

参数
function (可选)
callback

如果您指定了 callback 参数,它应该是一个如下形式的函数:

function(boolean speaking) {...};
boolean speaking

如果正在朗读则为 true ,否则为 false。

getVoices

chrome.tts.getVoices(function callback)

获得包含所有可用语音的数组。

参数
function (可选)
callback

如果您指定了 callback 参数,它应该是一个如下形式的函数:

function(array of TtsVoice voices) {...};
array of TtsVoice voices

包含 TtsVoice 对象的数组,代表语音合成可用的语音。