Създавам приложение за преводач, което превежда както английски на италиански, така и италиански на английски. Когато се въведе английска дума, тя се превежда и TTS изговаря превода с родния акцент. Така че въвеждам „Cheese“ и това се превежда на италиански, така че „Formaggio“ се показва и се казва с италиански акцент.
Проблемът ми е, че TTS машината е настроена с локал при инициализация на дейността и се боря да сменям между местните езици по време на изпълнение. Ако въведа английска дума, тя използва италианския език по желание, но ако след това въведа италианска дума, ще продължи да използва първия използван език на езика, италиански, а не британски. Това работи и обратното, въвеждането на италианска дума първо използва британския език, но няма да превключи.
Възможно ли е да зададете език на TTS обекти, готов за незабавна употреба, чрез натискане на бутон?
Ето моя код опростен:
public class TranslateActivity extends Activity implements OnInitListener {
Locale locLanguage, locLanguage2;
private TextToSpeech tts;
@Override
public void onCreate(Bundle savedInstanceState) {
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
setContentView(R.layout.translate);
locLanguage = new Locale("gb_GB");
locLanguage2 = new Locale("it_IT");
engtoita = (LinearLayout) findViewById(R.id.engtoitaButton);
itatoeng = (LinearLayout) findViewById(R.id.itatoengButton);
engtoita.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
tts.setLanguage(locLanguage2);
class bgStuff extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
try {
phraseEntered = et.getText().toString();
translatedText = translate(phraseEntered);
if(translatedText!="")
{
speakOut(translatedText);
}
} catch (Exception e) {
e.printStackTrace();
z = "Sorry, there was an error.";
translatedText = z;
}
return null;
}
}
}
});
itatoeng.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
tts.setLanguage(locLanguage1);
class bgStuff extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
try {
phraseEntered = et.getText().toString();
translatedText = translate(phraseEntered);
if(translatedText!="")
{
speakOut(translatedText);
}
} catch (Exception e) {
e.printStackTrace();
z = "Sorry, there was an error.";
translatedText = z;
}
return null;
}
}
}
});
}
@Override
public void onInit(int status) {
// TODO Auto-generated method stub
if (status == TextToSpeech.SUCCESS) {
int result = tts.setLanguage(locLanguage);
if (result == TextToSpeech.LANG_MISSING_DATA
|| result == TextToSpeech.LANG_NOT_SUPPORTED) {
Log.e("TTS", "This Language is not supported");
} else {
}
} else {
Log.e("TTS", "Initilization Failed!");
}
}
private void speakOut(String text) {
tts.speak(text, TextToSpeech.QUEUE_FLUSH, null);
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == MY_DATA_CHECK_CODE) {
if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {
tts = new TextToSpeech(this, this);
} else {
Intent installTTSIntent = new Intent();
installTTSIntent
.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
ArrayList<String> languages = new ArrayList<String>();
languages.add("ita");
installTTSIntent.putStringArrayListExtra(
TextToSpeech.Engine.EXTRA_CHECK_VOICE_DATA_FOR,
languages);
startActivity(installTTSIntent);
}
}
}
}
Надявам се това да е достатъчно за кодиране, за да демонстрирам какво се опитвам да постигна. Потърсих как да задам езика на TTS обект в движение, но не мога да видя никакви примери, когато това се изисква.