Android 系统里内置了PicoTTS,遗憾的是不支持中文。我们可以安装讯飞语记TTS,中文就不是问题了。
调用起来简单方便,直接使用tts对象调用speak即可。其中speak函数的参数如下:
public int speak(final String text, final int queueMode, final HashMap params) {
return runAction(new Action()
text 需要转成语音的文字
queueMode 队列方式:
QUEUE_ADD:播放完之前的语音任务后才播报本次内容
QUEUE_FLUSH:丢弃之前的播报任务,立即播报本次内容
params 设置TTS参数,可以是null。
KEY_PARAM_STREAM:使用哪个音频通道,可以是:STREAM_MUSIC、STREAM_NOTIFICATION、STREAM_RING等
KEY_PARAM_VOLUME:音量大小,0-1f
返回值:
/**
* Denotes a successful operation.
*/
public static final int SUCCESS = 0;
/**
* Denotes a generic operation failure.
*/
public static final int ERROR = -1;
注意使用shutdown()及时释放不用的TTS资源。
以下是Demo源码:
package com.zms.ttsdemo;
import java.util.Locale;
import android.app.Activity;
import android.os.Bundle;
import android.speech.tts.TextToSpeech;
import android.speech.tts.TextToSpeech.OnInitListener;
import android.view.View;
import android.widget.Button;
public class MainActivity extends Activity {
private TextToSpeech tts;
private Button btnSpeak;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnSpeak = (Button) findViewById(R.id.btnSpeak);
btnSpeak.setOnClickListener(new MyOnClickListener());
tts = new TextToSpeech(this, new MyOnInitialListener());
}
class MyOnInitialListener implements OnInitListener {
@Override
public void onInit(int status) {
// tts.setEngineByPackageName("com.iflytek.vflynote");
tts.setLanguage(Locale.CHINESE);
}
}
class MyOnClickListener implements View.OnClickListener {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnSpeak:
tts.speak("你好,我是TTS", TextToSpeech.QUEUE_FLUSH, null);
break;
default:
break;
}
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (tts != null) { // 关闭TTS引擎
tts.shutdown();
}
}
}
相关源码:
frameworks\base\core\java\android\speech\tts\TextToSpeech.java