Как да превключвате между TTS езици чрез натискане на бутон в Android

Създавам приложение за преводач, което превежда както английски на италиански, така и италиански на английски. Когато се въведе английска дума, тя се превежда и 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 обект в движение, но не мога да видя никакви примери, когато това се изисква.


person deucalion0    schedule 21.07.2014    source източник


Отговори (1)


По-добре късно от колкото никога...

Вашият onActivityResult е прекалено сложен.
Помислете дали да не използвате този:

@Override
protected final void onActivityResult
(
    final int requestCode, final int resultCode, final Intent data
)
{
    // If TTS Voice data doesn't exist, download it.
    if (requestCode == TTS_DATA_CHECK)
    {
        if (resultCode != Engine.CHECK_VOICE_DATA_PASS)
        {
            // Voice data doesn't exist
            final Intent tnt = new Intent(Engine.ACTION_INSTALL_TTS_DATA);
            startActivity(tnt);
        }
    }
}

(Ще трябва да дефинирате тази константа)

private static final int TTS_DATA_CHECK = 1;

За да зададете различен език:

// Change language
tts.setLanguage(new Locale("en")); // or "it"
// Say it
tts.speak("All you need is Love!", TextToSpeech.QUEUE_FLUSH, null);

Make sure your device isn't set to "Always use default settings" или промяната на езика няма да бъде приложена.

Последна бележка: Както се досещате, моят TTS обект се нарича tts

person Phantômaxx    schedule 05.08.2014
comment
Благодаря ти много! Късно е много по-добре от никога! Вашият код работи чудесно! Оценявам! - person deucalion0; 06.08.2014
comment
хей, имах същия проблем и този код работи добре в дейността, но не работи във фрагмент. - person B L Λ C K; 04.08.2020
comment
@BLΛCK Как е възможно?! Може би е въпрос на видимост? - person Phantômaxx; 21.08.2020