认识 TTS
扫描二维码
随时随地手机看文章
1.TTS定义
TextToSpeech简称 TTS,称为语音合成,是Android 从1.6版本开始支持的新功能,能将所指定的文本转成不同语言音频输出,文字转语音(text-to-speech,TTS)系统是将一般语言的文字转换为语音。
TTS功能需要有TTS Engine的支持,下面我们就来了解下android提供的TTS Engine。
Android使用了叫Pico的支持多种语言的语音合成引擎,Pico在后台负责把分析输入的文本,把分本分成他能识别的各个片段,再把合成的各个语音片段以听起来比较自然的方式连接在一起,这个过程Android系统帮我们做,我们只把他当做一个神奇的过程就可以了。
TTS engine依托于当前 Android Platform 所支持的几种主要的语言: English 、 French 、 German 、 Italian 和Spanish 五大语言 (暂时也是没有对中文提供支持)。 TTS可以将文本随意的转换成以上任意五种语言的语音输出。与此同时,对于个别的语言版本将取决于不同的时区,例如:对于 English ,在 TTS 中可以分别输出美式和英式两种不同的版本 。
2.语音合成历史
早在17世纪就有法国人研发机械式的说话装置。直到19世纪,贝尔实验室对于电子语音合成技术的研究,才开启近代语音合成技术的发展。贝尔实验室在1939年制作出第一个电子语音合成器VODER,是一种利用共振峰原理所制作的合成器。
1960年,瑞典语言学家G. Fant则提出利用线性预测编码技术(LPC)来作为语音合成分析技术,并推动了日后的发展。后来1980年代Moulines E和Charpentier F提出新的语音合成算法PSOLA,此技术可以合成比较自然的语音。
3.TTS 实例 ( 了解 Android 的 TTS 使用方法 )
要求:在文本框中输入英文句子,点击按钮然后朗读出来。
框架:
1.先用 startActivityForResult() 检查 TTS 数据是否已经安装并且可用
2.用 onInit()实现TTS初始化接口
3.实现按钮的 OnClickListener() 接口, 接口中调用 speak(inputText.getText().toString(), TextToSpeech.QUEUE_ADD, null) 朗读输入框里的内容.
Java代码:
package com.example.androidttsdemo1; import java.util.Locale; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.speech.tts.TextToSpeech; import android.speech.tts.TextToSpeech.OnInitListener; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; public class MainActivity extends Activity implements OnInitListener { /** * Called when the activity is first created. */ private EditText inputText = null; private Button speakBtn = null; private static final int REQ_TTS_STATUS_CHECK = 0; private static final String TAG = "TTS Demo"; private TextToSpeech mTts; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.fragment_main); //检查TTS数据是否已经安装并且可用 Intent checkIntent = new Intent(); 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("This is an example of speech synthesis."); speakBtn.setOnClickListener(new OnClickListener() { public void onClick(View v) { // TODO Auto-generated method stub mTts.speak(inputText.getText().toString(), TextToSpeech.QUEUE_ADD, null); //朗读输入框里的内容 } }); } //实现TTS初始化接口 @Override 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 { mTts.speak("This is an example of speech synthesis.", TextToSpeech.QUEUE_ADD, null); speakBtn.setEnabled(true); } } } 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返回的结果 } } @Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); if (mTts != null) //activity暂停时也停止TTS { mTts.stop(); } } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); //释放TTS的资源 mTts.shutdown(); } }
下面简单介绍下上面代码中和TTS相关的一些API使用。
1. 首先是实现OnInitListener这个接口,这个接口中只有一个抽象函数void onInit(int status),在TextToSpeech引擎初始化完成后调用,在这个函数里就可以根据状态status(为TextToSpeech.SUCCESS或者TextToSpeech.Error)判断TTS初始化成功与否进行相应的操作。
2. 接着在使用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);
3. 当数据可用时,就可以创建一个TextToSpeech实例,
public TextToSpeech (Context context, TextToSpeech.OnInitListener listener)
这里需要两个参数,一个是TTS实例运行的Context;
另一个是初始化接口的实现,在实例的创建过程中,如果TTS引擎没有运行的话,则会初始化TTS引擎,并且在初始化完成后调用其第二个参数listener。
4. 有了TextToSpeech实例,接下来就可以对文本进行语音合成并发音了,对应的API为
public int speak (String text, int queueMode, HashMap