Unity 接讯飞离线语音识别
Unity 接入讯飞离线SDK , 有一些坑记录一下。在开发者平台注册之后,申请应用,下载SDK包。这个sdk包和你的appid是对应的,不能使用别人的sdk包,然后用自己的appid这是SDK文件夹,sample是一个示例工程,将libs文件中jar文件放入AndroidStudio中的libs中新建jni文件夹,然后放入对应so文件文件夹中assets文件放入An...
·
Unity 接入讯飞离线SDK , 有一些坑记录一下。
在开发者平台注册之后,申请应用,下载SDK包。这个sdk包和你的appid是对应的,不能使用别人的sdk包,然后用自己的appid
这是SDK文件夹,sample是一个示例工程,将libs文件中jar文件放入AndroidStudio中的libs中
新建jni文件夹,然后放入对应so文件
文件夹中assets文件放入AndroidStudio assets文件,res中的iat文件也放进去
代码部分简单讲一下:
SpeechUtility.createUtility(context,SpeechConstant.APPID + "=" + id);
SpeechRecognizer mIat = SpeechRecognizer.createRecognizer(context, mInitListener);
这是初始化识别,mInitListener是初始化回调,主要方便问题调试。
public void setParam(){
// 清空参数
mIat.setParameter(SpeechConstant.PARAMS, null);
String lag = "mandarin";
// 设置引擎
mIat.setParameter(SpeechConstant.ENGINE_TYPE, mEngineType);
// 设置返回结果格式
mIat.setParameter(SpeechConstant.RESULT_TYPE, "json");
mIat.setParameter(ResourceUtil.ASR_RES_PATH, getResourcePath());
//设置语言,目前离线听写仅支持中文
if (lag.equals("en_us")) {
// 设置语言
mIat.setParameter(SpeechConstant.LANGUAGE, "en_us");
mIat.setParameter(SpeechConstant.ACCENT, null);
}else {
// 设置语言
mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
// 设置语言区域
mIat.setParameter(SpeechConstant.ACCENT,lag);
}
// 设置语音前端点:静音超时时间,即用户多长时间不说话则当做超时处理
mIat.setParameter(SpeechConstant.VAD_BOS, "4000");
// 设置语音后端点:后端点静音检测时间,即用户停止说话多长时间内即认为不再输入, 自动停止录音
mIat.setParameter(SpeechConstant.VAD_EOS, "2000");
// 设置标点符号,设置为"0"返回结果无标点,设置为"1"返回结果有标点
mIat.setParameter(SpeechConstant.ASR_PTT, "0");
mIat.setParameter(SpeechConstant.AUDIO_SOURCE, "-1");
// 设置音频保存路径,保存音频格式支持pcm、wav,设置路径为sd卡请注意WRITE_EXTERNAL_STORAGE权限
// mIat.setParameter(SpeechConstant.AUDIO_FORMAT,"wav");
// mIat.setParameter(SpeechConstant.ASR_AUDIO_PATH, Environment.getExternalStorageDirectory()+"/msc/iat.wav");
}
private String getResourcePath(){
StringBuffer tempBuffer = new StringBuffer();
//识别通用资源
tempBuffer.append(ResourceUtil.generateResourcePath(context, ResourceUtil.RESOURCE_TYPE.assets, "iat/common.jet"));
tempBuffer.append(";");
tempBuffer.append(ResourceUtil.generateResourcePath(context, ResourceUtil.RESOURCE_TYPE.assets, "iat/sms_16k.jet"));
//识别8k资源-使用8k的时候请解开注释
return tempBuffer.toString();
}
这是设置识别的对应参数,讯飞文档里面有详细介绍的 , 还有一个函数是获取离线资源路径
public void Recognize(byte[] data)
{
mIat.startListening(mRecognizerListener);
mIat.writeAudio(data, 0, data.length);
mIat.stopListening();
}
private RecognizerListener mRecognizerListener = new RecognizerListener() {
@Override
public void onBeginOfSpeech() {
callback.Start();
}
@Override
public void onError(SpeechError error) {
}
@Override
public void onEndOfSpeech() {
}
@Override
public void onResult(RecognizerResult results, boolean isLast) {
String text = JsonParser.parseIatResult(results.getResultString());
if(isLast) {
callback.RecognizeSuccess(text);
}
}
@Override
public void onVolumeChanged(int volume, byte[] data) {
}
@Override
public void onEvent(int eventType, int arg1, int arg2, Bundle obj) {
}
};
这是识别函数,传入Unity中声音的byte[] ,然后下面是一个回调函数。
Unity 中AudioClip转byte[]可以参考我之前的文章这里
AndroidStudio要导出aar包,然后放入Unity中,这部分之前也有写
更多推荐
已为社区贡献1条内容
所有评论(0)