一、基础知识
1.1 Android上TTS介绍
TextToSpeech简称 TTS,称为语音合成,是Android 系统从1.6版本开始支持的新功能,能将所指定的文本转成不同语言音频输出。
首先来看下Adnroid系统带的TTS设置界面,点击Settings->Speech synthesis(这是1.6版本,如果是2.1版本的话是Settings->Text to Speech),如下图1所示:
TTS功能需要有TTS Engine的支持,下面我们就来了解下android提供的TTS Engine。
Android使用了叫Pico的支持多种语言的语音合成引擎,Pico在后台负责把分析输入的文本,
把分本分成他能识别的各个片段,再把合成的各个语音片段以听起来比较自然的方式连接在一起,这个过程Android系统帮我们做,我们只把他当做一个神奇的过程就可以了。
TTS engine依托于当前Android Platform所支持的几种主要的语言:English、French、German、Italian和Spanish五大语言(暂时也是没有对中文提 供支持)。TTS可以将文本随意的转换成以上任意五种语言的语音输出。与此同时,对于个别的语言版本将取决于不同的时区,例如:对于English,在 TTS中可以分别输出美式和英式两种不同的版本。
 
1.2 OPhone2.0上使用TTS
OPhone2.0系统中虽然不到上面这个设置界面,但是其对应的是Android2.1版本,因此OPhone2.0也是支持TTS功能的。
下 面就具体介绍在OPhone2.0上开发具有TTS功能程序的方法,并完成一个简单的Demo实例,可以使用TTS引擎支持的 English、 French 、 German 、 Italian 和 Spanish 这 5大语言来进行相应的语音合成,并用这 5 种外语向她说出“我爱你”。
 
 
二、实例开发
2.1 实例介绍
下面我们先做一个具体的实例来亲自体会一下OPhone2.0/Android的TTS的效果。
在具体做之前给个OPhone2.0/Android TTS的API的链接,
androidappdocs.appspot/reference/android/speech/tts/package-summary.html
可以先看下大概了解TTS提供的功能。
可以看到TTS提供了两个接口和两个类。
我们希望做的效果如下图3所示:
最上面是一个EditText,显示不同语言的“我爱你”,最下面是一个Spinner,可以选择English、 French 、 German 、 Italian 和 Spanish这5种语言,点击中间的Speak按钮,就
会朗读出对应语言的“我爱你”。
 
2.2 具体开发
创建一个OPhone工程,工程名为OPhoneTTSDemo,其中SDK选择OPhone2.0。
 
2.2.1 布局文件的实现
其中l文件很简单,如下所示:
复制到剪贴板  XML/HTML代码
1. <?xml version="1.0" encoding="UTF-8"?> <LinearLayout android:layout_height="fill_parent" android:layout_width="fill_parent" android:orientation="vertical" xmlns:android="schemas.android/apk/res/android"> <EditText android:hint="Input the text here!" android:id="@+id/inputText" android:layout_height="wrap_content" android:layout_width="fill_parent"/> <Button android:enabled="false" android:id="@+id/speakBtn" android:layout_gravity="center_horizontal" android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="Speak"/> <Spinner android:id="@+id/langSelect" android:layout_gravity="center_horizontal" android:layout_height="wrap_content" android:layout_width="wrap_content"/> </LinearLayout>     
2.2.2 Java文件的编写
要使用TTS首先得实现OnInitListener接口:
复制到剪贴板  Java代码
1. public class OPhoneTTSDemo extends Activity implements OnInitListener{ /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Override public void onInit(int status) { // TODO Auto-generated method stub } }   
OnInitListener 这个接口中只有一个抽象函数void onInit(int status),在TextToSpeech引擎初始化完成后调用,在这个函数里就可以根据状态status(为 TextToSpeech.SUCCESS或者TextToSpeech.Error)判断TTS初始化成功与否进行相应的操作。
 
接着定义好下面要用到的几个变量:
复制到剪贴板  Java代码
1. private EditText inputText = nullprivate Button speakBtn = nullprivate static final int REQ_TTS_STATUS_CHECK = 0private static final String TAG = "TTS Demo"private TextToSpeech mTts; private Spinner langSelect = nullprivate String languages[]={"English","French","German","Italian","Spanish"};     
虽然像OPhone2.0这样在Android1.6版本及之后的系统都默认安装了TTS引擎,但某些设
备可能会因为存储容量的限制而缺少安装和语言对应的资源文件,因此在使用TTS前,得先要检查是否安装了TTS语言数据,在onCreate函数中添加以下内容:
复制到剪贴板  Java代码
1. // 检查TTS数据是否已经安装并且可 用 Intent checkIntent = new Intent(); checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA); startActivityForResult(checkIntent, REQ_TTS_STATUS_CHECK);   
这里启动一个新的Activity去检查TTS数据是否已经安装,
这 个Activity会返回如下结果之一:CHECK_VOICE_DATA_PASS或者 CHECK_VOICE_DATA_MISSING_VOLUME. , CHECK_VOICE_DATA_FAIL,CHECK_VOICE_DATA_BAD_DATA, CHECK_VOICE_DATA_MISSING_DATA,
只有第一个结果CHECK_VOICE_DATA_PASS表明TTS数据可用,其他都是数据不可用的结果,可以启动一个Activity去安装需要的TTS数据,
generated我们根据其返回的结果进行处理,如下所示:
复制到剪贴板  Java代码
1. protected void onActivityResult(int requestCode, int resultCode, Intent data) { if(requestCode == REQ_TTS_STATUS_CHECK) { switch (resultCode) { case TextToSpeech.Engine.CHECK_VOICE_DATA_PASS: // 这个返回结果表明TTS Engine可以 用 { mTts = new TextToSpeech(this, this); Log.v(TAG, "TTS Engine is installed!"); } break; case TextToSpeech.Engine.CHECK_VOICE_DATA_BAD_DATA: // 需要的语音数据已损坏 case TextToSpeech.Engine.CHECK_VOICE_DATA_MISSING_DATA: //缺少需 要语言的语音数据 case TextToSpeech.Engine.CHECK_VOICE_DATA_MISSING_VOLUME: //缺少需 要语言的发音数据 { //这三种情况都表明数据有错,重新下载安装需要的数 据 Log.v(TAG, "Need language stuff:"+resultCode); Intent dataIntent = new Intent(); dataIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA); startActivity(dataIntent); } break; case TextToSpeech.Engine.CHECK_VOICE_DATA_FAIL: // 检查失 败 default: Log.v(TAG, "Got a failure. TTS apparently not available"); break; } } else { // 其他Intent返回的结果 } }   
如果返回CHECK_VOICE_DATA_PASS表示检查成功,可以新建一个TextToSpeech实例,
public TextToSpeech (Context context, TextToSpeech.OnInitListener listener)
这里需要两个参数,一个是TTS实例运行的Context;
 
另一个是初始化接口的实现,在实例的创建过程中,如果TTS引擎没有运行的话,则会初始化TTS引擎,并且在初始化完成后调用其第二个参数listener,在这里为函数public void onInit(int status),如下所示:
复制到剪贴板  Java代码
1. public void onInit(int status) { // TODO Auto- generated method stub //TTS Engine初始化完 成 if(status == TextToSpeech.SUCCESS) { int result = mTts.setLanguage(Locale.US); // 设置发音语 言 if(result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED) // 判断语言是否可 用 { Log.v(TAG, "Language is not available"); speakBtn.setEnabled(false); } else { speakBtn.setEnabled(true); } } }   
在这个回调函数里,我们设置语言,然后就可以进行使用TTS引擎进行操作了。
 
然后,在onCreate函数中设置EditText、Button和Spinner这3个控件的使用:
复制到剪贴板  Java代码
1. inputText = (EditText)findViewById(R.id.inputText); speakBtn = (Button)findViewById(R.id.speakBtn); langSelect = (Spinner)findViewById(R.id.langSelect); inputText.setText("I love you"); speakBtn.setOnClickListener(new OnClickListener() { public void onClick(View v) { // TODO Auto- generated method stub mTts.Text().toString(), TextToSpeech.QUEUE_ADD, null); // 朗读输入框里的内容 } }); ArrayAdapter<String> adapter = new ArrayAdapter& lt;String> (this, android.R.layout.simple_spinner_item, languages); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); langSelect.setAdapter(adapter); langSelect.setSelection(0); langSelect.setOnItemSelectedListener(new OnItemSelectedListener() { public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { // TODO Auto- generated method stub int pos =&SelectedItemPosition(); int result = -1; switch (pos) { case 0: { inputText.setText("I love you"); // 设置发音语 言 result = mTts.setLanguage(Locale.US); } break; case 1: { inputText.setText("Je t'aime"); result = mTts.setLanguage(Locale.FRENCH); } break; case 2: { inputText.setText("Ich liebe dich"); result = mTts.setLanguage(Locale.GERMAN); } break; case 3: { inputText.setText("Ti amo"); result = mTts.setLanguage(Locale.ITALIAN); } break; case 4: { inputText.setText("Te quiero"); result = mTts.setLanguage(new Locale("spa", "ESP")); } break; default: break; } if(result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED) // 判断语言是否可 用 { Log.v(TAG, "Language is not available"); speakBtn.setEnabled(false);
 } else { speakBtn.setEnabled(true); } } public void onNothingSelected(AdapterView<?> arg) { // TODO Auto-generated method stub } });   

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。