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