Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Android中通过按下按钮在TTS语言之间切换_Android_Locale_Text To Speech - Fatal编程技术网

如何在Android中通过按下按钮在TTS语言之间切换

如何在Android中通过按下按钮在TTS语言之间切换,android,locale,text-to-speech,Android,Locale,Text To Speech,我正在制作一个翻译应用程序,可以将英语翻译成意大利语,也可以将意大利语翻译成英语。当输入一个英语单词时,它会被翻译,TTS会用母语口音说出翻译。所以我输入“Cheese”,然后翻译成意大利语,“Formaggio”显示出来,用意大利语发音 我的问题是TTS引擎是在初始化活动时使用区域设置设置的,我很难在运行时在本地语言之间进行更改。如果我输入一个英语单词,它会根据需要使用意大利语区域设置,但是如果我输入一个意大利语单词,它将继续使用第一个使用的区域设置语言,意大利语而不是英国语。这也是另一种方式

我正在制作一个翻译应用程序,可以将英语翻译成意大利语,也可以将意大利语翻译成英语。当输入一个英语单词时,它会被翻译,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);
                }
            }
        }

    }
公共类TranslateActivity将活动实现扩展到NitListener上{
本地语言,本地语言2;
私密文本语音tts;
@凌驾
创建时的公共void(Bundle savedInstanceState){
this.requestWindowFeature(Window.FEATURE\u NO\u TITLE);
super.onCreate(savedInstanceState);
setContentView(R.layout.translate);
locLanguage=新语言环境(“gb_gb”);
LocalLanguage2=新区域设置(“it_-it”);
engtoita=(线性布局)findViewById(R.id.Engtoitabuton);
itatoeng=(LinearLayout)findViewById(R.id.itatoeng按钮);
setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
tts.setLanguage(LocaLanguage2);
类bgStuff扩展异步任务{
@凌驾
受保护的Void doInBackground(Void…参数){
试一试{
phraseintered=et.getText().toString();
translatedText=翻译(输入短语);
如果(translatedText!=“”)
{
演讲(翻译文本);
}
}捕获(例外e){
e、 printStackTrace();
z=“对不起,发生了一个错误。”;
translatedText=z;
}
返回null;
}
}
}
});
setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
tts.setLanguage(LocaLanguage1);
类bgStuff扩展异步任务{
@凌驾
受保护的Void doInBackground(Void…参数){
试一试{
phraseintered=et.getText().toString();
translatedText=翻译(输入短语);
如果(translatedText!=“”)
{
演讲(翻译文本);
}
}捕获(例外e){
e、 printStackTrace();
z=“对不起,发生了一个错误。”;
translatedText=z;
}
返回null;
}
}
}
});
}
@凌驾
公共无效onInit(int状态){
//TODO自动生成的方法存根
if(status==TextToSpeech.SUCCESS){
int result=tts.setLanguage(locLanguage);
if(result==TextToSpeech.LANG_缺少_数据
||结果==TextToSpeech.LANG(不支持){
Log.e(“TTS”,“不支持这种语言”);
}否则{
}
}否则{
Log.e(“TTS”,“初始化失败!”);
}
}
专用void扬声器(字符串文本){
tts.speak(text,TextToSpeech.QUEUE\u FLUSH,null);
}
受保护的void onActivityResult(int请求代码、int结果代码、意图数据){
if(requestCode==我的数据检查代码){
if(resultCode==TextToSpeech.Engine.CHECK\u VOICE\u DATA\u PASS){
tts=新的TextToSpeech(这个,这个);
}否则{
Intent installttsinent=新Intent();
安装
.setAction(TextToSpeech.Engine.ACTION\u安装\u TTS\u数据);
ArrayList languages=新的ArrayList();
语言。添加(“ita”);
installttsinent.putStringArrayListExtra(
TextToSpeech.Engine.EXTRA\u检查语音\u数据\u,
语言);
StartTactivity(安装);
}
}
}
}

我希望这足够用来编写代码来演示我试图实现的目标。我查看了如何动态设置TTS对象的语言,但没有看到任何需要设置的示例。

迟做总比不做好

您的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);
        }
    }
}
(您需要定义此常量)

要设置不同的语言,请执行以下操作:

// Change language
tts.setLanguage(new Locale("en")); // or "it"
// Say it
tts.speak("All you need is Love!", TextToSpeech.QUEUE_FLUSH, null);
确保您的设备未设置为“始终使用默认设置”
,否则不会应用语言更改


最后一点:正如您所猜测的,我的TTS对象名为TTS

非常感谢!迟到的是穆
// Change language
tts.setLanguage(new Locale("en")); // or "it"
// Say it
tts.speak("All you need is Love!", TextToSpeech.QUEUE_FLUSH, null);