1.首先你要做的事情,打开讯飞开放平台,下载SDK(地址:http://www.xfyun.cn/sdk/dispatcher),平台上面的服务有很多种,根据项目的需求下载,下载前会让你先    创建一个应用,完后会生成一个唯一的appid。

2.这里以语音听写为例。(虽然是免费的,但是有次数限制,开发使用测试还可以,但是用户量多的还是建议购买服务)。

SDK下载完成之后解压出来,我们需要用到的有三样东西armeab文件夹里的libmsc.so库Msc.jar和Sunflower.jar,这三个放进去就OK了。

3.讯飞还为我们提供了一套语音听写的UI,如果选择使用的话,需要将刚才解压的SDK资源包assets路径下的资源文件拷贝到项目的asstes下(没有的话自己建一个)。

4.接下来看代码怎么实现,开放平台上面有开发文档,但是其实我不建议参考那个,因为SDK里面有demo,你只需要找到入口就可以,根据线索看下去,不一会儿就搞定了。

第一步:权限(只管拷贝进去就好了)

<uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.INTERNET" />
    <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.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

第二步:调用SpeechUtility.createUtility(this, "appid=" + getString(R.string.app_id)); 初始化创建对象,可以放在项目的application里面初始化,也可以在使用的时候初始化。

不然会报错:"创建对象失败,请确认 libmsc.so 放置正确,且有调用 createUtility 进行初始化"

接下来就把代码贴上去,带注释应该就能看懂了 。

在oncreat中的代码

mIat = SpeechRecognizer.createRecognizer(this, mInitListener);//这个是没有UI功能的,但是有Toast提示

mIatDialog = new RecognizerDialog(this, mInitListener);// 初始化听写Dialog,如果只使用有UI听写功能,无需创建SpeechRecognizer,这里我两个都做了,选择性使用

recognizerDialog = new RecognizerDialog(this, mInitListener);
     sharedPreferences = getSharedPreferences(PREFER_NAME, Activity.MODE_PRIVATE);
     spedit = sharedPreferences.edit();
     btStart = (Button) findViewById(R.id.btStart);
     btStart.setOnClickListener(this);
     editText = (EditText) findViewById(R.id.editText);
     toggleButton1 = (ToggleButton) findViewById(R.id.toggleButton1);
     toggleButton1.setChecked(isShowDialog);

上面这一堆代码没有什么可读性,UI开关按钮还有显示控件等。

@Override
public void onClick(View v) {
if( null == mIat )
{
// 创建单例失败,与 21001 错误为同样原因,参考 http://bbs.xfyun.cn/forum.php?mod=viewthread&tid=9688
Toast.makeText(getApplicationContext(), "创建对象失败,请确认 libmsc.so 放置正确,且有调用 createUtility 进行初始化", Toast.LENGTH_LONG).show();
return;
}
switch (v.getId()) {

case R.id.btStart:

editText.setText(null);
mIatResults.clear();
// 设置参数
setParam();
if (toggleButton1.isChecked()) {
// 显示听写对话框
mIatDialog.setListener(mRecognizerDialogListener);
mIatDialog.show();
Toast.makeText(this, "请开始说话", Toast.LENGTH_LONG).show();
} else {
ret = mIat.startListening(mRecognizerListener);
if (ret != ErrorCode.SUCCESS) {
Toast.makeText(this, "听写失败,错误码:" + ret, Toast.LENGTH_LONG).show();
} else {
Toast.makeText(this, "请开始说话", Toast.LENGTH_LONG).show();
}
}
break;
default:
break;
}
}

  /**
* 听写UI监听器
*/

private RecognizerDialogListener mRecognizerDialogListener = new RecognizerDialogListener() {
public void onResult(RecognizerResult results, boolean isLast) {
printResult(results);
}

/**
* 识别回调错误.
*/
public void onError(SpeechError error) {
if(mTranslateEnable && error.getErrorCode() == 14002) {
Toast.makeText(getApplicationContext(), error.getPlainDescription(true)+"\n请确认是否已开通翻译功能", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(getApplicationContext(), error.getPlainDescription(true), Toast.LENGTH_LONG).show();
}
}
};

//设置参数

public void setParam() 
{
// 清空参数
mIat.setParameter(SpeechConstant.PARAMS, null);

// 设置听写引擎
mIat.setParameter(SpeechConstant.ENGINE_TYPE, mEngineType);
// 设置返回结果格式
mIat.setParameter(SpeechConstant.RESULT_TYPE, "json");

String lag = sharedPreferences.getString("iat_language_preference",  
"mandarin");  
if (lag.equals("en_us")) {  
// 设置语言  
mIat.setParameter(SpeechConstant.LANGUAGE, "en_us");  
} else {  
// 设置语言  
mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn");  
// 设置语言区域  
mIat.setParameter(SpeechConstant.ACCENT, lag);  
}

// 设置语音前端点:静音超时时间,即用户多长时间不说话则当做超时处理  
mIat.setParameter(SpeechConstant.VAD_BOS, sharedPreferences.getString("iat_vadbos_preference", "4000"));

// 设置语音后端点:后端点静音检测时间,即用户停止说话多长时间内即认为不再输入, 自动停止录音  
mIat.setParameter(SpeechConstant.VAD_EOS, sharedPreferences.getString("iat_vadeos_preference", "1000"));

// 设置标点符号,设置为"0"返回结果无标点,设置为"1"返回结果有标点  
mIat.setParameter(SpeechConstant.ASR_PTT, sharedPreferences.getString("iat_punc_preference", "1"));

// 设置音频保存路径,保存音频格式支持pcm、wav,设置路径为sd卡请注意WRITE_EXTERNAL_STORAGE权限  
// 注:AUDIO_FORMAT参数语记需要更新版本才能生效  
mIat.setParameter(SpeechConstant.AUDIO_FORMAT,"wav");  
mIat.setParameter(SpeechConstant.ASR_AUDIO_PATH, Environment.getExternalStorageDirectory()+"/msc/iat.wav");  
}

//这个是没有UI界面的听写监听器

/**
* 听写监听器。
*/
private RecognizerListener mRecognizerListener = new RecognizerListener() {

@Override
public void onBeginOfSpeech() {
// 此回调表示:sdk内部录音机已经准备好了,用户可以开始语音输入
Toast.makeText(getApplicationContext(), "开始说话", Toast.LENGTH_LONG).show();
}

@Override
public void onError(SpeechError error) {
// Tips:
// 错误码:10118(您没有说话),可能是录音机权限被禁,需要提示用户打开应用的录音权限。
// 如果使用本地功能(语记)需要提示用户开启语记的录音权限。
if(mTranslateEnable && error.getErrorCode() == 14002) {
Toast.makeText(getApplicationContext(), error.getPlainDescription(true)+"\n请确认是否已开通翻译功能", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(getApplicationContext(), error.getPlainDescription(true), Toast.LENGTH_LONG).show();
}
}

@Override
public void onEndOfSpeech() {
// 此回调表示:检测到了语音的尾端点,已经进入识别过程,不再接受语音输入
Toast.makeText(getApplicationContext(), "结束说话", Toast.LENGTH_SHORT).show();
Log.e("TAG", "结束说话");
}

@Override
public void onResult(RecognizerResult results, boolean isLast) {
printResult(results);
if (isLast) {
// TODO 最后的结果
}
}

@Override
public void onVolumeChanged(int volume, byte[] data) {
// Toast.makeText(getApplicationContext(), "当前正在说话,音量大小:" + volume, Toast.LENGTH_LONG).show();
Log.e("TAG", "当前正在说话,音量大小:" + volume);
}

@Override
public void onEvent(int eventType, int arg1, int arg2, Bundle obj) {
}
};

//最终结果

private void printResult(RecognizerResult results) {
String text = JsonParser.parseIatResult(results.getResultString());
String sn = null;
// 读取json结果中的sn字段
try {
JSONObject resultJson = new JSONObject(results.getResultString());
sn = resultJson.optString("sn");
} catch (JSONException e) {
e.printStackTrace();
}
mIatResults.put(sn, text);

StringBuffer resultBuffer = new StringBuffer();
for (String key : mIatResults.keySet()) {
resultBuffer.append(mIatResults.get(key));
}
editText.setText(resultBuffer.toString());//这儿是最终识别到的文字,显示在textview上面
editText.setSelection(editText.length());
}

项目集成语音识别(科大讯飞)相关推荐

  1. MiniDao普通项目集成方案

    2019独角兽企业重金招聘Python工程师标准>>> MiniDao普通项目集成方案 1.导入必要的jar包: 2.spring配置文件增加如下配置: <!-- Hibern ...

  2. 项目集成自动分词系统ansj,实现自定义词库

    一,分词系统地址:https://github.com/NLPchina/ansj_seg 二,为什么选择ansj? 1.项目需求: 我们平台要做手机售后的舆情分析,即对购买手机的用户的评论进行分析. ...

  3. 论:CMMI项目集成管理(IPM)

    项目集成管理方法 一.建立项目集成管理的过程和方针 1. 建立方针:我们组织的过程方针描述中,有对项目集成管理方针的描述. 2. 建立过程:依据组织的过程流程.裁剪指南:结合项目特性,裁剪得出项目过程 ...

  4. Spring/Spring Boot微服务项目 集成Druid 实现监控功能

    为什么80%的码农都做不了架构师?>>>    步骤如下: 1.首先新建2个model(LogInfo,MonitorInfo) public class LogInfo imple ...

  5. shiro教程(4)-shiro与项目集成开发

    1 shiro与项目集成开发 这里我们主要以用户登录的例子来演示,先给出一个时序图: 点击打开链接(点击查看) 1.1 shiro与spring web项目整合 shiro与springweb项目整合 ...

  6. springboot项目集成docker

    文章目录 一.docker常用命令 0.拉取镜像到本地仓库 1.查看所有镜像 2.创建一个新的容器并运行,返回的是容器的ID -- CONTAINER ID: 3.查看运行中的docker实例 4.查 ...

  7. 基于 abp vNext 和 .NET Core 开发博客项目 - 集成Hangfire实现定时任务处理

    基于 abp vNext 和 .NET Core 开发博客项目 - 集成Hangfire实现定时任务处理 转载于:https://github.com/Meowv/Blog 接下来,将完成一个任务调度 ...

  8. spring 项目集成配置_Spring重试–与项目集成的方式

    spring 项目集成配置 如果您需要在代码中实现健壮的重试逻辑,一种行之有效的方法是使用spring重试库. 我的目的不是要展示如何使用spring retry项目本身,而是要演示将其集成到代码库中 ...

  9. web 项目集成福昕_项目学生:Web服务集成

    web 项目集成福昕 这是Project Student的一部分. 其他帖子包括带有Jersey的 Web服务 客户端,带有Jersey的 Web服务服务器 , 业务层 , 具有Spring数据的持久 ...

最新文章

  1. Spring 依赖注入(二、注入参数)
  2. php中static和self的区别
  3. python爬虫cookie池 与ip绑定_Python爬虫防封ip的一些技巧
  4. ajax传值controller怎么写,ajax向 controller传值(示例代码)
  5. R-apply()函数
  6. 【初学者必读】:前端工程师的知识体系
  7. 网页中嵌入JavaScript+事件触发程序
  8. 计算机未来发展的5个前景,学习成绩普通,高考志愿填报不妨考虑这5个专业,未来发展很不错...
  9. mysql教程丿it教程网_1.0MySQL基础入门【DQL部分】
  10. 数据提取、转换和加载 - ETL工具
  11. Atitit. Atiposter 发帖机 新特性 poster new feature   v7 q39
  12. Android PDF阅读
  13. 让你提前认识软件开发(3):学校C语言教材的缺陷
  14. 51单片机温控风扇仿真原理图 C语言程序,51单片机智能温控风扇程序
  15. 《华为研发》阅读 - 11 (中研部组织结构)
  16. 经济学中的同比环比,负增长,正增长
  17. EM(expection maxium)算法
  18. 海康威视2022内推 内推码
  19. 承接家谱制作-多少代都可以
  20. 循序渐进实现仿QQ界面(三):界面调色与控件自绘

热门文章

  1. 【K8S 二】搭建Docker Registry私有仓库(自签发证书+登录认证)(K8S和非K8S环境下)
  2. android 自定义表情包,快速打造 Android 自定义表情库
  3. linux硬盘调度总结,Linux 调度总结
  4. R语言中使用非凸惩罚函数回归(SCAD、MCP)分析前列腺数据
  5. Springboot在线问答社区系统 毕业设计-附源码061628
  6. css3动画效果和3D模型
  7. 信息管理系统平台html加css漂亮后台模板
  8. 输出比较功能中的pwm以及其他功能的区分
  9. git rm删除文件或目录,如何恢复
  10. 安装完Anaconda后,在命令行输入python会出现warning