chrome.ttsEngine

描述 使用 chrome.ttsEngine API 在应用中实现文字语音转换(TTS)引擎。如果您的应用注册了该 API,当任何应用或百度浏览器应用使用 tts 模块朗读时,它会收到事件,包含要朗读的内容以及其他参数。您的应用可以使用任何可用的网络技术合成并输出语音,并向调用方发送事件报告状态。
可用版本 从 Chrome 14 开始支持。
权限 "ttsEngine"

概述

应用可以将自己注册为语音引擎,这样,它就能处理部分或所有诸如 tts.speaktts.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' 事件类型指示朗读何时完成,否则百度浏览器无法调度队列中的朗读。

注意: 如果您的 TTS 引擎不支持 'end' 事件类型,百度浏览器就无法将朗读放入队列,因为它无法知道您的朗读何时结束。为了缓解这一问题,百度浏览器将向您的引擎的 onSpeak 事件处理函数传递布尔类型的 enqueue 选项,让您选择实现自己的队列。但是不建议您这么做,因为客户端将无法将其他语音引擎朗读的内容放入队列。

您可以发送的可能的事件类型对应于 speak() 可以接受的事件类型:

  • 'start' :引擎开始朗读。
  • 'word' :遇到单词边界。使用 event.charIndex 确定当前朗读位置。
  • 'sentence' :遇到句子边界。使用 event.charIndex 确定当前朗读位置。
  • 'marker' :遇到 SSML 标记。使用 event.charIndex 确定当前朗读位置。
  • 'end' :引擎已完成朗读。
  • 'error' :发生了引擎特定的错误,不能开始朗读。有关细节请检查 event.errorMessage

'interrupted''cancelled' 事件并不是由语音引擎发送,而是由百度浏览器自动生成。

如果您已经处理了如下描述的语音事件的话,文本语音转换客户端可以通过调用 tts.getVoices 从您的应用的清单文件获取语音信息。

处理语音事件

要在收到客户端的请求后开始朗读,您的应用必须同时处理 onSpeakonStop 事件,如下所示:

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);

重要提示: 如果您的应用不同时处理 onSpeakonStop 事件,它不会收到任何语音调用,无论清单文件中如何描述。

是否向应用发送语音请求完全取决于应用是否支持清单文件中指定的语音参数以及是否已经处理 onSpeakonStop 事件。换句话说,没有办法使应用先接收语音事件再动态地决定是否处理。

摘要

事件
onSpeak
onStop
onPause
onResume

事件

onSpeak

当用户发出 tts.speak 调用并且应用的清单文件中的任何一种语音首先匹配 options 对象时产生。

addListener

chrome.ttsEngine.onSpeak.addListener(function callback)
参数
function callback

callback 参数应该是一个如下形式的函数:

function(string utterance, object options, function sendTtsEvent) {...};
string utterance

要朗读的文本,既可以是纯文本,也可以是完整的、形式正确的 SSML 文档。如果您的引擎不支持 SSML,您应该忽略所有 XML 标签只朗读文本。这一参数的长度确保不超过 32 768 个字符。如果您的引擎不支持一次性朗读那么多内容,您应该将朗读分成一小段一小段,并放入内部队列,而不是返回错误。

object options

tts.speak 方法指定的选项。

string (可选)
voiceName

用来合成的语音名称。

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 之间(包括 0.1 和 10.0),如果语音不支持这一范围内的所有速率,不要返回错误,而是限制在语音支持范围内的速率。

double (可选)
pitch

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

double (可选)
volume

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

function sendTtsEvent

调用这一函数,发送语音合成过程中发生的事件。

sendTtsEvent 参数应该是一个如下形式的函数:

function( tts.TtsEvent event) {...};
tts.TtsEvent event

来自文字语音转换引擎的事件,表示朗读状态。

onStop

当发出 tts.stop 调用时发生,应用可能正在朗读。如果应用收到这一事件但是朗读已经结束,它应该什么都不做(而不是产生错误)。如果语音正处于暂停状态,它应该取消暂停状态。

addListener

chrome.ttsEngine.onStop.addListener(function callback)
参数
function callback

callback 参数应该是一个如下形式的函数:

function() {...};

onPause

从 Chrome 29 开始支持。

可选:如果引擎支持暂停事件,它应该暂停正在朗读的内容(如果有的话),直到它接收到恢复或停止事件。注意停止事件还应该清除暂停状态。

addListener

chrome.ttsEngine.onPause.addListener(function callback)
参数
function callback

callback 参数应该是一个如下形式的函数:

function() {...};

onResume

从 Chrome 29 开始支持。

可选:如果引擎支持暂停事件,它也应该支持恢复事件,继续当前朗读的内容(如果有的话)。注意停止事件还应该清除暂停状态。

addListener

chrome.ttsEngine.onResume.addListener(function callback)
参数
function callback

callback 参数应该是一个如下形式的函数:

function() {...};