15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CHROME_BROWSER_SPEECH_TTS_CONTROLLER_H_
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CHROME_BROWSER_SPEECH_TTS_CONTROLLER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <queue>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <vector>
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/singleton.h"
15f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles)#include "base/memory/weak_ptr.h"
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class Utterance;
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TtsPlatformImpl;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Profile;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Value;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Events sent back from the TTS engine indicating the progress.
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum TtsEventType {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TTS_EVENT_START,
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TTS_EVENT_END,
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TTS_EVENT_WORD,
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TTS_EVENT_SENTENCE,
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TTS_EVENT_MARKER,
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TTS_EVENT_INTERRUPTED,
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TTS_EVENT_CANCELLED,
35868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  TTS_EVENT_ERROR,
36868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  TTS_EVENT_PAUSE,
37868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  TTS_EVENT_RESUME
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)enum TtsGenderType {
41a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  TTS_GENDER_NONE,
42a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  TTS_GENDER_MALE,
43a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  TTS_GENDER_FEMALE
44a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)};
45a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Returns true if this event type is one that indicates an utterance
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// is finished and can be destroyed.
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool IsFinalTtsEventType(TtsEventType event_type);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The continuous parameters that apply to a given utterance.
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct UtteranceContinuousParameters {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UtteranceContinuousParameters();
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double rate;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double pitch;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double volume;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Information about one voice.
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct VoiceData {
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  VoiceData();
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ~VoiceData();
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string name;
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string lang;
66a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  TtsGenderType gender;
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string extension_id;
68a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  std::set<TtsEventType> events;
69a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
700f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // If true, the synthesis engine is a remote network resource.
710f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // It may be higher latency and may incur bandwidth costs.
720f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  bool remote;
730f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
74a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // If true, this is implemented by this platform's subclass of
75a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // TtsPlatformImpl. If false, this is implemented by an extension.
76a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  bool native;
77a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  std::string native_voice_identifier;
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Class that wants to receive events on utterances.
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class UtteranceEventDelegate {
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~UtteranceEventDelegate() {}
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void OnTtsEvent(Utterance* utterance,
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          TtsEventType event_type,
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          int char_index,
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          const std::string& error_message) = 0;
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Class that wants to be notified when the set of
9190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// voices has changed.
9290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class VoicesChangedDelegate {
9390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
9490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual ~VoicesChangedDelegate() {}
9590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void OnVoicesChanged() = 0;
9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
9790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// One speech utterance.
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Utterance {
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Construct an utterance given a profile and a completion task to call
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // when the utterance is done speaking. Before speaking this utterance,
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // its other parameters like text, rate, pitch, etc. should all be set.
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit Utterance(Profile* profile);
10581d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch  ~Utterance();
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sends an event to the delegate. If the event type is TTS_EVENT_END
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // or TTS_EVENT_ERROR, deletes the utterance. If |char_index| is -1,
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // uses the last good value.
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnTtsEvent(TtsEventType event_type,
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  int char_index,
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  const std::string& error_message);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Finish an utterance without sending an event to the delegate.
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Finish();
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Getters and setters for the text to speak and other speech options.
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_text(const std::string& text) { text_ = text; }
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& text() const { return text_; }
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_options(const base::Value* options);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const base::Value* options() const { return options_.get(); }
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_src_extension_id(const std::string& src_extension_id) {
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    src_extension_id_ = src_extension_id;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& src_extension_id() { return src_extension_id_; }
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_src_id(int src_id) { src_id_ = src_id; }
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int src_id() { return src_id_; }
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_src_url(const GURL& src_url) { src_url_ = src_url; }
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL& src_url() { return src_url_; }
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_voice_name(const std::string& voice_name) {
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    voice_name_ = voice_name;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& voice_name() const { return voice_name_; }
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_lang(const std::string& lang) {
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    lang_ = lang;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& lang() const { return lang_; }
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  void set_gender(TtsGenderType gender) {
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gender_ = gender;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
148a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  TtsGenderType gender() const { return gender_; }
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_continuous_parameters(const UtteranceContinuousParameters& params) {
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    continuous_parameters_ = params;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const UtteranceContinuousParameters& continuous_parameters() {
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return continuous_parameters_;
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_can_enqueue(bool can_enqueue) { can_enqueue_ = can_enqueue; }
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool can_enqueue() const { return can_enqueue_; }
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
160a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  void set_required_event_types(const std::set<TtsEventType>& types) {
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    required_event_types_ = types;
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
163a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  const std::set<TtsEventType>& required_event_types() const {
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return required_event_types_;
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
167a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  void set_desired_event_types(const std::set<TtsEventType>& types) {
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    desired_event_types_ = types;
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
170a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  const std::set<TtsEventType>& desired_event_types() const {
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return desired_event_types_;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& extension_id() const { return extension_id_; }
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_extension_id(const std::string& extension_id) {
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension_id_ = extension_id;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
179f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles)  UtteranceEventDelegate* event_delegate() const {
180f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles)    return event_delegate_.get();
181f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles)  }
182f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles)  void set_event_delegate(
183f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles)      base::WeakPtr<UtteranceEventDelegate> event_delegate) {
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    event_delegate_ = event_delegate;
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Getters and setters for internal state.
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile() const { return profile_; }
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int id() const { return id_; }
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool finished() const { return finished_; }
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The profile that initiated this utterance.
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile_;
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The extension ID of the extension providing TTS for this utterance, or
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // empty if native TTS is being used.
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string extension_id_;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The unique ID of this utterance, used to associate callback functions
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // with utterances.
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int id_;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The id of the next utterance, so we can associate requests with
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // responses.
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static int next_utterance_id_;
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The text to speak.
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string text_;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The full options arg passed to tts.speak, which may include fields
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // other than the ones we explicitly parse, below.
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> options_;
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The extension ID of the extension that called speak() and should
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // receive events.
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string src_extension_id_;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The source extension's ID of this utterance, so that it can associate
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // events with the appropriate callback.
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int src_id_;
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The URL of the page where the source extension called speak.
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL src_url_;
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The delegate to be called when an utterance event is fired.
227f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles)  base::WeakPtr<UtteranceEventDelegate> event_delegate_;
228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The parsed options.
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string voice_name_;
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string lang_;
232a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  TtsGenderType gender_;
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UtteranceContinuousParameters continuous_parameters_;
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool can_enqueue_;
235a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  std::set<TtsEventType> required_event_types_;
236a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  std::set<TtsEventType> desired_event_types_;
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The index of the current char being spoken.
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int char_index_;
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // True if this utterance received an event indicating it's done.
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool finished_;
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Singleton class that manages text-to-speech for the TTS and TTS engine
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// extension APIs, maintaining a queue of pending utterances and keeping
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// track of all state.
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TtsController {
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get the single instance of this class.
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static TtsController* GetInstance();
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if we're currently speaking an utterance.
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsSpeaking();
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Speak the given utterance. If the utterance's can_enqueue flag is true
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and another utterance is in progress, adds it to the end of the queue.
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Otherwise, interrupts any current utterance and speaks this one
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // immediately.
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SpeakOrEnqueue(Utterance* utterance);
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
262868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Stop all utterances and flush the queue. Implies leaving pause mode
263868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // as well.
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Stop();
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
266868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Pause the speech queue. Some engines may support pausing in the middle
267868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // of an utterance.
268868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void Pause();
269868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
270868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Resume speaking.
271868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void Resume();
272868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handle events received from the speech engine. Events are forwarded to
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the callback function, and in addition, completion and error events
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // trigger finishing the current utterance and starting the next one, if
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // any.
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnTtsEvent(int utterance_id,
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  TtsEventType event_type,
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  int char_index,
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  const std::string& error_message);
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return a list of all available voices, including the native voice,
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // if supported, and all voices registered by extensions.
284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void GetVoices(Profile* profile, std::vector<VoiceData>* out_voices);
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28681d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch  // Called by TtsExtensionLoaderChromeOs::LoadTtsExtension when it
28781d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch  // finishes loading the built-in TTS component extension.
28881d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch  void RetrySpeakingQueuedUtterances();
28981d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch
29090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Called by the extension system or platform implementation when the
29190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // list of voices may have changed and should be re-queried.
29290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void VoicesChanged();
29390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
29490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Add a delegate that wants to be notified when the set of voices changes.
29590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void AddVoicesChangedDelegate(VoicesChangedDelegate* delegate);
29690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
29790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Remove delegate that wants to be notified when the set of voices changes.
29890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void RemoveVoicesChangedDelegate(VoicesChangedDelegate* delegate);
29990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For unit testing.
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetPlatformImpl(TtsPlatformImpl* platform_impl);
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int QueueSize();
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TtsController();
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~TtsController();
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get the platform TTS implementation (or injected mock).
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TtsPlatformImpl* GetPlatformImpl();
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start speaking the given utterance. Will either take ownership of
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |utterance| or delete it if there's an error. Returns true on success.
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SpeakNow(Utterance* utterance);
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clear the utterance queue. If send_events is true, will send
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TTS_EVENT_CANCELLED events on each one.
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ClearUtteranceQueue(bool send_events);
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Finalize and delete the current utterance.
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void FinishCurrentUtterance();
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start speaking the next utterance in the queue.
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SpeakNextUtterance();
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
326a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // Given an utterance and a vector of voices, return the
327a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // index of the voice that best matches the utterance.
328a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  int GetMatchingVoice(const Utterance* utterance,
329a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                       std::vector<VoiceData>& voices);
330a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend struct DefaultSingletonTraits<TtsController>;
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The current utterance being spoken.
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Utterance* current_utterance_;
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
336868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Whether the queue is paused or not.
337868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  bool paused_;
338868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A queue of utterances to speak after the current one finishes.
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::queue<Utterance*> utterance_queue_;
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // A set of delegates that want to be notified when the voices change.
34390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::set<VoicesChangedDelegate*> voices_changed_delegates_;
34490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A pointer to the platform implementation of text-to-speech, for
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // dependency injection.
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TtsPlatformImpl* platform_impl_;
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TtsController);
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // CHROME_BROWSER_SPEECH_TTS_CONTROLLER_H_
353