chrome.ttsEngine

说明

使用 chrome.ttsEngine API 通过扩展程序实现文字转语音(TTS) 引擎。如果您的扩展程序使用此 API 注册,则当任何扩展程序或 Chrome 应用使用 tts API 生成语音时,该扩展程序将收到包含语音内容及其他参数的事件。然后,您的扩展程序可以使用任何可用的网络技术来合成并输出语音,并将事件发送回调用函数以报告状态。

权限

ttsEngine

概念和用法

扩展程序可以自行注册为语音引擎。这样做可以拦截对函数(例如 tts.speak()tts.stop())的部分或所有调用,并提供替代实现。扩展程序可以随意使用任何可用的网络技术来提供语音,包括从服务器流式传输音频、HTML5 音频。扩展程序甚至可以对语音内容执行不同的操作,例如在弹出式窗口中显示字幕或将其作为日志消息发送到远程服务器。

如需实现 TTS 引擎,扩展程序必须声明“ttsEngine”权限,然后在扩展程序清单中声明它提供的所有语音,如下所示:

{
  "name": "My TTS Engine",
  "version": "1.0",
  "permissions": ["ttsEngine"],
  "tts_engine": {
    "voices": [
      {
        "voice_name": "Alice",
        "lang": "en-US",
        "event_types": ["start", "marker", "end"]
      },
      {
        "voice_name": "Pat",
        "lang": "en-US",
        "event_types": ["end"]
      }
    ]
  },
  "background": {
    "page": "background.html",
    "persistent": false
  }
}

扩展程序可以指定任意数量的语音。

voice_name 为必需参数,名称应具有足够的描述性,以便标识语音名称和所用引擎。在极少数情况下,当两个扩展程序注册同名的语音时,客户端可以指定应执行合成的扩展程序的 ID。

lang 参数是可选的,但我们强烈建议您使用。语音几乎总是能用一种语言合成语音。如果引擎支持多种语言,它可以轻松为每种语言注册单独的语音。在极少数情况下,一种语音可以处理多种语言,此时,最简单的方法是仅列出两种单独的语音,然后在内部使用相同的逻辑进行处理。但是,如果您要创建可以处理任何语言语音内容的声音,请从扩展程序的清单中省去 lang 参数。

最后,如果引擎可以发送事件以便为客户端更新语音合成的进度,则必须使用 event_types 参数。至少强烈建议支持 'end' 事件类型来指明语音结束的时间,否则 Chrome 将无法调度已加入队列的语音内容。

加载后,扩展程序可以通过调用 chrome.ttsEngine.updateVoices 来替换声明的语音列表。(请注意,以编程方式调用 updateVoices 时使用的参数采用驼峰式大小写形式:例如,voiceName,这与使用 voice_name 的清单文件不同。)

您可以发送的事件类型对应于 speak() 方法收到的事件类型:

  • 'start':引擎已开始朗读语音内容。
  • 'word':已达到字词边界。使用 event.charIndex 确定当前的语音位置。
  • 'sentence':已达到句子边界。使用 event.charIndex 确定当前的语音位置。
  • 'marker':已达到 SSML 标记。使用 event.charIndex 确定当前的语音位置。
  • 'end':引擎已读出语音。
  • 'error':发生了特定引擎错误,无法朗读这段话语。在 event.errorMessage 中传递更多信息。

'interrupted''cancelled' 事件不是由语音引擎发送的,它们是由 Chrome 自动生成的。

文字转语音客户端可以通过调用 tts.getVoices 从扩展程序的清单中获取语音信息(假设您已按如下所述注册了语音事件监听器)。

处理语音事件

如需根据客户端的请求生成语音,您的扩展程序必须为 onSpeakonStop 注册监听器,如下所示:

const speakListener = (utterance, options, sendTtsEvent) => {
  sendTtsEvent({type: 'start', charIndex: 0})

  // (start speaking)

  sendTtsEvent({type: 'end', charIndex: utterance.length})
};

const stopListener = () => {
  // (stop all speech)
};

chrome.ttsEngine.onSpeak.addListener(speakListener);
chrome.ttsEngine.onStop.addListener(stopListener);

是否向扩展程序发送给定语音请求这一决定仅取决于扩展程序是否支持其清单中的指定语音参数,以及是否已为 onSpeakonStop 注册了监听器。换言之,扩展程序无法接收语音请求并动态决定是否处理语音请求。

类型

AudioBuffer

Chrome 92 及更高版本

包含音频缓冲区和关联数据的参数。

属性

  • audioBuffer

    ArrayBuffer

    来自文字转语音引擎的音频缓冲区。它的长度应该与 audioStreamOptions.bufferSize 完全相同,编码为单声道,编码为 audioStreamOptions.sampleRate,编码为线性 32 位有符号浮点数,即 JavaScript 中的 Float32Array 类型。

  • charIndex

    数字可选

    与此音频缓冲区相关联的字符索引。

  • isLastBuffer

    布尔值 选填

    如果此音频缓冲区是当前说出的文本的最后一个音频缓冲区,则为 true。

AudioStreamOptions

Chrome 92 及更高版本

包含预期由引擎生成的音频流格式。

属性

  • bufferSize

    number

    音频缓冲区中的样本数。

  • sampleRate

    number

    音频缓冲区中预期的采样率。

SpeakOptions

Chrome 92 及更高版本

为 tts.speak() 方法指定的选项。

属性

  • gender

    VoiceGender 可选

    从 Chrome 92 开始已废弃

    性别已弃用,系统将忽略它。

    合成语音的语音性别。

  • lang

    字符串(可选)

    用于合成的语言,格式为 language-region。示例:“en”“en-US”“en-GB”“zh-CN”。

  • 投球

    数字可选

    说话的音高介于 0 和 2 之间(包括 0 和 2),0 表示最低,2 表示最高。1.0 对应于此语音的默认音高。

  • 费率

    数字可选

    相对于此语音默认语速的语速。默认速率为 1.0,通常每分钟约 180 到 220 个单词。2.0 表示快一倍的速度,0.5 则表示原有速度的一半。此值保证介于 0.1 和 10.0 之间(包括 0.1 和 10.0)。当语音不支持此全部费率时,不会返回错误。请改为将速率调整为语音支持的范围。

  • voiceName

    字符串(可选)

    用于合成的语音的名称。

  • 数字可选

    朗读的音量介于 0 和 1 之间(包括 0 和 1),0 表示最低,1 表示最高,默认值为 1.0。

VoiceGender

Chrome 54 及更高版本 从 Chrome 70 开始已弃用

性别已弃用,系统将忽略它。

枚举

"male"

方法

updateVoices()

Chrome 66 及更高版本
chrome.ttsEngine.updateVoices(
  voices: TtsVoice[],
)

由引擎调用以更新其语音列表。此列表会覆盖此扩展程序的清单中声明的所有语音。

参数

活动

onPause

chrome.ttsEngine.onPause.addListener(
  callback: function,
)

可选:如果引擎支持暂停事件,则应暂停正在播放的当前语音内容(如果有),直到收到恢复事件或停止事件。请注意,停止事件也应清除暂停状态。

参数

  • callback

    功能

    callback 参数如下所示:

    ()=>void

onResume

chrome.ttsEngine.onResume.addListener(
  callback: function,
)

可选:如果引擎支持暂停事件,则还应支持继续播放事件,以便继续朗读当前所说的内容(如果有)。请注意,停止事件也应清除暂停状态。

参数

  • callback

    功能

    callback 参数如下所示:

    ()=>void

onSpeak

chrome.ttsEngine.onSpeak.addListener(
  callback: function,
)

当用户调用 tts.speak() 且此扩展程序清单中的一种语音是第一个与 options 对象匹配的语音时调用。

参数

  • callback

    功能

    callback 参数如下所示:

    (utterance: string,options: SpeakOptions,sendTtsEvent: function)=>void

    • 话语

      string

    • 选项
    • sendTtsEvent

      功能

      sendTtsEvent 参数如下所示:

      (event: tts.TtsEvent)=>void

      • event

        来自文字转语音引擎的事件,指示这段话语的状态。

onSpeakWithAudioStream

Chrome 92 及更高版本
chrome.ttsEngine.onSpeakWithAudioStream.addListener(
  callback: function,
)

当用户调用 tts.speak() 且此扩展程序清单中的一种语音是第一个与 options 对象匹配的语音时调用。与 ttsEngine.onSpeak 不同的是,Chrome 提供音频播放服务并处理 tts 事件的分派。

参数

  • callback

    功能

    callback 参数如下所示:

    (utterance: string,options: SpeakOptions,audioStreamOptions: AudioStreamOptions,sendTtsAudio: function,sendError: function)=>void

    • 话语

      string

    • 选项
    • audioStreamOptions
    • sendTtsAudio

      功能

      sendTtsAudio 参数如下所示:

      (audioBufferParams: AudioBuffer)=>void

      • audioBufferParams

        包含音频缓冲区和关联数据的参数。

    • sendError

      功能

      Chrome 94 及更高版本

      sendError 参数如下所示:

      (errorMessage?: string)=>void

      • errorMessage

        字符串(可选)

        描述错误的字符串。

onStop

chrome.ttsEngine.onStop.addListener(
  callback: function,
)

在对 tts.stop 进行调用且此扩展程序可能正在说话时触发。如果扩展程序收到对 onStop 的调用,并且语音已经停止,则不应执行任何操作(不会引发错误)。如果语音处于暂停状态,此操作应该可以取消暂停状态。

参数

  • callback

    功能

    callback 参数如下所示:

    ()=>void