TTS: Fix language setting.

This commit is contained in:
Jaromir Wysoglad 2019-10-16 18:42:16 +02:00
parent 94d17b1853
commit b9d3c84db4
6 changed files with 19 additions and 11 deletions

View file

@ -330,8 +330,8 @@ void SpeechDispatcherManager::setVolume(unsigned volume) {
void SpeechDispatcherManager::setLanguage(Common::String language) { void SpeechDispatcherManager::setLanguage(Common::String language) {
if (_speechState == BROKEN) if (_speechState == BROKEN)
return; return;
spd_set_language(_connection, language.c_str()); Common::TextToSpeechManager::setLanguage(language);
_ttsState->_language = language; spd_set_language(_connection, _ttsState->_language.c_str());
setVoice(_ttsState->_activeVoice); setVoice(_ttsState->_activeVoice);
} }

View file

@ -338,9 +338,7 @@ void WindowsTextToSpeechManager::setVolume(unsigned volume) {
} }
void WindowsTextToSpeechManager::setLanguage(Common::String language) { void WindowsTextToSpeechManager::setLanguage(Common::String language) {
if (language == "C") Common::TextToSpeechManager::setLanguage(language);
language = "en";
_ttsState->_language = language;
updateVoices(); updateVoices();
setVoice(0); setVoice(0);
} }
@ -471,7 +469,7 @@ void WindowsTextToSpeechManager::updateVoices() {
if (_ttsState->_availableVoices.empty()) { if (_ttsState->_availableVoices.empty()) {
_speechState = NO_VOICE; _speechState = NO_VOICE;
warning("No voice is available"); warning("No voice is available for language: %s", _ttsState->_language.c_str());
} else if (_speechState == NO_VOICE) } else if (_speechState == NO_VOICE)
_speechState = READY; _speechState = READY;
} }

View file

@ -145,5 +145,18 @@ Array<int> TextToSpeechManager::getVoiceIndicesByGender(TTSVoice::Gender gender)
return results; return results;
} }
void TextToSpeechManager::setLanguage(Common::String language) {
if (language == "C")
language = "en";
// The speech manager uses the ISO 639-1 for language codes (2 letter code)
// if we get a longer language string, just take the first 2 letters from that
// if it won't be a valid language code, the Manager just won't find any voice
// for it. This way a code like (en_GB) can also be passed to this.
if (language.size() > 2) {
language.erase(2, Common::String::npos);
}
_ttsState->_language = language;
}
} }
#endif #endif

View file

@ -271,7 +271,7 @@ public:
* because voices are usually language specific and so it is set to some platform * because voices are usually language specific and so it is set to some platform
* specific default after switching languages. * specific default after switching languages.
*/ */
virtual void setLanguage(String language) { _ttsState->_language = language; } virtual void setLanguage(String language);
/** /**
* Returns the current speech language * Returns the current speech language

View file

@ -638,8 +638,6 @@ void GuiManager::initTextToSpeech() {
Common::String currentLanguage = TransMan.getCurrentLanguage(); Common::String currentLanguage = TransMan.getCurrentLanguage();
if (currentLanguage == "C") if (currentLanguage == "C")
currentLanguage = "en"; currentLanguage = "en";
else
currentLanguage.setChar('\0', 2);
ttsMan->setLanguage(currentLanguage); ttsMan->setLanguage(currentLanguage);
#endif #endif
int volume = (ConfMan.getInt("speech_volume", "scummvm") * 100) / 256; int volume = (ConfMan.getInt("speech_volume", "scummvm") * 100) / 256;

View file

@ -2158,8 +2158,7 @@ void GlobalOptionsDialog::apply() {
if (newLang == "C") if (newLang == "C")
ttsMan->setLanguage("en"); ttsMan->setLanguage("en");
else { else {
Common::String guiLang(newLang.c_str(), 2); ttsMan->setLanguage(newLang);
ttsMan->setLanguage(guiLang);
} }
_ttsVoiceSelectionPopUp->setSelectedTag(0); _ttsVoiceSelectionPopUp->setSelectedTag(0);
} }