Android TTS学习——用五种外语说出“我爱你”
Android TTS学习——用五种外语说出“我爱你”
2010-08-10 23:05 10521人阅读 评论(14) 收藏 举报一.简单介绍
在上一篇里
http://blog.csdn.net/ichliebephone/archive/2010/08/10/5802044.aspx
我们简单的介绍了Android里的TTS功能并实现了一个最简单的Demo例子--AndroidTTSDemoFirst,在这篇文章中我们将具体介绍用到的TTSAPI,并给上一个Demo增加语言选择功能,可以使用TTS引擎支持的English、French、German、Italian和Spanish这5大语言来进行相应的语音合成,并用这5种外语向她说出“我爱你”。
二.实例分析
我们希望做的效果如下:
图1实现效果图
有了上一个例子做基础,这个Demo比较好实现,主要是增加了一个语言选择的控件Spinner,选择不同的语言,就会用对应的语言表达“我爱你”。
接下来就边实现这个Demo边讲解用到的TTSAPI。也是先创建一个Android工程,工程名为AndroidTTSDemoSecond,其中SDK必须选择1.6版本及以上。
其中Main.xml文件也还是很简单,在前一个AndroidTTSDemoFirst例子的基础上增加了一个Spinner控件,如下所示:
[xhtml] view plain copy- <?xmlversion="1.0"encoding="utf-8"?>
- <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <EditTextandroid:id="@+id/inputText"
- android:hint="Inputthetexthere!"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content">
- </EditText>
- <Buttonandroid:text="Speak"
- android:id="@+id/speakBtn"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_horizontal"
- android:enabled="false"
- ></Button>
- <Spinnerandroid:id="@+id/langSelect"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_horizontal">
- </Spinner>
- </LinearLayout>
Java文件的编写:
因为这个Demo例子只是在上一个AndroidTTSDemoFirst基础上的增加,因此可以使用上一个编写的java文件,只要把class名字改为AndroidTTSDemoSecond,如下所示:
[java] view plain copy- publicclassAndroidTTSDemoSecondextendsActivityimplementsOnInitListener{
- /**Calledwhentheactivityisfirstcreated.*/
- privateEditTextinputText=null;
- privateButtonspeakBtn=null;
- privatestaticfinalintREQ_TTS_STATUS_CHECK=0;
- privatestaticfinalStringTAG="TTSDemo";
- privateTextToSpeechmTts;
- @Override
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- //检查TTS数据是否已经安装并且可用
- IntentcheckIntent=newIntent();
- checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
- startActivityForResult(checkIntent,REQ_TTS_STATUS_CHECK);
- inputText=(EditText)findViewById(R.id.inputText);
- speakBtn=(Button)findViewById(R.id.speakBtn);
- inputText.setText("Thisisanexampleofspeechsynthesis.");
- speakBtn.setOnClickListener(newOnClickListener(){
- publicvoidonClick(Viewv){
- //TODOAuto-generatedmethodstub
- mTts.speak(inputText.getText().toString(),TextToSpeech.QUEUE_ADD,null);
- //朗读输入框里的内容
- }
- });
- }
- //实现TTS初始化接口
- @Override
- publicvoidonInit(intstatus){
- //TODOAuto-generatedmethodstub
- //TTSEngine初始化完成
- if(status==TextToSpeech.SUCCESS)
- {
- intresult=mTts.setLanguage(Locale.US);
- //设置发音语言
- if(result==TextToSpeech.LANG_MISSING_DATA||result==TextToSpeech.LANG_NOT_SUPPORTED)
- //判断语言是否可用
- {
- Log.v(TAG,"Languageisnotavailable");
- speakBtn.setEnabled(false);
- }
- else
- {
- mTts.speak("Thisisanexampleofspeechsynthesis.",TextToSpeech.QUEUE_ADD,null);
- speakBtn.setEnabled(true);
- }
- }
- }
- protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){
- if(requestCode==REQ_TTS_STATUS_CHECK)
- {
- switch(resultCode){
- caseTextToSpeech.Engine.CHECK_VOICE_DATA_PASS:
- //这个返回结果表明TTSEngine可以用
- {
- mTts=newTextToSpeech(this,this);
- Log.v(TAG,"TTSEngineisinstalled!");
- }
- break;
- caseTextToSpeech.Engine.CHECK_VOICE_DATA_BAD_DATA:
- //需要的语音数据已损坏
- caseTextToSpeech.Engine.CHECK_VOICE_DATA_MISSING_DATA:
- //缺少需要语言的语音数据
- caseTextToSpeech.Engine.CHECK_VOICE_DATA_MISSING_VOLUME:
- //缺少需要语言的发音数据
- {
- //这三种情况都表明数据有错,重新下载安装需要的数据
- Log.v(TAG,"Needlanguagestuff:"+resultCode);
- IntentdataIntent=newIntent();
- dataIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
- startActivity(dataIntent);
- }
- break;
- caseTextToSpeech.Engine.CHECK_VOICE_DATA_FAIL:
- //检查失败
- default:
- Log.v(TAG,"Gotafailure.TTSapparentlynotavailable");
- break;
- }
- }
- else
- {
- //其他Intent返回的结果
- }
- }
- @Override
- protectedvoidonPause(){
- //TODOAuto-generatedmethodstub
- super.onPause();
- if(mTts!=null)
- //activity暂停时也停止TTS
- {
- mTts.stop();
- }
- }
- @Override
- protectedvoidonDestroy(){
- //TODOAuto-generatedmethodstub
- super.onDestroy();
- //释放TTS的资源
- mTts.shutdown();
- }
- }
下面简单介绍下上面代码中和TTS相关的一些API使用。
首先是实现OnInitListener这个接口,这个接口中只有一个抽象函数voidonInit(intstatus),在TextToSpeech引擎初始化完成后调用,在这个函数里就可以根据状态status(为TextToSpeech.SUCCESS或者TextToSpeech.Error)判断TTS初始化成功与否进行相应的操作。
接着在使用TTS时,会先启动一个Activity检查TTS引擎需要的TTS数据是否已经安装并且可用,checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
这个Activity会返回如下结果之一:CHECK_VOICE_DATA_PASS,CHECK_VOICE_DATA_FAIL,CHECK_VOICE_DATA_BAD_DATA,CHECK_VOICE_DATA_MISSING_DATA,或者CHECK_VOICE_DATA_MISSING_VOLUME.
只有第一个结果CHECK_VOICE_DATA_PASS表明TTS数据可用,其他都是数据不可用的结果,可以启动一个Activity去安装需要的TTS数据,
dataIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
当数据可用时,就可以创建一个TextToSpeech实例,
publicTextToSpeech(Contextcontext,TextToSpeech.OnInitListenerlistener)
这里需要两个参数,一个是TTS实例运行的Context;
另一个是初始化接口的实现,在实例的创建过程中,如果TTS引擎没有运行的话,则会初始化TTS引擎,并且在初始化完成后调用其第二个参数listener。
有了TextToSpeech实例,接下来就可以对文本进行语音合成并发音了,对应的API为
publicintspeak(Stringtext,intqueueMode,HashMap<String,String>params)
这里需要三个参数,第一个为要合成的文本;
第二个为使用TTS队列的方式,因为使用TTS合成语音时需要时间,TTS引擎就会把还没有轮到的部分放在其队列中排队,后来的内容有两种使用队列的方式:QUEUE_ADD或者QUEUE_FLUSH,QUEUE_ADD表示把当前需要合成的内容添加到TTS队列的后面,等前面的都完成了后再轮到他,QUEUE_FLUSH表示清除队列中原有的内容,直接使TTS引擎对当前内容进行语音合成,一般来说适合比较紧急的情况使用,但因为在Android中可能不止你一个程序使用TTS引擎,因此为了不破坏其他人的数据,建议使用QUEUE_ADD参数;
第三个为键值对表示的一个参数,我们后面再来介绍,目前可以使其为null。
前半部分简单的介绍了前一个Demo用到的API,下半部分添加这个Demo中新的语言选择部分。
首先为Spinner控件新增加两个变量,
[java] view plain copy- privateSpinnerlangSelect=null;
- privateStringlanguages[]={"English","French","German","Italian","Spanish"};
接着添加Spinner的使用,
[java] view plain copy- langSelect=(Spinner)findViewById(R.id.langSelect);
- inputText.setText("Iloveyou");
- ArrayAdapter<String>adapter=newArrayAdapter<String>(this,android.R.layout.simple_spinner_item,languages);
- adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
- langSelect.setAdapter(adapter);
- langSelect.setSelection(0);
和TTS相关的部分是Spinner控件的itemselected事件的处理,
[java] view plain copy- langSelect.setOnItemSelectedListener(newOnItemSelectedListener(){
- publicvoidonItemSelected(AdapterView<?>parent,Viewview,
- intposition,longid){
- //TODOAuto-generatedmethodstub
- intpos=langSelect.getSelectedItemPosition();
- intresult=-1;
- switch(pos){
- case0:
- {
- inputText.setText("Iloveyou");
- result=mTts.setLanguage(Locale.US);
- }
- break;
- case1:
- {
- inputText.setText("Jet'aime");
- result=mTts.setLanguage(Locale.FRENCH);
- }
- break;
- case2:
- {
- inputText.setText("Ichliebedich");
- result=mTts.setLanguage(Locale.GERMAN);
- }
- break;
- case3:
- {
- inputText.setText("Tiamo");
- result=mTts.setLanguage(Locale.ITALIAN);
- }
- break;
- case4:
- {
- inputText.setText("Tequiero");
- result=mTts.setLanguage(newLocale("spa","ESP"));
- }
- break;
- default:
- break;
- }
- //设置发音语言
- if(result==TextToSpeech.LANG_MISSING_DATA||result==TextToSpeech.LANG_NOT_SUPPORTED)
- //判断语言是否可用
- {
- Log.v(TAG,"Languageisnotavailable");
- speakBtn.setEnabled(false);
- }
- else
- {
- speakBtn.setEnabled(true);
- }
- }
- publicvoidonNothingSelected(AdapterView<?>arg){
- //TODOAuto-generatedmethodstub
- }
- );
在选择不同的item时,为inputText设置不同语言“我爱你”对应的文本,并且为TTS实例设置语言。
为TTS引擎设置语言的API为
publicintsetLanguage(Localeloc);
使用Locale这个表示语言及国家区域的类来设置语言,目前支持English、French、German、Italian和Spanish这5大语言,返回的结果为
LANG_AVAILABLE,LANG_COUNTRY_AVAILABLE,LANG_COUNTRY_VAR_AVAILABLE,LANG_MISSING_DATA和LANG_NOT_SUPPORTED。其中LANG_MISSING_DATA和LANG_NOT_SUPPORTED表示无法使用当前进行设置的语言,另外的几个表示设置的语言有效。
至此,增加了语言选择的新的Demo完成了,程序运行后可以选择不同的语言说出“我爱你”,简单效果图如下所示:
图2简单效果图
文章对应的完整代码例子可以在这里下载:
http://download.csdn.net/source/2611687
注:文章参加“首届Google暑期大学生博客分享大赛——2010 Andriod篇”
更多相关文章
- android 直接进行数据库操作
- android数据的五种存储方式
- Android Launcher7.0首次数据加载逻辑
- android 连接数据库
- Android 数据存取
- Android 之 使用File类在SD卡中读取数据文件
- android SQLite数据库用法图文详解(附源码)
- [android]数据库SQLiteDatabase简介