最近在做Android语音播报功能(TTS),现总结如下:(ps:demo代码地址:https://github.com/giserlong/TTS_DEMO)
一.Android原生接口
用Android原生接口TextToSpeech,简单易用,但是一般情况下不支持中文,需自己下载讯飞语音+ 等中文引擎,并设置为系统默认tts,方可正常播报中文,关键代码如下:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_native); //初始化TTS tts = new TextToSpeech(this, this); //获取控件 speechText = (EditText)findViewById(R.id.speechTextView); speechButton = (Button)findViewById(R.id.speechButton); //为button添加监听 speechButton.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v){ // TODO Auto-generated method stub tts.speak(speechText.getText().toString(), TextToSpeech.QUEUE_FLUSH, null); } }); } @Override public void onInit(int status){ // 判断是否转化成功 if (status == TextToSpeech.SUCCESS){ //tts.getCurrentEngine(); //默认设定语言为中文,原生的android貌似不支持中文。 int result = tts.setLanguage(Locale.CHINA); if (result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED){ tts.setLanguage(Locale.US); Toast.makeText(this,"不支持中文,已自动设置为英文",Toast.LENGTH_SHORT).show(); Log.d("ss",""); }else{ Toast.makeText(this,"已自动设置为中文",Toast.LENGTH_SHORT).show(); Log.d("ss",""); } } }
二.百度离在线融合SDK
注册百度智能云开发者账号后,添加语音合成应用,填写包名等相关信息后,生成key及APPID等信息:
激活SDK需此关键信息,还需下载对应SDK,并添加至项目中,引用相关jar包,添加对应so库至asset
关键代码如下:
package com.yupont.www.myapplication; import android.content.Context; import android.os.Environment; import com.baidu.tts.client.SpeechSynthesizer; import com.baidu.tts.client.SpeechSynthesizerListener; import com.baidu.tts.client.TtsMode; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; /** * <p>文件描述:<p> * <p>作者:Mark<p> * <p>创建时间:2019/5/23<p> * <p>更改时间:2019/5/23<p> * <p>版本号:1<p> */ public class BaiDuSpeechUtil { private final String TAG = this.getClass().getSimpleName(); private SpeechSynthesizer mSpeechSynthesizer; private String mSampleDirPath; private static final String SAMPLE_DIR_NAME = "baiduTTS"; //-------以下全是在assets下的文件,使用离线时必须全部copy到手机中方可使用----start-- private static final String SPEECH_FEMALE_MODEL_NAME = "bd_etts_common_speech_f7_mand_eng_high_am-mix_v3.0.0_20170512.dat"; private static final String SPEECH_MALE_MODEL_NAME = "bd_etts_common_speech_m15_mand_eng_high_am-mix_v3.0.0_20170505.dat"; private static final String TEXT_MODEL_NAME = "bd_etts_text.dat"; private static final String ENGLISH_SPEECH_FEMALE_MODEL_NAME = "bd_etts_speech_female_en.dat"; private static final String ENGLISH_SPEECH_MALE_MODEL_NAME = "bd_etts_speech_male_en.dat"; private static final String ENGLISH_TEXT_MODEL_NAME = "bd_etts_text_en.dat"; //--------end------------------------------------------------------------- private static BaiDuSpeechUtil baiDuSpeechUtil = null; public static BaiDuSpeechUtil getInstance(){ if(baiDuSpeechUtil == null) { synchronized (BaiDuSpeechUtil.c