Android原生的TextToSpeech,文字合成语音并播放
1、在 AndroidManifest.xml 添加配置项 ,和 Application 标签平级。
<queries><intent><action android:name="android.intent.action.TTS_SERVICE" /> 必不可少</intent></queries>
2、检查TTS数据是否已经安装并且可用
Intent checkIntent = new Intent();checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);startActivityForResult(checkIntent, REQ_TTS_STATUS_CHECK);
3、在onActivityResult 中处理返回的结果
@Overrideprotected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {super.onActivityResult(requestCode, resultCode, data);if (requestCode == REQ_TTS_STATUS_CHECK) {switch (resultCode) {case TextToSpeech.Engine.CHECK_VOICE_DATA_PASS://这个返回结果表明TTSEngine可以用
// mTts = new TextToSpeech(this, this);LogUtils.log("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: //缺少需要语言的发音数据//这三种情况都表明数据有错,重新下载安装需要的数据LogUtils.log("数据有错,重新下载安装需要的数据");Intent dataIntent = new Intent();dataIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);startActivity(dataIntent);break;case TextToSpeech.Engine.CHECK_VOICE_DATA_FAIL://检查失败LogUtils.log("检查失败");default:LogUtils.log("Got a failure. TTS apparently not available");break;}} else {LogUtils.log("其他错误----");}}
3、初始化,并设置语音播放速度,音色,语言等等;
TextToSpeech mTts = new TextToSpeech(VoiceTestActivity.this, this);mTts.setLanguage(Locale.CHINESE);mTts.setPitch(1.2f);mTts.setSpeechRate(1.2f);
4、实现TextToSpeech.OnInitListener 接口,在回调方法onInit方法中获取 TTS 初始化状态
@Overridepublic void onInit(int status) {//TTS Engine初始化完成if (status == TextToSpeech.SUCCESS) {int result = mTts.setLanguage(Locale.CHINESE);//设置发音语言if (result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED) {//判断语言是否可用LogUtils.log("语言不可用");}} else {LogUtils.log("onInit: fail: status: " + status);}}
注:这里如果出现 status:-1 的情况,可能漏掉了第一步的配置
5、文字合成语音并播放
public void speak(String text) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {mTts.speak(text, TextToSpeech.QUEUE_FLUSH, null, null); // 使用QUEUE_FLUSH清空之前的队列,重新播放新的文本} else {HashMap<String, String> params = new HashMap<>();params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "123"); // 对于旧版本Android,需要使用此参数来避免重复播放问题mTts.speak(text, TextToSpeech.QUEUE_FLUSH, params); // 使用QUEUE_FLUSH清空之前的队列,重新播放新的文本}}
6、暂停播放,销毁TTS,获取语音播放状态。Activity活动窗口销毁时,及时销毁TTS
mTts.setOnUtteranceProgressListener(new UtteranceProgressListener() {@Overridepublic void onStart(String utteranceId) {// 开始播放LogUtils.log("onStart 开始播放");}@Overridepublic void onDone(String utteranceId) {// 播放完成LogUtils.log("播放完成");}@Overridepublic void onError(String utteranceId) {// 发生错误LogUtils.log("播放,发生错误");}});@Overrideprotected void onStop() {super.onStop();if (mTts != null) {mTts.stop();mTts.shutdown();}}@Overrideprotected void onDestroy() {super.onDestroy();if (mTts != null) {mTts = null;}}
该文章仅适用于简单的文字转换成语音,并播放,android原生的TextToSpeech ;
不涉及语音识别,唤醒等等