Index: chrome/browser/extensions/extension_tts_api.cc |
=================================================================== |
--- chrome/browser/extensions/extension_tts_api.cc (revision 56764) |
+++ chrome/browser/extensions/extension_tts_api.cc (working copy) |
@@ -7,19 +7,84 @@ |
#include <string> |
#include "base/values.h" |
+#include "base/string_number_conversions.h" |
#include "chrome/browser/chromeos/cros/cros_library.h" |
#include "chrome/browser/chromeos/cros/speech_synthesis_library.h" |
+using base::DoubleToString; |
+ |
+const char kNameKey[] = "name"; |
+const char kLanguageNameKey[] = "languageName"; |
+const char kGenderKey[] = "gender"; |
+const char kRateKey[] = "rate"; |
+const char kPitchKey[] = "pitch"; |
+const char kVolumeKey[] = "volume"; |
+const char kEqualStr[] = "="; |
+const char kDelimiter[] = ";"; |
+ |
namespace { |
const char kCrosLibraryNotLoadedError[] = |
"Cros shared library not loaded."; |
+ |
+ bool ReadNumberByKey(DictionaryValue* dict, const char* key, |
+ double* ret_value) { |
+ Value* value; |
+ dict->Get(key, &value); |
+ if (value->IsType(Value::TYPE_INTEGER)) { |
+ int int_value; |
+ if (!dict->GetInteger(key, &int_value)) |
+ return false; |
+ *ret_value = int_value; |
+ } else if (value->IsType(Value::TYPE_REAL)) { |
+ if (!dict->GetReal(key, ret_value)) |
+ return false; |
+ } else { |
+ return false; |
+ } |
+ return true; |
+ } |
+ |
+ void AppendSpeakOption(std::string key, std::string value, |
+ std::string* options) { |
+ *options += key + kEqualStr + value + kDelimiter; |
+ } |
}; |
bool ExtensionTtsSpeakFunction::RunImpl() { |
std::string utterance; |
+ std::string options = ""; |
+ DictionaryValue* speak_options = NULL; |
EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &utterance)); |
+ if (args_->GetDictionary(1, &speak_options)) { |
+ std::string str_value; |
+ double real_value; |
+ if (speak_options->HasKey(kLanguageNameKey) && |
+ speak_options->GetString(kLanguageNameKey, &str_value)) { |
+ AppendSpeakOption(std::string(kNameKey), str_value, &options); |
+ } |
+ if (speak_options->HasKey(kGenderKey) && |
+ speak_options->GetString(kGenderKey, &str_value)) { |
+ AppendSpeakOption(std::string(kGenderKey), str_value, &options); |
+ } |
+ if (ReadNumberByKey(speak_options, kRateKey, &real_value)) |
+ // The TTS service allows a range of 0 to 5 for speech rate. |
+ AppendSpeakOption(std::string(kRateKey), |
+ DoubleToString(real_value * 5), &options); |
+ if (ReadNumberByKey(speak_options, kPitchKey, &real_value)) |
+ // The TTS service allows a range of 0 to 2 for speech pitch. |
+ AppendSpeakOption(std::string(kPitchKey), |
+ DoubleToString(real_value * 2), &options); |
+ if (ReadNumberByKey(speak_options, kVolumeKey, &real_value)) |
+ // The TTS service allows a range of 0 to 5 for speech volume. |
+ AppendSpeakOption(std::string(kVolumeKey), |
+ DoubleToString(real_value * 5), &options); |
+ } |
if (chromeos::CrosLibrary::Get()->EnsureLoaded()) { |
+ if (!options.empty()) { |
+ chromeos::CrosLibrary::Get()->GetSpeechSynthesisLibrary()-> |
+ SetSpeakProperties(options.c_str()); |
+ } |
bool ret = chromeos::CrosLibrary::Get()->GetSpeechSynthesisLibrary()-> |
Speak(utterance.c_str()); |
result_.reset(); |