TextToSpeech是什么?
文本转语音
优点
安卓原生提供TextToSpeech,无需集成,直接使用,很方便
缺点
1.目前只支持22种语言,经过实际测试,中文支持并不是十分友好
2.系统要求在LOLLIPOP(21)及以上版本,但现在的设备基本都可以满足。如果是低版本的想要实现播报,可以SoundPool实现
使用
1.一般是在onCreate()中执行
speech = new TextToSpeech(this, this);
2.实现TextToSpeech.OnInitListener ,复写onInit()方法
public void onInit(int status) {
if (status == TextToSpeech.SUCCESS) {
//设置语言
int result = speech.setLanguage(Locale.CHINA);
if (result == TextToSpeech.LANG_MISSING_DATA
|| result == TextToSpeech.LANG_NOT_SUPPORTED) {
Toast.makeText(this, "数据丢失或不支持", Toast.LENGTH_SHORT).show();
}
// 设置音调,值越大声音越尖(女生),值越小则变成男声,1.0是常规
speech.setPitch(0.2f);
// 设定语速,默认1.0正常语速
speech.setSpeechRate(0.5f);
}
}
3.完成以上步骤后,就可调用speak(),播报内容了
speech.speak(string, TextToSpeech.QUEUE_FLUSH, null, null);
4.播报完成,或者页面结束时,释放资源
speech.stop(); // 不管是否正在朗读TTS都被打断
speech.shutdown(); // 关闭,释放资源
5.扩展内容(播报内容保存音频文件)
在 Android 5.0 及更高版本中,使用 synthesizeToFile() 方法将文本转换为语音,并指定要保存的文件名和位置。
在 Android 4.4 及更低版本中,使用 synthesizeToFile() 方法,并传递一个包含 KEY_PARAM_UTTERANCE_ID 的 Map 对象,以确保语音转换完成后会调用 onUtteranceCompleted() 方法。
/**
* 生成音频文件
* @param text 播报内容
* @param fileName 音频文件名
*/
private void generateAudio(String text, String fileName) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
speech.synthesizeToFile(text, null, new File(getCacheDir().getPath(), fileName), null);
} else {
HashMap<String, String> map = new HashMap<>();
map.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "MessageId");
speech.synthesizeToFile(text, map, new File(getCacheDir().getPath(), fileName).getAbsolutePath());
}
}
注意:
android11 使用TTS文字转语音的能力声明
<!--android11 使用TTS文字转语音的能力声明-->
<queries>
<intent>
<action android:name="android.intent.action.TTS_SERVICE"/>
</intent>
</queries>