Description
Use the chrome.ttsEngine
API to implement a text-to-speech(TTS) engine using an extension. If your extension registers using this API, it will receive events containing an utterance to be spoken and other parameters when any extension or Chrome App uses the tts
API to generate speech. Your extension can then use any available web technology to synthesize and output the speech, and send events back to the calling function to report the status.
Permissions
ttsEngine
Concepts and usage
An extension can register itself as a speech engine. By doing so, it can intercept some or all calls
to functions such as tts.speak()
and tts.stop()
and provide an alternate implementation.
Extensions are free to use any available web technology to provide speech, including streaming audio
from a server, HTML5 audio. An extension could even do something different
with the utterances, like display closed captions in a popup or send them as log messages to
a remote server.
To implement a TTS engine, an extension must declare the "ttsEngine" permission and then declare all voices it provides in the extension manifest, like this:
{
"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
}
}
An extension can specify any number of voices.
The voice_name
parameter is required. The name should be descriptive enough that it identifies the
name of the voice and the engine used. In the unlikely event that two extensions register voices
with the same name, a client can specify the ID of the extension that should do the synthesis.
The lang
parameter is optional, but highly recommended. Almost always, a voice can synthesize
speech in just a single language. When an engine supports more than one language, it can easily
register a separate voice for each language. Under rare circumstances where a single voice can
handle more than one language, it's easiest to just list two separate voices and handle them using
the same logic internally. However, if you want to create a voice that will handle utterances in any
language, leave out the lang
parameter from your extension's manifest.
Finally, the event_types
parameter is required if the engine can send events to update the client
on the progress of speech synthesis. At a minimum, supporting the 'end'
event type to indicate
when speech is finished is highly recommended, otherwise Chrome cannot schedule queued utterances.
Once loaded, an extension can replace the list of declared voices by calling
chrome.ttsEngine.updateVoices
. (Note that the parameters used in the programatic call to
updateVoices
are in camel case: e.g., voiceName
, unlike the manifest file which uses
voice_name
.)
The possible event types that you can send correspond to the event types that the speak()
method
receives:
'start'
: The engine has started speaking the utterance.'word'
: A word boundary was reached. Useevent.charIndex
to determine the current speech position.'sentence'
: A sentence boundary was reached. Useevent.charIndex
to determine the current speech position.'marker'
: An SSML marker was reached. Useevent.charIndex
to determine the current speech position.'end'
: The engine has finished speaking the utterance.'error'
: An engine-specific error occurred and this utterance cannot be spoken. Pass more information inevent.errorMessage
.
The 'interrupted'
and 'cancelled'
events are not sent by the speech engine; they are generated
automatically by Chrome.
Text-to-speech clients can get the voice information from your extension's manifest by calling
tts.getVoices
, assuming you've registered speech event listeners as described below.
Handle speech events
To generate speech at the request of clients, your extension must register listeners for both
onSpeak
and onStop
, like this:
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);
The decision of whether or not to send a given speech request to an extension is based solely on
whether the extension supports the given voice parameters in its manifest and has registered
listeners for onSpeak
and onStop
. In other words, there's no way for an extension to receive a
speech request and dynamically decide whether to handle it.
Types
AudioBuffer
Parameters containing an audio buffer and associated data.
Properties
-
audioBuffer
ArrayBuffer
The audio buffer from the text-to-speech engine. It should have length exactly audioStreamOptions.bufferSize and encoded as mono, at audioStreamOptions.sampleRate, and as linear pcm, 32-bit signed float i.e. the Float32Array type in javascript.
-
charIndex
number optional
The character index associated with this audio buffer.
-
isLastBuffer
boolean optional
True if this audio buffer is the last for the text being spoken.
AudioStreamOptions
Contains the audio stream format expected to be produced by an engine.
Properties
-
bufferSize
number
The number of samples within an audio buffer.
-
sampleRate
number
The sample rate expected in an audio buffer.
SpeakOptions
Options specified to the tts.speak() method.
Properties
-
gender
VoiceGender optional
Deprecated since Chrome 92Gender is deprecated and will be ignored.
Gender of voice for synthesized speech.
-
lang
string optional
The language to be used for synthesis, in the form language-region. Examples: 'en', 'en-US', 'en-GB', 'zh-CN'.
-
pitch
number optional
Speaking pitch between 0 and 2 inclusive, with 0 being lowest and 2 being highest. 1.0 corresponds to this voice's default pitch.
-
rate
number optional
Speaking rate relative to the default rate for this voice. 1.0 is the default rate, normally around 180 to 220 words per minute. 2.0 is twice as fast, and 0.5 is half as fast. This value is guaranteed to be between 0.1 and 10.0, inclusive. When a voice does not support this full range of rates, don't return an error. Instead, clip the rate to the range the voice supports.
-
voiceName
string optional
The name of the voice to use for synthesis.
-
volume
number optional
Speaking volume between 0 and 1 inclusive, with 0 being lowest and 1 being highest, with a default of 1.0.
VoiceGender
Gender is deprecated and will be ignored.
Enum
"male" "female"
Methods
updateVoices()
chrome.ttsEngine.updateVoices(
voices: TtsVoice[],
)
Called by an engine to update its list of voices. This list overrides any voices declared in this extension's manifest.
Parameters
-
voices
TtsVoice[]
Array of
tts.TtsVoice
objects representing the available voices for speech synthesis.
Events
onPause
chrome.ttsEngine.onPause.addListener(
callback: function,
)
Optional: if an engine supports the pause event, it should pause the current utterance being spoken, if any, until it receives a resume event or stop event. Note that a stop event should also clear the paused state.
Parameters
-
callback
function
The
callback
parameter looks like:() => void
onResume
chrome.ttsEngine.onResume.addListener(
callback: function,
)
Optional: if an engine supports the pause event, it should also support the resume event, to continue speaking the current utterance, if any. Note that a stop event should also clear the paused state.
Parameters
-
callback
function
The
callback
parameter looks like:() => void
onSpeak
chrome.ttsEngine.onSpeak.addListener(
callback: function,
)
Called when the user makes a call to tts.speak() and one of the voices from this extension's manifest is the first to match the options object.
Parameters
-
callback
function
The
callback
parameter looks like:(utterance: string, options: SpeakOptions, sendTtsEvent: function) => void
-
utterance
string
-
options
-
sendTtsEvent
function
The
sendTtsEvent
parameter looks like:(event: tts.TtsEvent) => void
-
event
The event from the text-to-speech engine indicating the status of this utterance.
-
-
onSpeakWithAudioStream
chrome.ttsEngine.onSpeakWithAudioStream.addListener(
callback: function,
)
Called when the user makes a call to tts.speak() and one of the voices from this extension's manifest is the first to match the options object. Differs from ttsEngine.onSpeak in that Chrome provides audio playback services and handles dispatching tts events.
Parameters
-
callback
function
The
callback
parameter looks like:(utterance: string, options: SpeakOptions, audioStreamOptions: AudioStreamOptions, sendTtsAudio: function, sendError: function) => void
-
utterance
string
-
options
-
audioStreamOptions
-
sendTtsAudio
function
The
sendTtsAudio
parameter looks like:(audioBufferParams: AudioBuffer) => void
-
audioBufferParams
Parameters containing an audio buffer and associated data.
-
-
sendError
function
Chrome 94+The
sendError
parameter looks like:(errorMessage?: string) => void
-
errorMessage
string optional
A string describing the error.
-
-
onStop
chrome.ttsEngine.onStop.addListener(
callback: function,
)
Fired when a call is made to tts.stop and this extension may be in the middle of speaking. If an extension receives a call to onStop and speech is already stopped, it should do nothing (not raise an error). If speech is in the paused state, this should cancel the paused state.
Parameters
-
callback
function
The
callback
parameter looks like:() => void