summaryrefslogtreecommitdiffstats
path: root/chrome/browser/speech
diff options
context:
space:
mode:
authordmazzoni@chromium.org <dmazzoni@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-11-01 00:10:31 +0000
committerdmazzoni@chromium.org <dmazzoni@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-11-01 00:10:31 +0000
commitb0a22f04854dbb16407c58a69589d64d32204e09 (patch)
tree60de48dfb663668c5bd82f22d79e143e23cb7c26 /chrome/browser/speech
parent084f82bdeef5f754cc9e52155168fad902649ac9 (diff)
downloadchromium_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')
-rw-r--r--chrome/browser/speech/extension_api/tts_engine_extension_api.cc1
-rw-r--r--chrome/browser/speech/extension_api/tts_extension_api.cc1
-rw-r--r--chrome/browser/speech/extension_api/tts_extension_api_constants.cc45
-rw-r--r--chrome/browser/speech/extension_api/tts_extension_api_constants.h43
-rw-r--r--chrome/browser/speech/extension_api/tts_extension_apitest.cc14
-rw-r--r--chrome/browser/speech/tts_controller.cc2
-rw-r--r--chrome/browser/speech/tts_controller.h4
-rw-r--r--chrome/browser/speech/tts_message_filter.cc2
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));