1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef CHROME_BROWSER_SPEECH_TTS_CONTROLLER_H_
6 #define CHROME_BROWSER_SPEECH_TTS_CONTROLLER_H_
13 #include "base/memory/scoped_ptr.h"
14 #include "base/memory/singleton.h"
15 #include "base/memory/weak_ptr.h"
19 class TtsPlatformImpl
;
29 // Events sent back from the TTS engine indicating the progress.
36 TTS_EVENT_INTERRUPTED
,
49 // Returns true if this event type is one that indicates an utterance
50 // is finished and can be destroyed.
51 bool IsFinalTtsEventType(TtsEventType event_type
);
53 // The continuous parameters that apply to a given utterance.
54 struct UtteranceContinuousParameters
{
55 UtteranceContinuousParameters();
62 // Information about one voice.
70 std::string extension_id
;
71 std::set
<TtsEventType
> events
;
73 // If true, the synthesis engine is a remote network resource.
74 // It may be higher latency and may incur bandwidth costs.
77 // If true, this is implemented by this platform's subclass of
78 // TtsPlatformImpl. If false, this is implemented by an extension.
80 std::string native_voice_identifier
;
83 // Interface that delegates TTS requests to user-installed extensions.
84 class TtsEngineDelegate
{
86 virtual ~TtsEngineDelegate() {}
88 // Return a list of all available voices registered.
89 virtual void GetVoices(content::BrowserContext
* browser_context
,
90 std::vector
<VoiceData
>* out_voices
) = 0;
92 // Speak the given utterance by sending an event to the given TTS engine.
93 virtual void Speak(Utterance
* utterance
, const VoiceData
& voice
) = 0;
95 // Stop speaking the given utterance by sending an event to the target
96 // associated with this utterance.
97 virtual void Stop(Utterance
* utterance
) = 0;
99 // Pause in the middle of speaking this utterance.
100 virtual void Pause(Utterance
* utterance
) = 0;
102 // Resume speaking this utterance.
103 virtual void Resume(Utterance
* utterance
) = 0;
105 // Load the built-in component extension for ChromeOS.
106 virtual bool LoadBuiltInTtsExtension(
107 content::BrowserContext
* browser_context
) = 0;
110 // Class that wants to receive events on utterances.
111 class UtteranceEventDelegate
{
113 virtual ~UtteranceEventDelegate() {}
114 virtual void OnTtsEvent(Utterance
* utterance
,
115 TtsEventType event_type
,
117 const std::string
& error_message
) = 0;
120 // Class that wants to be notified when the set of
121 // voices has changed.
122 class VoicesChangedDelegate
{
124 virtual ~VoicesChangedDelegate() {}
125 virtual void OnVoicesChanged() = 0;
128 // One speech utterance.
131 // Construct an utterance given a profile and a completion task to call
132 // when the utterance is done speaking. Before speaking this utterance,
133 // its other parameters like text, rate, pitch, etc. should all be set.
134 explicit Utterance(content::BrowserContext
* browser_context
);
137 // Sends an event to the delegate. If the event type is TTS_EVENT_END
138 // or TTS_EVENT_ERROR, deletes the utterance. If |char_index| is -1,
139 // uses the last good value.
140 void OnTtsEvent(TtsEventType event_type
,
142 const std::string
& error_message
);
144 // Finish an utterance without sending an event to the delegate.
147 // Getters and setters for the text to speak and other speech options.
148 void set_text(const std::string
& text
) { text_
= text
; }
149 const std::string
& text() const { return text_
; }
151 void set_options(const base::Value
* options
);
152 const base::Value
* options() const { return options_
.get(); }
154 void set_src_id(int src_id
) { src_id_
= src_id
; }
155 int src_id() { return src_id_
; }
157 void set_src_url(const GURL
& src_url
) { src_url_
= src_url
; }
158 const GURL
& src_url() { return src_url_
; }
160 void set_voice_name(const std::string
& voice_name
) {
161 voice_name_
= voice_name
;
163 const std::string
& voice_name() const { return voice_name_
; }
165 void set_lang(const std::string
& lang
) {
168 const std::string
& lang() const { return lang_
; }
170 void set_gender(TtsGenderType gender
) {
173 TtsGenderType
gender() const { return gender_
; }
175 void set_continuous_parameters(const double rate
,
177 const double volume
) {
178 continuous_parameters_
.rate
= rate
;
179 continuous_parameters_
.pitch
= pitch
;
180 continuous_parameters_
.volume
= volume
;
182 const UtteranceContinuousParameters
& continuous_parameters() {
183 return continuous_parameters_
;
186 void set_can_enqueue(bool can_enqueue
) { can_enqueue_
= can_enqueue
; }
187 bool can_enqueue() const { return can_enqueue_
; }
189 void set_required_event_types(const std::set
<TtsEventType
>& types
) {
190 required_event_types_
= types
;
192 const std::set
<TtsEventType
>& required_event_types() const {
193 return required_event_types_
;
196 void set_desired_event_types(const std::set
<TtsEventType
>& types
) {
197 desired_event_types_
= types
;
199 const std::set
<TtsEventType
>& desired_event_types() const {
200 return desired_event_types_
;
203 const std::string
& extension_id() const { return extension_id_
; }
204 void set_extension_id(const std::string
& extension_id
) {
205 extension_id_
= extension_id
;
208 UtteranceEventDelegate
* event_delegate() const {
209 return event_delegate_
;
211 void set_event_delegate(UtteranceEventDelegate
* event_delegate
) {
212 event_delegate_
= event_delegate
;
215 // Getters and setters for internal state.
216 content::BrowserContext
* browser_context() const { return browser_context_
; }
217 int id() const { return id_
; }
218 bool finished() const { return finished_
; }
221 // The BrowserContext that initiated this utterance.
222 content::BrowserContext
* browser_context_
;
224 // The extension ID of the extension providing TTS for this utterance, or
225 // empty if native TTS is being used.
226 std::string extension_id_
;
228 // The unique ID of this utterance, used to associate callback functions
232 // The id of the next utterance, so we can associate requests with
234 static int next_utterance_id_
;
236 // The text to speak.
239 // The full options arg passed to tts.speak, which may include fields
240 // other than the ones we explicitly parse, below.
241 scoped_ptr
<base::Value
> options_
;
243 // The source extension's ID of this utterance, so that it can associate
244 // events with the appropriate callback.
247 // The URL of the page where the source extension called speak.
250 // The delegate to be called when an utterance event is fired.
251 UtteranceEventDelegate
* event_delegate_
;
253 // The parsed options.
254 std::string voice_name_
;
256 TtsGenderType gender_
;
257 UtteranceContinuousParameters continuous_parameters_
;
259 std::set
<TtsEventType
> required_event_types_
;
260 std::set
<TtsEventType
> desired_event_types_
;
262 // The index of the current char being spoken.
265 // True if this utterance received an event indicating it's done.
269 // Singleton class that manages text-to-speech for the TTS and TTS engine
270 // extension APIs, maintaining a queue of pending utterances and keeping
271 // track of all state.
272 class TtsController
{
274 // Get the single instance of this class.
275 static TtsController
* GetInstance();
277 // Returns true if we're currently speaking an utterance.
278 virtual bool IsSpeaking() = 0;
280 // Speak the given utterance. If the utterance's can_enqueue flag is true
281 // and another utterance is in progress, adds it to the end of the queue.
282 // Otherwise, interrupts any current utterance and speaks this one
284 virtual void SpeakOrEnqueue(Utterance
* utterance
) = 0;
286 // Stop all utterances and flush the queue. Implies leaving pause mode
288 virtual void Stop() = 0;
290 // Pause the speech queue. Some engines may support pausing in the middle
292 virtual void Pause() = 0;
295 virtual void Resume() = 0;
297 // Handle events received from the speech engine. Events are forwarded to
298 // the callback function, and in addition, completion and error events
299 // trigger finishing the current utterance and starting the next one, if
301 virtual void OnTtsEvent(int utterance_id
,
302 TtsEventType event_type
,
304 const std::string
& error_message
) = 0;
306 // Return a list of all available voices, including the native voice,
307 // if supported, and all voices registered by extensions.
308 virtual void GetVoices(content::BrowserContext
* browser_context
,
309 std::vector
<VoiceData
>* out_voices
) = 0;
311 // Called by the extension system or platform implementation when the
312 // list of voices may have changed and should be re-queried.
313 virtual void VoicesChanged() = 0;
315 // Add a delegate that wants to be notified when the set of voices changes.
316 virtual void AddVoicesChangedDelegate(VoicesChangedDelegate
* delegate
) = 0;
318 // Remove delegate that wants to be notified when the set of voices changes.
319 virtual void RemoveVoicesChangedDelegate(VoicesChangedDelegate
* delegate
) = 0;
321 // Remove delegate that wants to be notified when an utterance fires an event.
322 // Note: this cancels speech from any utterance with this delegate, and
323 // removes any utterances with this delegate from the queue.
324 virtual void RemoveUtteranceEventDelegate(UtteranceEventDelegate
* delegate
)
327 // Set the delegate that processes TTS requests with user-installed
329 virtual void SetTtsEngineDelegate(TtsEngineDelegate
* delegate
) = 0;
331 // Get the delegate that processes TTS requests with user-installed
333 virtual TtsEngineDelegate
* GetTtsEngineDelegate() = 0;
336 virtual void SetPlatformImpl(TtsPlatformImpl
* platform_impl
) = 0;
337 virtual int QueueSize() = 0;
340 virtual ~TtsController() {}
343 #endif // CHROME_BROWSER_SPEECH_TTS_CONTROLLER_H_