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(
if (!voice.lang.empty() && !utterance->lang().empty()) {
// An exact language match is worth more than a partial match.
if (voice.lang == utterance->lang()) {
score += 64;
score += 128;
} else if (l10n_util::GetLanguage(voice.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.
if (utterance->required_event_types().size() > 0) {
bool has_all_required_event_types = true;
......@@ -526,11 +519,11 @@ int TtsControllerImpl::GetMatchingVoice(
}
}
if (has_all_required_event_types)
score += 8;
score += 32;
}
#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) {
// First prefer the user's preference voice for the utterance language,
// if the utterance language is specified.
......@@ -539,7 +532,7 @@ int TtsControllerImpl::GetMatchingVoice(
lang_to_voice_pref->GetString(l10n_util::GetLanguage(utterance->lang()),
&voice_id);
if (VoiceIdMatches(voice_id, voice))
score += 4;
score += 16;
}
// Then prefer the user's preference voice for the system language.
......@@ -548,7 +541,7 @@ int TtsControllerImpl::GetMatchingVoice(
lang_to_voice_pref->GetString(l10n_util::GetLanguage(app_lang),
&voice_id);
if (VoiceIdMatches(voice_id, voice))
score += 2;
score += 8;
// 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
......@@ -556,10 +549,20 @@ int TtsControllerImpl::GetMatchingVoice(
voice_id.clear();
lang_to_voice_pref->GetString("noLanguageCode", &voice_id);
if (VoiceIdMatches(voice_id, voice))
score += 1;
score += 4;
}
#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) {
best_score = score;
best_score_index = i;
......
......@@ -5,6 +5,7 @@
// Unit tests for the TTS Controller.
#include "base/values.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/speech/tts_controller_impl.h"
#include "chrome/browser/speech/tts_platform.h"
#include "chrome/common/pref_names.h"
......@@ -80,7 +81,7 @@ TEST_F(TtsControllerTest, TestGetMatchingVoice) {
std::make_unique<TestableTtsController>();
#if defined(OS_CHROMEOS)
TestingPrefServiceSimple pref_service_;
// Uses default pref voices
// Uses default pref voices.
std::unique_ptr<base::DictionaryValue> lang_to_voices =
std::make_unique<base::DictionaryValue>();
lang_to_voices->SetKey(
......@@ -202,6 +203,47 @@ TEST_F(TtsControllerTest, TestGetMatchingVoice) {
utterance.set_extension_id("");
utterance.set_lang("");
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)
}
}
......
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