Commit 353a575d authored by David Tseng's avatar David Tseng Committed by Commit Bot

Fix exact system language to tts language matching

Bug: 896910
Change-Id: I7b8b08147943a214900e6b835ce7c45016167b22
Reviewed-on: https://chromium-review.googlesource.com/c/1292151
Commit-Queue: David Tseng <dtseng@chromium.org>
Reviewed-by: default avatarKatie Dektar <katie@chromium.org>
Cr-Commit-Position: refs/heads/master@{#601393}
parent 4bf9d01d
...@@ -501,20 +501,13 @@ int TtsControllerImpl::GetMatchingVoice( ...@@ -501,20 +501,13 @@ int TtsControllerImpl::GetMatchingVoice(
if (!voice.lang.empty() && !utterance->lang().empty()) { if (!voice.lang.empty() && !utterance->lang().empty()) {
// An exact language match is worth more than a partial match. // An exact language match is worth more than a partial match.
if (voice.lang == utterance->lang()) { if (voice.lang == utterance->lang()) {
score += 64; score += 128;
} else if (l10n_util::GetLanguage(voice.lang) == } else if (l10n_util::GetLanguage(voice.lang) ==
l10n_util::GetLanguage(utterance->lang())) { l10n_util::GetLanguage(utterance->lang())) {
score += 32; score += 64;
} }
} }
// Prefer the system language after that.
if (!voice.lang.empty()) {
if (l10n_util::GetLanguage(voice.lang) ==
l10n_util::GetLanguage(app_lang))
score += 16;
}
// Next, prefer required event types. // Next, prefer required event types.
if (utterance->required_event_types().size() > 0) { if (utterance->required_event_types().size() > 0) {
bool has_all_required_event_types = true; bool has_all_required_event_types = true;
...@@ -526,11 +519,11 @@ int TtsControllerImpl::GetMatchingVoice( ...@@ -526,11 +519,11 @@ int TtsControllerImpl::GetMatchingVoice(
} }
} }
if (has_all_required_event_types) if (has_all_required_event_types)
score += 8; score += 32;
} }
#if defined(OS_CHROMEOS) #if defined(OS_CHROMEOS)
// Finally, prefer the user's preference voice for the language: // Prefer the user's preference voice for the language:
if (lang_to_voice_pref) { if (lang_to_voice_pref) {
// First prefer the user's preference voice for the utterance language, // First prefer the user's preference voice for the utterance language,
// if the utterance language is specified. // if the utterance language is specified.
...@@ -539,7 +532,7 @@ int TtsControllerImpl::GetMatchingVoice( ...@@ -539,7 +532,7 @@ int TtsControllerImpl::GetMatchingVoice(
lang_to_voice_pref->GetString(l10n_util::GetLanguage(utterance->lang()), lang_to_voice_pref->GetString(l10n_util::GetLanguage(utterance->lang()),
&voice_id); &voice_id);
if (VoiceIdMatches(voice_id, voice)) if (VoiceIdMatches(voice_id, voice))
score += 4; score += 16;
} }
// Then prefer the user's preference voice for the system language. // Then prefer the user's preference voice for the system language.
...@@ -548,7 +541,7 @@ int TtsControllerImpl::GetMatchingVoice( ...@@ -548,7 +541,7 @@ int TtsControllerImpl::GetMatchingVoice(
lang_to_voice_pref->GetString(l10n_util::GetLanguage(app_lang), lang_to_voice_pref->GetString(l10n_util::GetLanguage(app_lang),
&voice_id); &voice_id);
if (VoiceIdMatches(voice_id, voice)) if (VoiceIdMatches(voice_id, voice))
score += 2; score += 8;
// Finally, prefer the user's preference voice for any language. This will // Finally, prefer the user's preference voice for any language. This will
// pick the default voice if there is no better match for the current // pick the default voice if there is no better match for the current
...@@ -556,10 +549,20 @@ int TtsControllerImpl::GetMatchingVoice( ...@@ -556,10 +549,20 @@ int TtsControllerImpl::GetMatchingVoice(
voice_id.clear(); voice_id.clear();
lang_to_voice_pref->GetString("noLanguageCode", &voice_id); lang_to_voice_pref->GetString("noLanguageCode", &voice_id);
if (VoiceIdMatches(voice_id, voice)) if (VoiceIdMatches(voice_id, voice))
score += 1; score += 4;
} }
#endif // defined(OS_CHROMEOS) #endif // defined(OS_CHROMEOS)
// Finally, prefer system language.
if (!voice.lang.empty()) {
if (voice.lang == app_lang) {
score += 2;
} else if (l10n_util::GetLanguage(voice.lang) ==
l10n_util::GetLanguage(app_lang)) {
score += 1;
}
}
if (score > best_score) { if (score > best_score) {
best_score = score; best_score = score;
best_score_index = i; best_score_index = i;
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
// Unit tests for the TTS Controller. // Unit tests for the TTS Controller.
#include "base/values.h" #include "base/values.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/speech/tts_controller_impl.h" #include "chrome/browser/speech/tts_controller_impl.h"
#include "chrome/browser/speech/tts_platform.h" #include "chrome/browser/speech/tts_platform.h"
#include "chrome/common/pref_names.h" #include "chrome/common/pref_names.h"
...@@ -80,7 +81,7 @@ TEST_F(TtsControllerTest, TestGetMatchingVoice) { ...@@ -80,7 +81,7 @@ TEST_F(TtsControllerTest, TestGetMatchingVoice) {
std::make_unique<TestableTtsController>(); std::make_unique<TestableTtsController>();
#if defined(OS_CHROMEOS) #if defined(OS_CHROMEOS)
TestingPrefServiceSimple pref_service_; TestingPrefServiceSimple pref_service_;
// Uses default pref voices // Uses default pref voices.
std::unique_ptr<base::DictionaryValue> lang_to_voices = std::unique_ptr<base::DictionaryValue> lang_to_voices =
std::make_unique<base::DictionaryValue>(); std::make_unique<base::DictionaryValue>();
lang_to_voices->SetKey( lang_to_voices->SetKey(
...@@ -202,6 +203,47 @@ TEST_F(TtsControllerTest, TestGetMatchingVoice) { ...@@ -202,6 +203,47 @@ TEST_F(TtsControllerTest, TestGetMatchingVoice) {
utterance.set_extension_id(""); utterance.set_extension_id("");
utterance.set_lang(""); utterance.set_lang("");
EXPECT_EQ(8, tts_controller->GetMatchingVoice(&utterance, voices)); EXPECT_EQ(8, tts_controller->GetMatchingVoice(&utterance, voices));
#endif // defined(OS_CHROMEOS)
}
{
// Check voices against system language.
std::vector<VoiceData> voices;
VoiceData voice0;
voice0.extension_id = "id0";
voice0.name = "voice0";
voice0.lang = "en-GB";
voices.push_back(voice0);
VoiceData voice1;
voice1.extension_id = "id1";
voice1.name = "voice1";
voice1.lang = "en-US";
voices.push_back(voice1);
Utterance utterance(nullptr);
// voice1 is matched against the exact default system language.
g_browser_process->SetApplicationLocale("en-US", "en-US");
utterance.set_lang("");
EXPECT_EQ(1, tts_controller->GetMatchingVoice(&utterance, voices));
// voice0 is matched against the system language which has no region piece.
g_browser_process->SetApplicationLocale("en", "en");
utterance.set_lang("");
EXPECT_EQ(0, tts_controller->GetMatchingVoice(&utterance, voices));
#if defined(OS_CHROMEOS)
// Add another preference.
std::unique_ptr<base::DictionaryValue> lang_to_voices =
std::make_unique<base::DictionaryValue>();
lang_to_voices->SetKey(
"en", base::Value("{\"name\":\"voice0\",\"extension\":\"id0\"}"));
pref_service_.SetUserPref(prefs::kTextToSpeechLangToVoiceName,
std::move(lang_to_voices));
// voice0 is matched against the pref over the system language.
g_browser_process->SetApplicationLocale("en-US", "en-US");
EXPECT_EQ(0, tts_controller->GetMatchingVoice(&utterance, voices));
#endif // defined(OS_CHROMEOS) #endif // defined(OS_CHROMEOS)
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment