概述
- 如今,机器人崛起,而语音正是机器人的一个必要的技能,想想如果一个机器人听不懂人说的话,那它只能是机器,而不能冠以“人”之名
- 科大讯飞,想必是现在最火的一家公司之一吧,其拥有好几年的技术经验的积累,观望以前,技术的不成熟:神经网络算法的不成熟,硬件上的瓶颈,等等,这些,都让从前的科大讯飞吃尽了苦头。但是,现在却不同了,随着硬件上关键的突破,软件上的突破,机器学习,语音分析的成熟,再加上这些年来的技术积累以及数据的沉淀,科大讯飞也就迎来了她的春天。
今天我要谈的就是语音分析。总所周知,android系统是外国佬谷歌开发的,因此android系统的默认语音TextToSpeech是不支持中文的,但是现在使用android的系统有很多,使用语音功能的应用更多,尤其在国内,但是由于谷歌的限制,TextToSpeech不支持中文,科大讯飞的语音包(sdk)场景是需要收费,难道就无计可施了,今天我就带大家巧妙的绕过这些限制,实现中文语音播报功能。(不过,国内部分高版本的手机由于已经集成了科大讯飞为默认语音引擎,那么恭喜你,你可以安心使用,本文只正对部分比较老的版本android手机)
准备工作
只需要去各大应用商店下载讯飞语句安装包,安装后,把讯飞语句设置为默认引擎即可。
安装完科大讯飞语句后,话不多说,直接上代码,快速实现语音播报功能
开始编码
- 首先,我们只需要实现TextToSpeech.OnInitListener接口,并在onStart生命周期实例化TextToSpeech
@Override
protected void onStart() {
super.onStart();
if(mTextToSpeech == null){
mTextToSpeech = new TextToSpeech(this, this);
// 设置音调,值越大声音越尖(女生),值越小则变成男声,1.0是常规
mTextToSpeech.setPitch(1.0f);
//设定语速 ,默认1.0正常语速
mTextToSpeech.setSpeechRate(1.5f);
}
}
2.既然有实例化,就有回收,回收再对应的 onStop生命周期实现回收:
@Override
protected void onStop() {
super.onStop();
try{
if (mTextToSpeech != null) {
mTextToSpeech.stop(); // 不管是否正在朗读TTS都被打断
}
} catch (Exception e){
e.printStackTrace();
} finally {
mTextToSpeech.shutdown(); // 关闭,释放资源
mTextToSpeech = null;
}
}
- 有了实例化,下面就应该要mTextToSpeech大声高歌了吧,此时你会发现主要监听onInit的status是否SUCCESS,你会发现onInit回调会给我们对应的初始化状态是否成功
@Override
public void onInit(int status) {
//如果初始化成功
if (status == TextToSpeech.SUCCESS) {
canSpeck=true;
int result = mTextToSpeech.setLanguage(Locale.CHINA);
if (result == TextToSpeech.LANG_MISSING_DATA
|| result == TextToSpeech.LANG_NOT_SUPPORTED){
Toast.makeText(this,"数据丢失或不支持",Toast.LENGTH_SHORT).show();
}
}
}
我们可以在onInit方法里setLanguage为我们想要的语种,比如CHINA,本例设置的是中文。
- 正式调用speak方法,实现语音播报,这里我们就歌颂我们伟大祖国
findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e("TAG","this is can "+canSpeck);
if (mTextToSpeech != null && !mTextToSpeech.isSpeaking()) {
mTextToSpeech.speak("我爱你我的祖国,中国", TextToSpeech.QUEUE_FLUSH, null);
}
}
});
是不是感觉非常简单,自此,一个完整的语音播报功能就实现了,不管是中文还是都可以。下面给出完整的代码:
5. 完整语音播报code
public class TestSpeackActivity extends BaseActivity implements TextToSpeech.OnInitListener{
//语音播放api
private TextToSpeech mTextToSpeech;
@Override
public int getLayoutId() {
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);//设置全屏
return R.layout.activity_test_speack;
}
@Override
public void initView() {
findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e("TAG","this is can "+canSpeck);
if (mTextToSpeech != null && !mTextToSpeech.isSpeaking()) {
mTextToSpeech.speak("您好中国", TextToSpeech.QUEUE_FLUSH, null);
}
}
});
}
@Override
public void addListeners() {
}
@Override
public void onInit(int status) {
//如果初始化成功
if (status == TextToSpeech.SUCCESS) {
canSpeck=true;
int result = mTextToSpeech.setLanguage(Locale.CHINA);
if (result == TextToSpeech.LANG_MISSING_DATA
|| result == TextToSpeech.LANG_NOT_SUPPORTED){
Toast.makeText(this,"数据丢失或不支持",Toast.LENGTH_SHORT).show();
}
}
}
@Override
protected void onStart() {
super.onStart();
if(mTextToSpeech == null){
mTextToSpeech = new TextToSpeech(this, this);
// 设置音调,值越大声音越尖(女生),值越小则变成男声,1.0是常规
mTextToSpeech.setPitch(1.0f);
//设定语速 ,默认1.0正常语速
mTextToSpeech.setSpeechRate(1.5f);
}
}
@Override
protected void onStop() {
super.onStop();
try{
if (mTextToSpeech != null) {
mTextToSpeech.stop(); // 不管是否正在朗读TTS都被打断
}
} catch (Exception e){
e.printStackTrace();
} finally {
mTextToSpeech.shutdown(); // 关闭,释放资源
mTextToSpeech = null;
}
}
}
注意
要想实现语音播报功能请注意一下几点
- 对于低版本的android手机,如果没有默认讯飞语音库,而是谷歌默认的TTS语音库,请先安装讯飞语句。
- 安装后讯飞语句后,请设置系统默认语音引擎为科大讯飞。
- 在调用speak方法前,一定要确认onInit方法被成功执行,否则调用speak方法还是默认调用TTS语音库, 将不会支持中文。