TextToSpeech简称 TTS,主要就是将所指定的文本转成不同语言音频输出。
TTS engine依托于当前AndroidPlatform所支持的几种主要的语言:English、French、German、Italian和Spanish五大语言(暂时没有我们伟大的中文,至少Google的科学家们还没有把中文玩到炉火纯青的地步,先易后难也是理所当然。)TTS可以将文本随意的转换成以上任意五种语言的语音输出。与此同时,对于个别的语言版本将取决于不同的时区,例如:对于English,在TTS中可以分别输出美式和英式两种不同的版本(由此看出Google的做事风格真够细致,而正因为如此估计Google不加入中文的另外一种理由是中文的方言太多了)。
系统自带的 TTS 功能是不支持中文的,想要支持中文的话,需要借助第三方引擎,比如常见的科大讯飞、百度等。
1,初始化TTS
// 初始化语音播报
public static void initTTS(final Context context){
//实例化自带语音对象
textToSpeech = new TextToSpeech(context, new TextToSpeech.OnInitListener() {
@Override
public void onInit(int status) {
if (status == textToSpeech.SUCCESS) {
textToSpeech.setPitch(1.0f);//方法用来控制音调
textToSpeech.setSpeechRate(1.0f);//用来控制语速
//判断是否支持下面两种语言(英文/中文)
// int result1 = textToSpeech.setLanguage(Locale.US);
int supported= textToSpeech.setLanguage(Locale.SIMPLIFIED_CHINESE);
if ((supported != TextToSpeech.LANG_AVAILABLE) && (supported!=TextToSpeech.LANG_COUNTRY_AVAILABLE)){
Log.e("TTS", "不支持 zh-CN");
}else{
Log.e("TTS", "支持 zh-CN");
}
mIsSupport = true;
} else {
Toast.makeText(context, "语音不支持", Toast.LENGTH_SHORT).show();
mIsSupport = false;
}
}
});
}
2,播报语音
// 开始播报语音
public static void speakData(final Context context, final String data){
new Thread(new Runnable() {
@Override
public void run() {
TextToSpeechUtil.startTTS(context, data);
}
}).start();
}
// 播报文字
private static void startTTS(Context context, String data){
if (textToSpeech == null){
Toast.makeText(context, "TTS未初始化", Toast.LENGTH_SHORT).show();
return;
}
if (!mIsSupport){
Toast.makeText(context, "语音不支持", Toast.LENGTH_SHORT).show();
return;
}
if (data.isEmpty() || data=="") { // 不为空
Toast.makeText(context, "播报内容为空", Toast.LENGTH_SHORT).show();
return;
}
// //调用代码示例
// // 语言,中文
// textToSpeech.setLanguage(Locale.SIMPLIFIED_CHINESE);
// // 设置音调,值越大声音越尖(女生),值越小则变成男声,1.0是常规
// textToSpeech.setPitch(1.0f);
// // 设置语速
// textToSpeech.setSpeechRate(1.0f);
//输入中文,若不支持的设备则不会读出来
textToSpeech.speak(data, TextToSpeech.QUEUE_FLUSH,null);
textToSpeech.getDefaultEngine();
List<TextToSpeech.EngineInfo> listEngine = textToSpeech.getEngines();
for (TextToSpeech.EngineInfo it:listEngine){
textToSpeech.setEngineByPackageName(it.name);
// Log.d("startTTS", it.name);
}
}
3,释放资源
public static void releaseSpeech(){
if (textToSpeech != null) {
textToSpeech.stop(); // 不管是否正在朗读TTS都被打断
textToSpeech.shutdown(); // 关闭,释放资源
}
}