1 // Copyright (c) 2011 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.
4
5 #include "chrome/browser/extensions/extension_tts_api.h"
6
7 #include "base/memory/singleton.h"
8 #include "base/string_number_conversions.h"
9 #include "chrome/browser/chromeos/cros/cros_library.h"
10 #include "chrome/browser/chromeos/cros/speech_synthesis_library.h"
11
12 namespace util = extension_tts_api_util;
13
14 using base::DoubleToString;
15
16 namespace {
17 const char kCrosLibraryNotLoadedError[] = "Cros shared library not loaded.";
18 };
19
20 class ExtensionTtsPlatformImplChromeOs : public ExtensionTtsPlatformImpl {
21 public:
22 virtual bool Speak(
23 const std::string& utterance,
24 const std::string& locale,
25 const std::string& gender,
26 double rate,
27 double pitch,
28 double volume);
29
30 virtual bool StopSpeaking();
31
32 virtual bool IsSpeaking();
33
34 // Get the single instance of this class.
35 static ExtensionTtsPlatformImplChromeOs* GetInstance();
36
37 private:
ExtensionTtsPlatformImplChromeOs()38 ExtensionTtsPlatformImplChromeOs() {}
~ExtensionTtsPlatformImplChromeOs()39 virtual ~ExtensionTtsPlatformImplChromeOs() {}
40
41 void AppendSpeakOption(std::string key,
42 std::string value,
43 std::string* options);
44
45 friend struct DefaultSingletonTraits<ExtensionTtsPlatformImplChromeOs>;
46
47 DISALLOW_COPY_AND_ASSIGN(ExtensionTtsPlatformImplChromeOs);
48 };
49
50 // static
GetInstance()51 ExtensionTtsPlatformImpl* ExtensionTtsPlatformImpl::GetInstance() {
52 return ExtensionTtsPlatformImplChromeOs::GetInstance();
53 }
54
Speak(const std::string & utterance,const std::string & locale,const std::string & gender,double rate,double pitch,double volume)55 bool ExtensionTtsPlatformImplChromeOs::Speak(
56 const std::string& utterance,
57 const std::string& locale,
58 const std::string& gender,
59 double rate,
60 double pitch,
61 double volume) {
62 chromeos::CrosLibrary* cros_library = chromeos::CrosLibrary::Get();
63 if (!cros_library->EnsureLoaded()) {
64 set_error(kCrosLibraryNotLoadedError);
65 return false;
66 }
67
68 std::string options;
69
70 if (!locale.empty()) {
71 AppendSpeakOption(
72 chromeos::SpeechSynthesisLibrary::kSpeechPropertyLocale,
73 locale,
74 &options);
75 }
76
77 if (!gender.empty()) {
78 AppendSpeakOption(
79 chromeos::SpeechSynthesisLibrary::kSpeechPropertyGender,
80 gender,
81 &options);
82 }
83
84 if (rate >= 0.0) {
85 AppendSpeakOption(
86 chromeos::SpeechSynthesisLibrary::kSpeechPropertyRate,
87 DoubleToString(rate * 5),
88 &options);
89 }
90
91 if (pitch >= 0.0) {
92 // The TTS service allows a range of 0 to 2 for speech pitch.
93 AppendSpeakOption(
94 chromeos::SpeechSynthesisLibrary::kSpeechPropertyPitch,
95 DoubleToString(pitch * 2),
96 &options);
97 }
98
99 if (volume >= 0.0) {
100 // The TTS service allows a range of 0 to 5 for speech volume.
101 AppendSpeakOption(
102 chromeos::SpeechSynthesisLibrary::kSpeechPropertyVolume,
103 DoubleToString(volume * 5),
104 &options);
105 }
106
107 if (!options.empty()) {
108 cros_library->GetSpeechSynthesisLibrary()->SetSpeakProperties(
109 options.c_str());
110 }
111
112 return cros_library->GetSpeechSynthesisLibrary()->Speak(utterance.c_str());
113 }
114
StopSpeaking()115 bool ExtensionTtsPlatformImplChromeOs::StopSpeaking() {
116 if (chromeos::CrosLibrary::Get()->EnsureLoaded()) {
117 return chromeos::CrosLibrary::Get()->GetSpeechSynthesisLibrary()->
118 StopSpeaking();
119 }
120
121 set_error(kCrosLibraryNotLoadedError);
122 return false;
123 }
124
IsSpeaking()125 bool ExtensionTtsPlatformImplChromeOs::IsSpeaking() {
126 if (chromeos::CrosLibrary::Get()->EnsureLoaded()) {
127 return chromeos::CrosLibrary::Get()->GetSpeechSynthesisLibrary()->
128 IsSpeaking();
129 }
130
131 set_error(kCrosLibraryNotLoadedError);
132 return false;
133 }
134
AppendSpeakOption(std::string key,std::string value,std::string * options)135 void ExtensionTtsPlatformImplChromeOs::AppendSpeakOption(
136 std::string key,
137 std::string value,
138 std::string* options) {
139 *options +=
140 key +
141 chromeos::SpeechSynthesisLibrary::kSpeechPropertyEquals +
142 value +
143 chromeos::SpeechSynthesisLibrary::kSpeechPropertyDelimiter;
144 }
145
146 // static
147 ExtensionTtsPlatformImplChromeOs*
GetInstance()148 ExtensionTtsPlatformImplChromeOs::GetInstance() {
149 return Singleton<ExtensionTtsPlatformImplChromeOs>::get();
150 }
151