最近在做项目中有一个需求就是要将语音转化为文字,所以就选择使用了讯飞语音,教程虽然看起开来简单,可是里面的坑还是有的,搞了半天才算完工。
首先,在讯飞平台登录,然后在产品服务那块选择在线语音合成,然后点击使用服务,创建你的应用,注意:应用名要与你的本地应用名义一致,然后就可以选择你想下载的SDK。下载完之后进行解压,把文件中的libs文件夹下的Jar包放到你的项目的jar包,然添加一下。在main目录下创建名字为jniLibs文件,再把除了Jar包的其他文件放到这个目录下。在清单配置文件添加相对应的权限:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
<uses-permission android:name="android.permission.LOCATION_HARDWARE"/>
接下来开始写代码:
(1)初始化语音引擎:
SpeechUtility.createUtility(this, SpeechConstant.APPID + "=你当时创建应用的appid");
(2)设置参数:
SpeechRecognizer mIat = SpeechRecognizer.createRecognizer(this, null);
mIat.setParameter(SpeechConstant.DOMAIN, "iat");
mIat.setParameter(SpeechConstant.LANGUAGE, "zh_ch");//中文
mIat.setParameter(SpeechConstant.ACCENT, "mandarin");//普通话
参数的设置可以参考它提供的使用手册,在你下载的doc文件夹中。
(3)开始语音:
mIat.startListening(mListener);
这里需要传入一个监听,代码为:
private RecognizerListener mListener = new RecognizerListener() {
//转化结果 isLast:true表示语音结束
@Override
public void onResult(RecognizerResult result, boolean isLast) {
Log.i("TAG", "onResult: " + result.getResultString());
Log.i("TAG", "onResult: 哈哈哈哈哈");
}
//语音音量 :i:音量
@Override
public void onVolumeChanged(int i, byte[] bytes) {
}
//开始
@Override
public void onBeginOfSpeech() {
Log.i("TAG", "onBeginOfSpeech: ");
}
//结束
@Override
public void onEndOfSpeech() {
Log.i("TAG", "onEndOfSpeech: ");
}
//会话发生错误
@Override
public void onError(SpeechError speechError) {
Log.e("TAG", "onError: "+speechError.toString());
}
//留给扩展用的
@Override
public void onEvent(int i, int i1, int i2, Bundle bundle) {
}
};
每个方法的作用都对应有注释。
我们还可以使用它提供给我们的语音交互弹窗动画,初始化步骤跟前面一样:
//UI交互动画
RecognizerDialog iatDialog=new RecognizerDialog(this,initListner);
iatDialog.setParameter(SpeechConstant.DOMAIN, "iat");
iatDialog.setParameter(SpeechConstant.LANGUAGE, "zh_ch");
iatDialog.setParameter(SpeechConstant.ACCENT, "mandarin");
iatDialog.setListener(dialogListner);
iatDialog.show();
其中RecognizerDialog传入的第二个参数是初始化监听,可以不用在实现做任何操作为:
InitListener initListner=new InitListener() {
@Override
public void onInit(int i) {
}
};
dialogListener是交互的监听:
RecognizerDialogListener dialogListner=new RecognizerDialogListener() {
@Override
public void onResult(RecognizerResult result, boolean isLast) {
Log.i("SENDI", "onResult: "+result.getResultString());
}
@Override
public void onError(SpeechError speechError) {
Log.i("TAG", "onError: "+speechError.getMessage());
}
};
关于语音转文字获得的数据视为Json格式的,所以可以根据它返回的数据模型进行相应的封装和解析。
我的解析是这样的:
先将封装成一个对象
/**
* 语音信息
* Created by Administrator on 2017/5/25.
*/
public class VoiceData {
/**
* sn : 2
* ls : true
* bg : 0
* ed : 0
* ws : [{"bg":0,"cw":[{"sc":0,"w":"小花"}]},{"bg":0,"cw":[{"sc":0,"w":"猫"}]},{"bg":0,"cw":[{"sc":0,"w":"。"}]}]
*/
private List<WsBean> ws;
public List<WsBean> getWs() {
return ws;
}
public void setWs(List<WsBean> ws) {
this.ws = ws;
}
public static class WsBean {
/**
* bg : 0
* cw : [{"sc":0,"w":"小花"}]
*/
private List<CwBean> cw;
@Override
public String toString() {
return "WsBean{" +
"cw=" + cw +
'}';
}
public List<CwBean> getCw() {
return cw;
}
public void setCw(List<CwBean> cw) {
this.cw = cw;
}
public static class CwBean {
/**
* sc : 0.0
* w : 小花
*/
private String w;
public String getW() {
return w;
}
public void setW(String w) {
this.w = w;
}
@Override
public String toString() {
return "CwBean{" +
"w='" + w + '\'' +
'}';
}
}
}
@Override
public String toString() {
return "VoiceData{" +
"ws=" + ws +
'}';
}
}
然后用Gson将数据转成该对象:
public static String getWord(String result){
Gson gson=new Gson();
VoiceData vData=gson.fromJson(result, VoiceData.class);
StringBuffer sb=new StringBuffer();
for (VoiceData.WsBean ws : vData.getWs()) {
for (VoiceData.WsBean.CwBean cw: ws.getCw()) {
sb.append(cw.getW());
}
}
return sb.toString();
}
附上使用时各个错误的 编码表