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