原文来自于: http://www.52wulian.org/android_voice/

最近项目需要用到android语音识别,立马就想到科大讯飞,结合官方实例及阅读API文档,初步的完成了Android语音识别,下面是实现过程实录。

一、准备工作

1、你需要android手机应用开发基础

2、科大讯飞语音识别SDK android版

3、科大讯飞语音识别开发API文档

4、android手机

关于科大讯飞SDK及API文档,请到科大语音官网下载:http://open.voicecloud.cn/

当然SDK和API有多个版本可选,按照你的需要下载,其次,下载需要填写资料申请注册,申请通过或可获得Appid

二、语音识别流程

1、创建识别控件

函数原型

Public RecognizerDialog(Context context,String params)

其中Context表示当前上下文环境,传this即可

Params有参数详见API文档

2、用Appid登录到科大讯飞服务器(自动连接,需要联网)

主要用到SpeechUser(com.iflytek.speech包下)类下的getUser().login()函数

其中getUser()表示获取用户对象,可以实现用户登录,注销等操作

Login函数原型

Public boolean login(Context context,String usr,String pwd,String

参数详见API文档

3、读取语言识别语法

通过abnf文件并读取该文件,实现指定的语言识别语法,比如为了识别并计算国内两个城市之间的距离,abnf文件的内容可以是如下

Java

1

2

3

4

5

6

7

"#ABNF 1.0 gb2312;

language zh-CN;

mode voice;

root $main;

$main = $place1 到$place2 ;

$place1 = 北京 | 武汉 | 南京 | 天津 | 天京 | 东京;

$place2 = 上海 | 合肥;"

Abnf文件的读取参考后面的具体开发实例

4、设置识别参数及识别监听器

通过RecognizerDialog下的setEngine()方法设置参数

函数原型

public void setEngine(String engine,String params,String grammar)

详细的参数请参考API文档

5、识别结果回调

需要实现RecognizerDialogListener接口,其中有两个方法需要重写,分别是

1)public void onResults(ArrayList results,boolean isLast)

其中result是RecognizerResult对象的集合,RecognizerResult的属性有

String text 识别文本

Int confidence 识别可信度

2)public void onEnd(SpeechError error)

6、识别结果处理(自行处理)

自己将文本进行处理。

三、详细开发过程

1、新建Android项目

和普通的android项目一样,只是需要加入科大讯飞语言SDK包,主要包括

Msc.jar及libmsc.so动态库文件,项目lib截图

2、布局

这里只进行简单的布局,只设置一个按钮作为语言识别按钮及一个文本组件用作显示识别结果,布局文件如下

XHTML

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

xmlns:tools="http://schemas.android.com/tools"

android:orientation="vertical"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:paddingBottom="@dimen/activity_vertical_margin"

android:paddingLeft="@dimen/activity_horizontal_margin"

android:paddingRight="@dimen/activity_horizontal_margin"

android:paddingTop="@dimen/activity_vertical_margin"

android:background="@drawable/color"

tools:context=".MainActivity">

android:id="@+id/voice"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:layout_marginTop="100dp"

android:src="@drawable/voice"/>

android:id="@+id/result"

android:layout_height="wrap_content"

android:layout_marginTop="50dp"

android:layout_gravity="center_vertical"

android:layout_width="fill_parent"

android:text="提示:请说出你所在的城市"/>

3、识别语法文件

这里只是简答的识别所说的城市名,其中指定了“北京”、“上海”、“广州”、“深圳”、“厦门”

Java

1

2

3

4

5

6

7

#ABNF1.0gb2312;

language zh-CN;

mode voice;

root$main;

$main=$where;

$where=北京|上海|广州|深圳|厦门;

4、MainActivity程序

代码如下,请参考上面的语言识别流程

Java

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

packagecom.example.androidclient;

importjava.io.InputStream;

importjava.util.ArrayList;

importcom.iflytek.speech.RecognizerResult;

importcom.iflytek.speech.SpeechError;

importcom.iflytek.speech.SpeechListener;

importcom.iflytek.speech.SpeechUser;

importcom.iflytek.ui.RecognizerDialog;

importcom.iflytek.ui.RecognizerDialogListener;

importandroid.os.Bundle;

importandroid.app.Activity;

importandroid.content.SharedPreferences;

importandroid.view.Menu;

importandroid.view.View;

importandroid.view.View.OnClickListener;

importandroid.widget.ImageView;

importandroid.widget.TextView;

importandroid.widget.Toast;

publicclassMainActivityextendsActivity{

//组件

privateImageView voice=null;

privateTextView result=null;

privateToast mToast=null;

//语音识别

privatefinalStringAPP_ID="514fb8d7";

privatefinalstaticStringKEY_GRAMMAR_ID="grammar_id";

privateRecognizerDialog recognizerDialog=null;

privateStringgrammarText=null;

privateStringgrammarID=null;

@Override

protectedvoidonCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);

super.setContentView(R.layout.activity_main);

this.voice=(ImageView)super.findViewById(R.id.voice);

this.result=(TextView)super.findViewById(R.id.result);

//初始化识别

mToast=Toast.makeText(this,"",Toast.LENGTH_SHORT);

mToast.setMargin(0f,0.2f);

recognizerDialog=newRecognizerDialog(this,"appid="+APP_ID);

SpeechUser.getUser().login(this,null,null,"appid="+APP_ID,loginListener);

// 读取保存的语法ID

SharedPreferences preference=this.getSharedPreferences("abnf",MODE_PRIVATE);

grammarID=preference.getString(KEY_GRAMMAR_ID,null);

grammarText=readAbnfFile();

this.voice.setOnClickListener(newVoice());

}

privateclassVoiceimplementsOnClickListener{

@Override

publicvoidonClick(Viewv){

MainActivity.this.voice.setImageResource(R.drawable.voicelight);

recognizerDialog.setListener(mRecoListener);

recognizerDialog.setEngine(null,"grammar_type=abnf",grammarText);

recognizerDialog.show();

}

}

//语音识别用户登录监听器

privateSpeechListener loginListener=newSpeechListener()

{

@Override

publicvoidonData(byte[]arg0){

}

@Override

publicvoidonEnd(SpeechError error){

if(error!=null)

{

mToast.setText("登录失败");

mToast.show();

}

else

{

mToast.setText("登录成功");

mToast.show();

}

}

@Override

publicvoidonEvent(intarg0,Bundle arg1){

}

};

//读取语音识别语法

privateStringreadAbnfFile()

{

intlen=0;

byte[]buf=null;

Stringgrammar="";

try{

InputStream in=getAssets().open("gm_continuous_digit.abnf");

len=in.available();

buf=newbyte[len];

in.read(buf,0,len);

grammar=newString(buf,"gb2312");

}catch(Exception e1){

e1.printStackTrace();

}

returngrammar;

}

//识别结果回调

privateRecognizerDialogListener mRecoListener=newRecognizerDialogListener()

{

@Override

publicvoidonResults(ArrayListresults,booleanisLast){

Stringtext="";

text=results.get(0).text;

mToast.setText("识别结果为:"+text);

mToast.show();

result.setText("识别结果为:"+text);

}

@Override

publicvoidonEnd(SpeechError error){

MainActivity.this.voice.setImageResource(R.drawable.voice);

}

};

}

5、给程序相应的权限

XHTML

1

2

3

4

5

6

由于本程序用到了网络、麦克风等,需要给定一下权限

6、结果截图

四、项目文件及android程序下载

转:基于科大讯飞语音API语音识别开发详解相关推荐

  1. 基于证书的WCF安全开发详解

    基于证书的WCF安全开发详解 前几天成功建立起了一套基于证书的安全的WCF服务,很兴奋,现在做一下总结,希望大侠们指点,也希望能帮助到一些菜鸟,哈哈. 一.安全通信的基本过程 这里只做定性的理论上的分 ...

  2. Android语音识别开发详解(基于讯飞语音SDK)

    一.准备工作 1.你需要android手机应用开发基础 2.科大讯飞语音识别SDK android版 3.科大讯飞语音识别开发API文档 4.android手机 关于科大讯飞SDK及API文档,请到科 ...

  3. 基于S32K144 CAN总线功能开发详解

    最近换了一份工作,初次接触NXP S32K144 MCU,刚好负责开发CAN协议栈及应用功能的开发,开发过程遇到过一些问题,网上资料也不是那么全,于是自己总结了一下自己的开发经验,希望对初次接触的小白 ...

  4. EasyPR中文开源车牌识别系统 开发详解

     在上篇文档中作者已经简单的介绍了EasyPR,现在在本文档中详细的介绍EasyPR的开发过程. 正如淘宝诞生于一个购买来的LAMP系统,EasyPR也有它诞生的原型,起源于CSDN的taotao ...

  5. JavaCV开发详解专栏文章目录(JavaCV速查手册)

    本章作为**JavaCV开发详解**专栏的目录. 为了方便大家分类查找,我们把分为两个目录: 第一个分类目录,根据文章技术类型进行分类. 第二个目录,按照博主更新顺序排列. 有些文章既是设备采集又实现 ...

  6. 基于Java的音频转发服务器_javaCV开发详解之5:录制音频(录制麦克风)到本地文件/流媒体服务器(基于javax.sound、javaCV-FFMPEG)...

    javaCV系列文章: 补充篇: 前言:本篇文章基于javaCV-FFMPEG,关于javaCV官方是没有文档或者api文档可以参考的,所以还有很多地方需要研究: 本章对于ffmpeg的需要有一定了解 ...

  7. Linux设备驱动开发详解 第3版 (即 Linux设备驱动开发详解 基于最新的Linux 4 0内核 )前言

    Linux从未停歇脚步.Linus Torvalds,世界上最伟大的程序员之一,Linux内核的创始人,Git的缔造者,仍然在没日没夜的合并补丁,升级内核.做技术,从来没有终南捷径,拼的就是坐冷板凳的 ...

  8. 《Linux设备驱动开发详解(第3版)》(即《Linux设备驱动开发详解:基于最新的Linux 4.0内核》)进展同步更新

    本博实时更新<Linux设备驱动开发详解(第3版)>的最新进展. 目前已经完成稿件. 2015年8月9日,china-pub开始上线预售: http://product.china-pub ...

  9. 《Android游戏开发详解》一2.18 使用Java API中的对象

    本节书摘来异步社区<Android游戏开发详解>一书中的第2章,第2.18节,译者: 李强 责编: 陈冀康,更多章节内容可以访问云栖社区"异步社区"公众号查看. 2.1 ...

最新文章

  1. 蓝牙模块引起电路干扰
  2. windows下使用自带certutil工具校验文件MD5、SHA1、SHA256
  3. 对于计算机系统结构 下列,计算机系统结构模拟试题
  4. Algs4-1.4.8计算输入文件中相等的整数对的数量
  5. 7系统启动到一半停止_太突然!国际饮料巨头计划狂砍一半品牌,这些饮料就快喝不到了…...
  6. (优秀文章保存)Quartz优秀文章保存
  7. python制作简单网页_python 跑服务器,访问自己制作的简单页面
  8. 贪心——雪糕的最大数量(Leetcode 1833)
  9. 【操作系统】线程的实现-思维导图
  10. 【答题卡识别】基于matlab Hough变换答题卡识别【含Matlab源码 250期】
  11. GD32系列总结 - 前言
  12. Moore-Penrose广义逆矩阵
  13. 十年互联网 十个风云人物
  14. java完成九宫格数独_简单实现java数独游戏
  15. 【零知识证明】数独解的例子解释零知识证明
  16. 团队成员筛选的核心秘档:三否三拒三不动
  17. 转自随风飘荡自由飞翔 SQL技巧:快速把握一些异常精妙的SQL语句
  18. VS2017如何设置C++11?
  19. Field ‘recordID‘ doesn‘t have a default value
  20. 使用python绘制奥运五环

热门文章

  1. 函数进阶---闭包/装饰器/迭代器/生成器---高级特性
  2. 国家哲学社会科学文献中心
  3. 关于win10 使用eclipse如何配置环境变量
  4. 【前端图表】echarts散点图鼠标划过散点显示信息
  5. Assets和Raw区别
  6. Flask jQuery ajax
  7. 谷歌技术三宝之BigTable(转)
  8. CCF201612-5 卡牌游戏(募集解题代码)
  9. HDU2188 选拔志愿者【巴什博弈】
  10. HDU1166 敌兵布阵【树状数组】