今天来用下科大讯飞的语音功能,代码也非常的简单,在讯飞官方API文档中都写的非常清楚。今天主要实现讯飞里面的
语音识别
和语音合成
两个功能。
准备工作
- 需要在讯飞官网注册或登录后
- 打开控制平台,创建自己的应用,会得到一个Appid,这个id会用到,如下图:
- 下载SDK, 将下载后的zip解压然后打开libs如图:
- 如使用讯飞语音UI的话,需要将下载SDK中的assets文件夹拷贝到项目中。最终项目结构就是这样的如图:
-
好了准备条件都做完了,接下来就开始实际的编码开发
代码编写
这里由于xml文件代码比较简单就不贴出来了,只贴功能实现代码
1. 添加权限
<!--连接网络权限,用于执行云端语音能力 -->
<uses-permission android:name="android.permission.INTERNET" />
<!--获取手机录音机使用权限,听写、识别、语义理解需要用到此权限 -->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<!--读取网络信息状态 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!--获取当前wifi状态 -->
<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" />-->
2.语音听写
初始化识别对象 ,在Activity创建时进行初始化
// 初始化识别对象 注意:“=”和自己appid中间不要有字符串和字符
SpeechUtility.createUtility(this, SpeechConstant.APPID + "=自己的Appid");
初始化RecognizerDialog对象,在点击Button的时候调用下面代码就OK了
public void initSpeech() {
//1.创建RecognizerDialog对象
RecognizerDialog recognizerDialog = new RecognizerDialog(mIChatView.getContext(), null);
//2.设置accent、language等参数
recognizerDialog.setParameter(SpeechConstant.LANGUAGE, "zh_cn");//语种,这里可以有zh_cn和en_us
recognizerDialog.setParameter(SpeechConstant.ACCENT, "mandarin");//设置口音,这里设置的是汉语普通话 具体支持口音请查看讯飞文档,
recognizerDialog.setParameter(SpeechConstant.TEXT_ENCODING, "utf-8");//设置编码类型
//其他设置请参考文档http://www.xfyun.cn/doccenter/awd
//3.设置讯飞识别语音后的回调监听
recognizerDialog.setListener(new RecognizerDialogListener() {
@Override
public void onResult(RecognizerResult recognizerResult, boolean b) {//返回结果
if (!b) {
// Log.i("讯飞识别的结果", recognizerResult.getResultString());
mTextView.showSpeak(parseJsonVoice(recognizerResult.getResultString()));
}
}
@Override
public void onError(SpeechError speechError) {//返回错误
Log.e("返回的错误码", speechError.getErrorCode() + "");
}
});
//显示讯飞语音识别视图
recognizerDialog.show();
解析语音json
private String parseJsonVoice(String resultString) {
JSONObject jsonObject = JSON.parseObject(resultString);
JSONArray jsonArray = jsonObject.getJSONArray("ws");
StringBuffer stringBuffer = new StringBuffer();
for (int i = 0; i < jsonArray.size(); i++) {
JSONObject jsonObject1 = jsonArray.getJSONObject(i);
JSONArray jsonArray1 = jsonObject1.getJSONArray("cw");
JSONObject jsonObject2 = jsonArray1.getJSONObject(0);
String w = jsonObject2.getString("w");
stringBuffer.append(w);
}
Log.i("识别结果", stringBuffer.toString());
return stringBuffer.toString();
}
//上面是用到fastjson来解析的需要在gradle添加包
compile 'com.alibaba:fastjson:1.2.8'
3.语音合成
点击Button,调用下面方法将EditText文字传入要要合成语音的地方就OK了
public void initSpeechCompound() {
SpeechSynthesizer mTts = SpeechSynthesizer.createSynthesizer(this, null);
mTts.setParameter(SpeechConstant.VOICE_NAME, "xiaohua");//设置发音人
mTts.setParameter(SpeechConstant.SPEED, "50");//设置语速
mTts.setParameter(SpeechConstant.VOLUME, "50");//设置音量,范围0~100
mTts.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD);//设置云端
// mTts.setParameter(SpeechConstant.TTS_AUDIO_PATH,"./sdcard/iflytek.pcm");//声音保存路径,可以自定义
mTts.startSpeaking("这里就是你要传入合成语音的文字", mSynListener);//开始合成
}
private SynthesizerListener mSynListener = new SynthesizerListener() {
@Override
public void onSpeakBegin() {
//开始播放
}
@Override
public void onBufferProgress(int i, int i1, int i2, String s) {
//缓冲进度回调
}
@Override
public void onSpeakPaused() {
//暂停播放
}
@Override
public void onSpeakResumed() {
//恢复播放回调接口
}
@Override
public void onSpeakProgress(int i, int i1, int i2) {
//播放进度回调
}
@Override
public void onCompleted(SpeechError speechError) {
//会话结束回调接口
}
@Override
public void onEvent(int i, int i1, int i2, Bundle bundle) {
//会话事件回调接口
}
};
好了,看了语音识别听写和语音合成是不是感觉很简单,大家有兴趣也可以尝试下讯飞的其他功能吧。
感谢大家的阅读,谢谢~