科大讯飞语音云使用经历

下载好了之后 将

按照文档导入包: Msc.Jar,  libmsc.so.

导入后 第一步:注册

在程序入口处初始化 SDK  

SpeechUtility.createUtility(this, "appid=53fd96ce");

这个初始化的是文字转语音的对象 

mTts = SpeechSynthesizer.createSynthesizer(this, mTtsInitListener); // 初始化合成对象

mTtsInitListener 对象就是初始化的时候监听,当初始化成功之后就代表你现在可是使用语音功能了

private InitListener mTtsInitListener = new InitListener() {

@Override

public void onInit(int code) {

Log.e("合成监听监听", "InitListener init() code = " + code);

if (code == ErrorCode.SUCCESS) {

btnWZ.setEnabled(true);

text.setText("可以进行识别文字(文字转声音)\n");

btnSY.setEnabled(true);

text.append("可以进行识别声音(声音转文字)\n");

}

}

};

然后下一步,对于合成对象 进行相关属性的设置。

还有一些其他属性可以参考API文档进行理解和添加。这里就不详细说明了。

// 设置合成

if (mEngineType.equals(SpeechConstant.TYPE_CLOUD)) {

mTts.setParameter(SpeechConstant.ENGINE_TYPE,

SpeechConstant.TYPE_CLOUD);

} else {

mTts.setParameter(SpeechConstant.ENGINE_TYPE,

SpeechConstant.TYPE_LOCAL);

}


// 设置发音人

mTts.setParameter(SpeechConstant.VOICE_NAME, voicer);


// 设置语速

mTts.setParameter(SpeechConstant.SPEED, "50");


// 设置音调

mTts.setParameter(SpeechConstant.PITCH, "50");


// 设置音量

mTts.setParameter(SpeechConstant.VOLUME, "50");


// 设置播放器音频流类型

mTts.setParameter(SpeechConstant.STREAM_TYPE, "3");


之后就进行上传你要转录的文本和监听接口了

int code = mTts.startSpeaking(context, mTtsListener);

context:是要合成的文字 

code:就是最后的结果了 如果是0 就代表了正常了。如果不为零就代表出现了错误,具体的值所代表的意思可参考ErrorCode类来对照。

new SpeechError(code).getPlainDescription(true)

可以使用上面的那段代码 将code 转换成文本,错误的文本。

mTtsListener
/**

* 合成回调监听。

*/

private SynthesizerListener mTtsListener = new SynthesizerListener() {

@Override

public void onSpeakBegin() {

showTip("开始播放");

}


@Override

public void onSpeakPaused() {

showTip("暂停播放");

}


@Override

public void onSpeakResumed() {

showTip("继续播放");

}


@Override

public void onBufferProgress(int percent, int beginPos, int endPos,

String info) {

mPercentForBuffering = percent;

upProgressBar();

}


@Override

public void onSpeakProgress(int percent, int beginPos, int endPos) {

mPercentForPlaying = percent;

upProgressBar();

}


@Override

public void onCompleted(SpeechError error) {

if (error == null) {

showTip("播放完成");

} else if (error != null) {

showTip(error.getPlainDescription(true));

}

}

};

其中的showTip ()方法只是我的一个回调显示的方法,可根据自己的需求自定义设置。

其中的 onBufferProgress 方法返回的是数据缓存的长度, 最大100 这个数据是从网络进行识别之后传递过来的数据

onSpeakProgress 播放的长度,当前播放进度, 最大值也是100



文字转语音也就上面的那些内容了。



语音转文字:




<span style="font-size:12px;">mIat = SpeechRecognizer.createRecognizer(this, mTtsInitListener);

iatDialog = new RecognizerDialog(this, mTtsInitListener);</span>



其中的这个iatDialog 方法就是讯飞自己的语音交互界面了。 会弹出一个麦克风的dialgo并带有动画。,能根据我的声音大小进行动画。

第二步那个就是一个初始化监听。这个上面有介绍



第三步就是设置属性了 设置mIat的属性




// 设置语言

mIat.setParameter(SpeechConstant.LANGUAGE, "en_us");

// 设置语言

mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn");

// 设置语言区域

mIat.setParameter(SpeechConstant.ACCENT, "mandarin");

// 设置语音前端点

mIat.setParameter(SpeechConstant.VAD_BOS, "4000");

// 设置语音后端点

mIat.setParameter(SpeechConstant.VAD_EOS, "1000");

// 设置标点符号

mIat.setParameter(SpeechConstant.ASR_PTT, "1");

// 设置音频保存路径

mIat.setParameter(SpeechConstant.ASR_AUDIO_PATH,

"/sdcard/my/luyin.pcm");


设置完成之后就可以点击按钮进行录制了

点击按钮 按钮上的方法写:




iatDialog.setListener(recognizerDialogListener);

iatDialog.show();



监听方法 recognizerDialogListener




/**

* 听写UI监听器

*/

private RecognizerDialogListener recognizerDialogListener = new RecognizerDialogListener() {

public void onResult(RecognizerResult results, boolean isLast) {

String text = JsonParser.parseIatResult(results.getResultString());

edit.append(text);

edit.setSelection(edit.length());

}


/**

* 识别回调错误.

*/

public void onError(SpeechError error) {

showTip(error.getPlainDescription(true));

}


};


其中的onResult()方法会不断的回调,因为语音识别是一个字一个字识别并发送过来的。当然也有是一个词的形式发送过来。这个时候

我们就需要通过它来进行识别了

这个JsonParser类是直接从 讯飞提供的Demo中复制的。 




public class JsonParser {


public static String parseIatResult(String json) {

StringBuffer ret = new StringBuffer();

try {

JSONTokener tokener = new JSONTokener(json);

JSONObject joResult = new JSONObject(tokener);


JSONArray words = joResult.getJSONArray("ws");

for (int i = 0; i < words.length(); i++) {

// 转写结果词,默认使用第一个结果

JSONArray items = words.getJSONObject(i).getJSONArray("cw");

JSONObject obj = items.getJSONObject(0);

ret.append(obj.getString("w"));

// 如果需要多候选结果,解析数组其他字段

// for(int j = 0; j < items.length(); j++)

// {

// JSONObject obj = items.getJSONObject(j);

// ret.append(obj.getString("w"));

// }

}

} catch (Exception e) {

e.printStackTrace();

}

return ret.toString();

}


public static String parseGrammarResult(String json) {

StringBuffer ret = new StringBuffer();

try {

JSONTokener tokener = new JSONTokener(json);

JSONObject joResult = new JSONObject(tokener);


JSONArray words = joResult.getJSONArray("ws");

for (int i = 0; i < words.length(); i++) {

JSONArray items = words.getJSONObject(i).getJSONArray("cw");

for(int j = 0; j < items.length(); j++)

{

JSONObject obj = items.getJSONObject(j);

if(obj.getString("w").contains("nomatch"))

{

ret.append("没有匹配结果.");

return ret.toString();

}

ret.append("【结果】" + obj.getString("w"));

ret.append("【置信度】" + obj.getInt("sc"));

ret.append("\n");

}

}

} catch (Exception e) {

e.printStackTrace();

ret.append("没有匹配结果.");

}

return ret.toString();

}

}




然后有人要说了 如果没有使用讯飞提供的语音交互界面,那应该怎么写? 

简单

在按钮的处理方法中将上面的显示iatDialog给替换成下面的代码就可以了。




int ret = mIat.startListening(recognizerListener);

if (ret != ErrorCode.SUCCESS) {




<span style="font-size:14px;">/**

* 听写监听器。

*/

private RecognizerListener recognizerListener = new RecognizerListener() {


@Override

public void onBeginOfSpeech() {

showTip("开始说话");

}


@Override

public void onError(SpeechError error) {

showTip(error.getPlainDescription(true));

}


@Override

public void onEndOfSpeech() {

showTip("结束说话");

}


@Override

public void onEvent(int eventType, int arg1, int arg2, String msg) {


}


@Override

public void onResult(RecognizerResult results, boolean isLast) {

String text = JsonParser.parseIatResult(results.getResultString());

edit.append(text);

edit.setSelection(edit.length());

if (isLast) {

// TODO 最后的结果

}

}


@Override

public void onVolumeChanged(int volume) {

showTip("当前正在说话,音量大小:" + volume);

}


};</span>

大概就这样了。

总结一下: 使用第三方的SDK 都不是一件麻烦的事情,只要你去看看API和Demo 就能往自己的项目中套了。

这个讯飞语音识别,也不复杂。

第一个 注册SDK 将你申请到的APPID给赋值进去。  (所有的第三方 SDK都有这个要求)

第二步 根据你的需要来创建指定的对象。 

创建对象的时候绑定一个InitListener接口。来检测 创建是否成功。

第三步 给对象设置基本属性

第四步 对象开始工作。

第五步给工作的对象添加回调接口,实时了解对象工作状态。

第六步 根据对象的状态来写各种不同的提示和说明。就是个交互的过程了。

--------------------- 本文来自 Zswx98 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/zy987654zy/article/details/38899795?utm_source=copy

猜你喜欢

转载自blog.csdn.net/qq_36652619/article/details/82869685