diff options
author | dmazzoni@chromium.org <dmazzoni@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-11-01 00:10:31 +0000 |
---|---|---|
committer | dmazzoni@chromium.org <dmazzoni@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-11-01 00:10:31 +0000 |
commit | b0a22f04854dbb16407c58a69589d64d32204e09 (patch) | |
tree | 60de48dfb663668c5bd82f22d79e143e23cb7c26 /chrome/browser/speech | |
parent | 084f82bdeef5f754cc9e52155168fad902649ac9 (diff) | |
download | chromium_src-b0a22f04854dbb16407c58a69589d64d32204e09.zip chromium_src-b0a22f04854dbb16407c58a69589d64d32204e09.tar.gz chromium_src-b0a22f04854dbb16407c58a69589d64d32204e09.tar.bz2 |
Implement Google network speech synthesis.
See bug for context. Implements a component extension
that provides speech synthesis using Google's speech
synthesis API.
Adds a "remote" flag to the TTS and TTS Engine APIs
so that it's possible for clients to distinguish
between local and remote speech engines.
Adds a new private extension API to expose Google's
API key, needed to make the request.
BUG=308250
Review URL: https://codereview.chromium.org/27034009
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@232242 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/speech')
8 files changed, 67 insertions, 45 deletions
diff --git a/chrome/browser/speech/extension_api/tts_engine_extension_api.cc b/chrome/browser/speech/extension_api/tts_engine_extension_api.cc index ba5e65b..b6908760 100644 --- a/chrome/browser/speech/extension_api/tts_engine_extension_api.cc +++ b/chrome/browser/speech/extension_api/tts_engine_extension_api.cc @@ -91,6 +91,7 @@ void GetExtensionVoices(Profile* profile, std::vector<VoiceData>* out_voices) { result_voice.native = false; result_voice.name = voice.voice_name; result_voice.lang = voice.lang; + result_voice.remote = voice.remote; result_voice.extension_id = extension->id(); if (voice.gender == constants::kGenderMale) result_voice.gender = TTS_GENDER_MALE; diff --git a/chrome/browser/speech/extension_api/tts_extension_api.cc b/chrome/browser/speech/extension_api/tts_extension_api.cc index 6523b4e..14c5641 100644 --- a/chrome/browser/speech/extension_api/tts_extension_api.cc +++ b/chrome/browser/speech/extension_api/tts_extension_api.cc @@ -307,6 +307,7 @@ bool TtsGetVoicesFunction::RunImpl() { const VoiceData& voice = voices[i]; DictionaryValue* result_voice = new DictionaryValue(); result_voice->SetString(constants::kVoiceNameKey, voice.name); + result_voice->SetBoolean(constants::kRemoteKey, voice.remote); if (!voice.lang.empty()) result_voice->SetString(constants::kLangKey, voice.lang); if (voice.gender == TTS_GENDER_MALE) diff --git a/chrome/browser/speech/extension_api/tts_extension_api_constants.cc b/chrome/browser/speech/extension_api/tts_extension_api_constants.cc index 7b8c45b..f1853dc 100644 --- a/chrome/browser/speech/extension_api/tts_extension_api_constants.cc +++ b/chrome/browser/speech/extension_api/tts_extension_api_constants.cc @@ -6,48 +6,49 @@ namespace tts_extension_api_constants { -const char kVoiceNameKey[] = "voiceName"; -const char kLangKey[] = "lang"; -const char kGenderKey[] = "gender"; -const char kRateKey[] = "rate"; -const char kPitchKey[] = "pitch"; -const char kVolumeKey[] = "volume"; +const char kCharIndexKey[] = "charIndex"; +const char kDesiredEventTypesKey[] = "desiredEventTypes"; const char kEnqueueKey[] = "enqueue"; +const char kErrorMessageKey[] = "errorMessage"; const char kEventTypeKey[] = "type"; const char kEventTypesKey[] = "eventTypes"; -const char kCharIndexKey[] = "charIndex"; -const char kErrorMessageKey[] = "errorMessage"; -const char kRequiredEventTypesKey[] = "requiredEventTypes"; -const char kDesiredEventTypesKey[] = "desiredEventTypes"; const char kExtensionIdKey[] = "extensionId"; -const char kSrcIdKey[] = "srcId"; +const char kGenderKey[] = "gender"; const char kIsFinalEventKey[] = "isFinalEvent"; +const char kLangKey[] = "lang"; const char kOnEventKey[] = "onEvent"; +const char kPitchKey[] = "pitch"; +const char kRateKey[] = "rate"; +const char kRemoteKey[] = "remote"; +const char kRequiredEventTypesKey[] = "requiredEventTypes"; +const char kSrcIdKey[] = "srcId"; +const char kVoiceNameKey[] = "voiceName"; +const char kVolumeKey[] = "volume"; const char kGenderFemale[] = "female"; const char kGenderMale[] = "male"; -const char kEventTypeStart[] = "start"; -const char kEventTypeEnd[] = "end"; -const char kEventTypeWord[] = "word"; -const char kEventTypeSentence[] = "sentence"; -const char kEventTypeMarker[] = "marker"; -const char kEventTypeInterrupted[] = "interrupted"; const char kEventTypeCancelled[] = "cancelled"; +const char kEventTypeEnd[] = "end"; const char kEventTypeError[] = "error"; +const char kEventTypeInterrupted[] = "interrupted"; +const char kEventTypeMarker[] = "marker"; const char kEventTypePause[] = "pause"; const char kEventTypeResume[] = "resume"; +const char kEventTypeSentence[] = "sentence"; +const char kEventTypeStart[] = "start"; +const char kEventTypeWord[] = "word"; -const char kErrorUndeclaredEventType[] = - "Cannot send an event type that is not declared in the extension manifest."; -const char kErrorUtteranceTooLong[] = "Utterance length is too long."; -const char kErrorInvalidLang[] = "Invalid lang."; const char kErrorInvalidGender[] = "Invalid gender."; -const char kErrorInvalidRate[] = "Invalid rate."; +const char kErrorInvalidLang[] = "Invalid lang."; const char kErrorInvalidPitch[] = "Invalid pitch."; +const char kErrorInvalidRate[] = "Invalid rate."; const char kErrorInvalidVolume[] = "Invalid volume."; const char kErrorMissingPauseOrResume[] = "A TTS engine extension should either listen for both onPause and onResume " "events, or neither."; +const char kErrorUndeclaredEventType[] = + "Cannot send an event type that is not declared in the extension manifest."; +const char kErrorUtteranceTooLong[] = "Utterance length is too long."; } // namespace tts_extension_api_constants. diff --git a/chrome/browser/speech/extension_api/tts_extension_api_constants.h b/chrome/browser/speech/extension_api/tts_extension_api_constants.h index 0809473..bec1749 100644 --- a/chrome/browser/speech/extension_api/tts_extension_api_constants.h +++ b/chrome/browser/speech/extension_api/tts_extension_api_constants.h @@ -11,46 +11,47 @@ namespace tts_extension_api_constants { -extern const char kVoiceNameKey[]; -extern const char kLangKey[]; -extern const char kGenderKey[]; -extern const char kRateKey[]; -extern const char kPitchKey[]; -extern const char kVolumeKey[]; +extern const char kCharIndexKey[]; +extern const char kDesiredEventTypesKey[]; extern const char kEnqueueKey[]; +extern const char kErrorMessageKey[]; extern const char kEventTypeKey[]; extern const char kEventTypesKey[]; -extern const char kCharIndexKey[]; -extern const char kErrorMessageKey[]; -extern const char kRequiredEventTypesKey[]; -extern const char kDesiredEventTypesKey[]; extern const char kExtensionIdKey[]; -extern const char kSrcIdKey[]; +extern const char kGenderKey[]; extern const char kIsFinalEventKey[]; +extern const char kLangKey[]; extern const char kOnEventKey[]; +extern const char kPitchKey[]; +extern const char kRateKey[]; +extern const char kRemoteKey[]; +extern const char kRequiredEventTypesKey[]; +extern const char kSrcIdKey[]; +extern const char kVoiceNameKey[]; +extern const char kVolumeKey[]; extern const char kGenderFemale[]; extern const char kGenderMale[]; -extern const char kEventTypeStart[]; -extern const char kEventTypeEnd[]; -extern const char kEventTypeWord[]; -extern const char kEventTypeSentence[]; -extern const char kEventTypeMarker[]; -extern const char kEventTypeInterrupted[]; extern const char kEventTypeCancelled[]; +extern const char kEventTypeEnd[]; extern const char kEventTypeError[]; +extern const char kEventTypeInterrupted[]; +extern const char kEventTypeMarker[]; extern const char kEventTypePause[]; extern const char kEventTypeResume[]; +extern const char kEventTypeSentence[]; +extern const char kEventTypeStart[]; +extern const char kEventTypeWord[]; -extern const char kErrorUndeclaredEventType[]; -extern const char kErrorUtteranceTooLong[]; -extern const char kErrorInvalidLang[]; extern const char kErrorInvalidGender[]; -extern const char kErrorInvalidRate[]; +extern const char kErrorInvalidLang[]; extern const char kErrorInvalidPitch[]; +extern const char kErrorInvalidRate[]; extern const char kErrorInvalidVolume[]; extern const char kErrorMissingPauseOrResume[]; +extern const char kErrorUndeclaredEventType[]; +extern const char kErrorUtteranceTooLong[]; } // namespace tts_extension_api_constants. #endif // CHROME_BROWSER_SPEECH_EXTENSION_API_TTS_EXTENSION_API_CONSTANTS_H_ diff --git a/chrome/browser/speech/extension_api/tts_extension_apitest.cc b/chrome/browser/speech/extension_api/tts_extension_apitest.cc index 63cc83c..b9e7a9a 100644 --- a/chrome/browser/speech/extension_api/tts_extension_apitest.cc +++ b/chrome/browser/speech/extension_api/tts_extension_apitest.cc @@ -6,7 +6,10 @@ #include "base/command_line.h" #include "base/memory/weak_ptr.h" #include "base/message_loop/message_loop.h" +#include "chrome/browser/extensions/component_loader.h" #include "chrome/browser/extensions/extension_apitest.h" +#include "chrome/browser/extensions/extension_service.h" +#include "chrome/browser/extensions/extension_system.h" #include "chrome/browser/speech/extension_api/tts_extension_api.h" #include "chrome/browser/speech/tts_controller.h" #include "chrome/browser/speech/tts_platform.h" @@ -32,6 +35,8 @@ namespace { int g_saved_utterance_id; } +namespace extensions { + class MockTtsPlatformImpl : public TtsPlatformImpl { public: MockTtsPlatformImpl() @@ -375,7 +380,16 @@ IN_PROC_BROWSER_TEST_F(TtsApiTest, LangMatching) { ASSERT_TRUE(RunExtensionTest("tts_engine/lang_matching")) << message_; } +IN_PROC_BROWSER_TEST_F(TtsApiTest, NetworkSpeechEngine) { + ExtensionService* service = extensions::ExtensionSystem::Get( + profile())->extension_service(); + service->component_loader()->AddNetworkSpeechSynthesisExtension(); + ASSERT_TRUE(RunExtensionTest("tts_engine/network_speech_engine")) << message_; +} + // http://crbug.com/122474 IN_PROC_BROWSER_TEST_F(TtsApiTest, EngineApi) { ASSERT_TRUE(RunExtensionTest("tts_engine/engine_api")) << message_; } + +} // namespace extensions diff --git a/chrome/browser/speech/tts_controller.cc b/chrome/browser/speech/tts_controller.cc index a0d376f..34f72a4 100644 --- a/chrome/browser/speech/tts_controller.cc +++ b/chrome/browser/speech/tts_controller.cc @@ -57,6 +57,7 @@ UtteranceContinuousParameters::UtteranceContinuousParameters() VoiceData::VoiceData() : gender(TTS_GENDER_NONE), + remote(false), native(false) {} VoiceData::~VoiceData() {} @@ -419,4 +420,3 @@ void TtsController::RemoveVoicesChangedDelegate( VoicesChangedDelegate* delegate) { voices_changed_delegates_.erase(delegate); } - diff --git a/chrome/browser/speech/tts_controller.h b/chrome/browser/speech/tts_controller.h index 18cbcd9..6081518 100644 --- a/chrome/browser/speech/tts_controller.h +++ b/chrome/browser/speech/tts_controller.h @@ -66,6 +66,10 @@ struct VoiceData { std::string extension_id; std::set<TtsEventType> events; + // If true, the synthesis engine is a remote network resource. + // It may be higher latency and may incur bandwidth costs. + bool remote; + // If true, this is implemented by this platform's subclass of // TtsPlatformImpl. If false, this is implemented by an extension. bool native; diff --git a/chrome/browser/speech/tts_message_filter.cc b/chrome/browser/speech/tts_message_filter.cc index 714c51f..3c397cd 100644 --- a/chrome/browser/speech/tts_message_filter.cc +++ b/chrome/browser/speech/tts_message_filter.cc @@ -67,7 +67,7 @@ void TtsMessageFilter::OnInitializeVoiceList() { out_voice.voice_uri = voices[i].name; out_voice.name = voices[i].name; out_voice.lang = voices[i].lang; - out_voice.local_service = true; + out_voice.local_service = !voices[i].remote; out_voice.is_default = (i == 0); } Send(new TtsMsg_SetVoiceList(out_voices)); |