chrome.tts

refresh date: 2026-09-25 robots: noindex

说明

使用 chrome.tts API 播放合成的文字转语音 (TTS) 内容。另请参阅相关的 ttsEngine API,该 API 允许扩展程序实现语音引擎。

权限

tts

概览

Chrome 使用操作系统提供的语音合成功能,在 Windows(使用 SAPI 5)、Mac OS X 和 ChromeOS 上提供原生语音支持。在所有平台上,用户都可以安装将自身注册为备用语音引擎的扩展程序。

正在生成语音

通过分机号拨打 speak() 即可开始对话。例如:

chrome.tts.speak('Hello, world.');

如需立即停止说话,只需调用 stop() 即可:

chrome.tts.stop();

您可以提供用于控制语音各种属性(例如语速、音高等)的选项。例如:

chrome.tts.speak('Hello, world.', {'rate': 2.0});

最好还指定语言,以便选择支持该语言(和区域方言,如果适用)的合成器。

chrome.tts.speak('Hello, world.', {'lang': 'en-US', 'rate': 2.0});

默认情况下,每次调用 speak() 都会中断任何正在进行的语音并立即说话。如需确定通话是否会中断任何内容,您可以调用 isSpeaking()。此外,您可以使用 enqueue 选项将此话语添加到话语队列中,以便在当前话语结束后朗读。

chrome.tts.speak('Speak this first.');
chrome.tts.speak(
    'Speak this next, when the first sentence is done.', {'enqueue': true});

如需查看所有选项的完整说明,请参阅下方的 tts.speak。并非所有语音引擎都支持所有选项。

为了捕获错误并确保您正确调用 speak(),请传递一个不带参数的回调函数。在回调中,检查 runtime.lastError 以查看是否存在任何错误。

chrome.tts.speak(
  utterance,
  options,
  function() {
    if (chrome.runtime.lastError) {
      console.log('Error: ' + chrome.runtime.lastError.message);
    }
  }
);

在引擎开始生成语音之前,回调会立即返回。该回调旨在提醒您在使用 TTS API 时出现的语法错误,而不是捕获在合成和输出语音过程中可能发生的所有错误。如需同时捕获这些错误,您需要使用事件监听器,如下所述。

监听事件

如需获取有关合成语音状态的更多实时信息,请在 speak() 的选项中传递事件监听器,如下所示:

chrome.tts.speak(
  utterance,
  {
    onEvent: function(event) {
      console.log('Event ' + event.type + ' at position ' + event.charIndex);
      if (event.type == 'error') {
        console.log('Error: ' + 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')是最终事件。收到其中一个事件后,此话语将不再朗读,并且不会再收到来自此话语的新事件。

某些语音可能不支持所有事件类型,而某些语音可能根本不发送任何事件。如果您不想使用语音,除非它发送特定事件,否则请在 options 对象的 requiredEventTypes 成员中传递您需要的事件,或使用 getVoices() 选择符合您要求的语音。下文介绍了这两种方式。

SSML 标记

此 API 中使用的语音可能包含使用语音合成标记语言 (SSML) 的标记。如果您使用 SSML,则 speak() 的第一个参数应是包含 XML 标头和顶级 <speak> 标记的完整 SSML 文档,而不是文档片段。

例如:

chrome.tts.speak(
  '<?xml version="1.0"?>' +
  '<speak>' +
  '  The <emphasis>second</emphasis> ' +
  '  word of this sentence was emphasized.' +
  '</speak>'
);

并非所有语音引擎都支持所有 SSML 标记,有些引擎可能根本不支持 SSML,但所有引擎都必须忽略它们不支持的任何 SSML,并仍朗读底层文本。

选择语音

默认情况下,Chrome 会根据语言为每句要朗读的话选择最合适的语音。在大多数 Windows、Mac OS X 和 ChromeOS 系统上,操作系统提供的语音合成功能应该能够以至少一种语言朗读任何文本。不过,部分用户可能会有多种语音可供选择,这些语音来自其操作系统以及由其他 Chrome 扩展程序实现的语音引擎。在这些情况下,您可以实现自定义代码来选择适当的语音,或向用户显示选项列表。

如需获取所有语音的列表,请调用 getVoices(),并向其传递一个接收 TtsVoice 对象数组作为参数的函数:

chrome.tts.getVoices(
  function(voices) {
    for (var i = 0; i < voices.length; i++) {
      console.log('Voice ' + i + ':');
      console.log('  name: ' + voices[i].voiceName);
      console.log('  lang: ' + voices[i].lang);
      console.log('  extension id: ' + voices[i].extensionId);
      console.log('  event types: ' + voices[i].eventTypes);
    }
  }
);

类型

EventType

Chrome 54 及更高版本

枚举

"start"

"end"

"word"

"sentence"

"marker"

"interrupted"

"cancelled"

"error"

"pause"

"resume"

TtsEvent

TTS 引擎发出的事件,用于传达话语的状态。

属性

  • charIndex

    number 可选

    当前字符在语音中的索引。对于字词事件,事件会在一个字词结束之后、下一个字词开始之前触发。charIndex 表示文本中下一个要朗读的字词的开头。

  • errorMessage

    字符串 可选

    错误说明(如果事件类型为 error)。

  • 长度

    number 可选

    Chrome 74 及更高版本

    话语下一部分的长度。例如,在 word 事件中,这是接下来要朗读的字词的长度。如果未由语音引擎设置,则会设置为 -1。

  • 类型

    类型可以是:start(语音开始后)、word(到达字词边界时)、sentence(到达句子边界时)、marker(到达 SSML 标记元素时)、end(到达语音结尾时)、interrupted(语音在到达结尾之前停止或中断时)、cancelled(在合成之前从队列中移除时)或 error(发生任何其他错误时)。暂停语音时,如果特定话语在中间暂停,则会触发 pause 事件;如果话语恢复语音,则会触发 resume 事件。请注意,如果语音在话语之间暂停,则可能不会触发暂停和恢复事件。

TtsOptions

Chrome 77 及更高版本

TTS 引擎的语音选项。

属性

  • desiredEventTypes

    string[] 可选

    您有兴趣监听的 TTS 事件类型。如果缺少此参数,系统可能会发送所有事件类型。

  • enqueue

    布尔值 (可选)

    如果为 true,则在 TTS 已在进行时将此话语加入队列。如果为 false(默认值),则在说出此新话语之前,会中断当前的所有语音并清空语音队列。

  • extensionId

    字符串 可选

    要使用的语音引擎的扩展程序 ID(如果已知)。

  • gender

    VoiceGender 可选

    自 Chrome 77 起已弃用

    性别已弃用,将被忽略。

    合成语音的性别。

  • lang

    字符串 可选

    用于合成的语言,格式为语言-区域。示例:'en'、'en-US'、'en-GB'、'zh-CN'。

  • 投球

    number 可选

    说话音调介于 0 到 2 之间(含 0 和 2),其中 0 为最低,2 为最高。1.0 对应于语音的默认音高。

  • 费率

    number 可选

    相对于此语音默认语速的语速。默认语速为 1.0,通常约为每分钟 180 到 220 个字词。2.0 表示快一倍的速度,0.5 则表示原有速度的一半。严格禁止使用低于 0.1 或高于 10.0 的值,但许多语音会进一步限制最小和最大语速,例如,即使您指定的值大于 3.0,特定语音的实际语速也可能不会超过正常语速的 3 倍。

  • requiredEventTypes

    string[] 可选

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

  • voiceName

    字符串 可选

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

  • 音量

    number 可选

    说话音量介于 0 到 1 之间(含 0 和 1),其中 0 表示最低,1 表示最高,默认值为 1.0。

  • onEvent

    void (可选)

    此函数会在朗读语音的过程中发生事件时调用。

    onEvent 函数如下所示:

    (event: TtsEvent) => {...}

    • 事件

      来自文字转语音引擎的更新事件,用于指示此话语的状态。

TtsVoice

对可用于语音合成的语音的说明。

属性

  • eventTypes

    EventType[] 可选

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

  • extensionId

    字符串 可选

    提供此语音的扩展程序的 ID。

  • gender

    VoiceGender 可选

    自 Chrome 70 起已弃用

    性别已弃用,将被忽略。

    此语音的性别。

  • lang

    字符串 可选

    此语音支持的语言,格式为语言-区域。示例:'en'、'en-US'、'en-GB'、'zh-CN'。

  • 遥控器

    布尔值 (可选)

    如果为 true,则合成引擎是远程网络资源。这可能会导致延迟时间增加,并可能产生带宽费用。

  • voiceName

    字符串 可选

    语音的名称。

VoiceGender

Chrome 54 及更高版本 自 Chrome 70 起弃用

性别已弃用,会被忽略。

枚举

"male"

"female"

方法

getVoices()

Promise
chrome.tts.getVoices(
  callback?: function,
)
: Promise<TtsVoice[]>

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

参数

  • callback

    函数可选

    callback 参数如下所示:

    (voices: TtsVoice[]) => void

返回

  • Promise<TtsVoice[]>

    Chrome 101 及更高版本

    只有 Manifest V3 及更高版本支持 Promise,其他平台需要使用回调。

isSpeaking()

Promise
chrome.tts.isSpeaking(
  callback?: function,
)
: Promise<boolean>

检查引擎当前是否正在朗读。在 Mac OS X 上,只要系统语音引擎正在朗读,结果就为 true,即使朗读不是由 Chrome 发起的也是如此。

参数

  • callback

    函数可选

    callback 参数如下所示:

    (speaking: boolean) => void

    • 正在发言

      布尔值

      如果正在说话,则为 true;否则为 false。

返回

  • Promise<boolean>

    Chrome 101 及更高版本

    只有 Manifest V3 及更高版本支持 Promise,其他平台需要使用回调。

pause()

chrome.tts.pause(): void

暂停语音合成,可能会在语音中间暂停。调用 resume 或 stop 会取消暂停语音。

resume()

chrome.tts.resume(): void

如果语音已暂停,则从上次中断的位置继续朗读。

speak()

Promise
chrome.tts.speak(
  utterance: string,
  options?: TtsOptions,
  callback?: function,
)
: Promise<void>

使用文字转语音引擎朗读文字。

参数

  • 话语

    字符串

    要朗读的文本,可以是纯文本,也可以是格式正确的完整 SSML 文档。不支持 SSML 的语音引擎会去除这些标记,直接朗读文本。文本长度上限为 32,768 个字符。

  • 选项

    TtsOptions 可选

    语音选项。

  • callback

    函数可选

    callback 参数如下所示:

    () => void

返回

  • 承诺<void>

    Chrome 101 及更高版本

    在语音结束前立即解析。如果发生错误,promise 将被拒绝。使用 options.onEvent 获取更详细的反馈。

    只有 Manifest V3 及更高版本支持 Promise,其他平台需要使用回调。

stop()

chrome.tts.stop(): void

停止当前的所有语音,并清空队列中所有待处理的语音。此外,如果语音之前处于暂停状态,现在会在下次调用 speak 时取消暂停。

事件

onVoicesChanged

Chrome 124 及更高版本
chrome.tts.onVoicesChanged.addListener(
  callback: function,
)

当 getVoices 返回的 tts.TtsVoice 列表发生更改时调用。

参数

  • callback

    函数

    callback 参数如下所示:

    () => void