Prevent chrome://net-internals/#export from flickering
[chromium-blink-merge.git] / chrome / browser / speech / tts_controller.h
blob8f32cd93c152b47125a7bc6751e541088fba41db
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_
8 #include <queue>
9 #include <set>
10 #include <string>
11 #include <vector>
13 #include "base/memory/scoped_ptr.h"
14 #include "base/memory/singleton.h"
15 #include "base/memory/weak_ptr.h"
16 #include "url/gurl.h"
18 class Utterance;
19 class TtsPlatformImpl;
21 namespace base {
22 class Value;
25 namespace content {
26 class BrowserContext;
29 // Events sent back from the TTS engine indicating the progress.
30 enum TtsEventType {
31 TTS_EVENT_START,
32 TTS_EVENT_END,
33 TTS_EVENT_WORD,
34 TTS_EVENT_SENTENCE,
35 TTS_EVENT_MARKER,
36 TTS_EVENT_INTERRUPTED,
37 TTS_EVENT_CANCELLED,
38 TTS_EVENT_ERROR,
39 TTS_EVENT_PAUSE,
40 TTS_EVENT_RESUME
43 enum TtsGenderType {
44 TTS_GENDER_NONE,
45 TTS_GENDER_MALE,
46 TTS_GENDER_FEMALE
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();
57 double rate;
58 double pitch;
59 double volume;
62 // Information about one voice.
63 struct VoiceData {
64 VoiceData();
65 ~VoiceData();
67 std::string name;
68 std::string lang;
69 TtsGenderType gender;
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.
75 bool remote;
77 // If true, this is implemented by this platform's subclass of
78 // TtsPlatformImpl. If false, this is implemented by an extension.
79 bool native;
80 std::string native_voice_identifier;
83 // Interface that delegates TTS requests to user-installed extensions.
84 class TtsEngineDelegate {
85 public:
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 {
112 public:
113 virtual ~UtteranceEventDelegate() {}
114 virtual void OnTtsEvent(Utterance* utterance,
115 TtsEventType event_type,
116 int char_index,
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 {
123 public:
124 virtual ~VoicesChangedDelegate() {}
125 virtual void OnVoicesChanged() = 0;
128 // One speech utterance.
129 class Utterance {
130 public:
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);
135 ~Utterance();
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,
141 int char_index,
142 const std::string& error_message);
144 // Finish an utterance without sending an event to the delegate.
145 void Finish();
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) {
166 lang_ = lang;
168 const std::string& lang() const { return lang_; }
170 void set_gender(TtsGenderType gender) {
171 gender_ = gender;
173 TtsGenderType gender() const { return gender_; }
175 void set_continuous_parameters(const UtteranceContinuousParameters& params) {
176 continuous_parameters_ = params;
178 const UtteranceContinuousParameters& continuous_parameters() {
179 return continuous_parameters_;
182 void set_can_enqueue(bool can_enqueue) { can_enqueue_ = can_enqueue; }
183 bool can_enqueue() const { return can_enqueue_; }
185 void set_required_event_types(const std::set<TtsEventType>& types) {
186 required_event_types_ = types;
188 const std::set<TtsEventType>& required_event_types() const {
189 return required_event_types_;
192 void set_desired_event_types(const std::set<TtsEventType>& types) {
193 desired_event_types_ = types;
195 const std::set<TtsEventType>& desired_event_types() const {
196 return desired_event_types_;
199 const std::string& extension_id() const { return extension_id_; }
200 void set_extension_id(const std::string& extension_id) {
201 extension_id_ = extension_id;
204 UtteranceEventDelegate* event_delegate() const {
205 return event_delegate_;
207 void set_event_delegate(UtteranceEventDelegate* event_delegate) {
208 event_delegate_ = event_delegate;
211 // Getters and setters for internal state.
212 content::BrowserContext* browser_context() const { return browser_context_; }
213 int id() const { return id_; }
214 bool finished() const { return finished_; }
216 private:
217 // The BrowserContext that initiated this utterance.
218 content::BrowserContext* browser_context_;
220 // The extension ID of the extension providing TTS for this utterance, or
221 // empty if native TTS is being used.
222 std::string extension_id_;
224 // The unique ID of this utterance, used to associate callback functions
225 // with utterances.
226 int id_;
228 // The id of the next utterance, so we can associate requests with
229 // responses.
230 static int next_utterance_id_;
232 // The text to speak.
233 std::string text_;
235 // The full options arg passed to tts.speak, which may include fields
236 // other than the ones we explicitly parse, below.
237 scoped_ptr<base::Value> options_;
239 // The source extension's ID of this utterance, so that it can associate
240 // events with the appropriate callback.
241 int src_id_;
243 // The URL of the page where the source extension called speak.
244 GURL src_url_;
246 // The delegate to be called when an utterance event is fired.
247 UtteranceEventDelegate* event_delegate_;
249 // The parsed options.
250 std::string voice_name_;
251 std::string lang_;
252 TtsGenderType gender_;
253 UtteranceContinuousParameters continuous_parameters_;
254 bool can_enqueue_;
255 std::set<TtsEventType> required_event_types_;
256 std::set<TtsEventType> desired_event_types_;
258 // The index of the current char being spoken.
259 int char_index_;
261 // True if this utterance received an event indicating it's done.
262 bool finished_;
265 // Singleton class that manages text-to-speech for the TTS and TTS engine
266 // extension APIs, maintaining a queue of pending utterances and keeping
267 // track of all state.
268 class TtsController {
269 public:
270 // Get the single instance of this class.
271 static TtsController* GetInstance();
273 // Returns true if we're currently speaking an utterance.
274 virtual bool IsSpeaking() = 0;
276 // Speak the given utterance. If the utterance's can_enqueue flag is true
277 // and another utterance is in progress, adds it to the end of the queue.
278 // Otherwise, interrupts any current utterance and speaks this one
279 // immediately.
280 virtual void SpeakOrEnqueue(Utterance* utterance) = 0;
282 // Stop all utterances and flush the queue. Implies leaving pause mode
283 // as well.
284 virtual void Stop() = 0;
286 // Pause the speech queue. Some engines may support pausing in the middle
287 // of an utterance.
288 virtual void Pause() = 0;
290 // Resume speaking.
291 virtual void Resume() = 0;
293 // Handle events received from the speech engine. Events are forwarded to
294 // the callback function, and in addition, completion and error events
295 // trigger finishing the current utterance and starting the next one, if
296 // any.
297 virtual void OnTtsEvent(int utterance_id,
298 TtsEventType event_type,
299 int char_index,
300 const std::string& error_message) = 0;
302 // Return a list of all available voices, including the native voice,
303 // if supported, and all voices registered by extensions.
304 virtual void GetVoices(content::BrowserContext* browser_context,
305 std::vector<VoiceData>* out_voices) = 0;
307 // Called by the extension system or platform implementation when the
308 // list of voices may have changed and should be re-queried.
309 virtual void VoicesChanged() = 0;
311 // Add a delegate that wants to be notified when the set of voices changes.
312 virtual void AddVoicesChangedDelegate(VoicesChangedDelegate* delegate) = 0;
314 // Remove delegate that wants to be notified when the set of voices changes.
315 virtual void RemoveVoicesChangedDelegate(VoicesChangedDelegate* delegate) = 0;
317 // Remove delegate that wants to be notified when an utterance fires an event.
318 // Note: this cancels speech from any utterance with this delegate, and
319 // removes any utterances with this delegate from the queue.
320 virtual void RemoveUtteranceEventDelegate(UtteranceEventDelegate* delegate)
321 = 0;
323 // Set the delegate that processes TTS requests with user-installed
324 // extensions.
325 virtual void SetTtsEngineDelegate(TtsEngineDelegate* delegate) = 0;
327 // Get the delegate that processes TTS requests with user-installed
328 // extensions.
329 virtual TtsEngineDelegate* GetTtsEngineDelegate() = 0;
331 // For unit testing.
332 virtual void SetPlatformImpl(TtsPlatformImpl* platform_impl) = 0;
333 virtual int QueueSize() = 0;
335 protected:
336 virtual ~TtsController() {}
339 #endif // CHROME_BROWSER_SPEECH_TTS_CONTROLLER_H_