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

2023-05-16

原文来自于: 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截图

android_voice1.jpg

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_voice2.png

android_voice3.png

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

转:基于科大讯飞语音API语音识别开发详解 的相关文章

  • python查看鼠标坐标方法

    python查看鼠标坐标方法 该方法主要是在制作简单的游戏脚本时 用于获取点击参数时使用 span class token keyword import span pymouse span class token keyword print
  • "=="和equals方法有什么区别?

    61 61 操作符专门用来比较两个变量的值是否相等 xff0c 也就是用于比较变量所对应的内存中所存储的数值是否相同 比较两个引用变量 所指向的内存地址是否相同 xff0c 要比较两个基本类型的数据或两个引用变量是否相等 xff0c 只能用
  • HTTP协议状态码的含义

    1 xff1a 请求收到 xff0c 继续处理 2 xff1a 操作成功收到 xff0c 分析 接受 3 xff1a 完成此请求必须进一步处理 4 xff1a 请求包含一个错误语法或不能完成 5 xff1a 服务器执行一个完全有效请求失败
  • oracle客户端访问服务器端

    oracle客户端访问服务器端 xff0c 在本地是很容易的 xff0c 但是要实现远程访问却有一点小麻烦 xff0c 主要是如何连接远程服务器的问题 xff0c 关于这个问题请参照上一篇转载的文章 xff0c 本文主要讲解 xff0c 如
  • classpath , path , java_home的作用

    CLASSPATH是什么 xff1f 它的作用是什么 xff1f 它是javac编译器的一个环境变量 它的作用与import package关键字有关 当你写下improt java util 时 xff0c 编译器面对import关键字时
  • HQL

    hql HQL查询 xff1a Criteria查询对查询条件进行了面向对象封装 xff0c 符合编程人员的思维方式 xff0c 不过HQL Hibernate Query Language 查询提供了更加丰富的和灵活的查询特性 xff0c
  • HDFS操作常用的Shell命令;

    向HDFS中上传任意本地文件 hadoop fs copyFromLocal URI f 如果文件存在 xff0c 则覆盖 从本地文件系统考贝到集群上 向一个已经存在的HDFS中的文本文件中 xff0c 追加本地文件的内容到HDFS原有文件
  • JS如何使用多个相同ID

    39 id 61 39 43 xff49 xff44 43 39 39 show 即可
  • 【开源硬件篇】STM32F103C8T6核心板

    STM32F103C8T6核心板 文章目录 STM32F103C8T6核心板一 STM32F103C8T6芯片1 1 STM32F103C8T6简介1 2 芯片引脚说明 二 去耦电路2 1 原理图设计2 2 原理分析2 2 1 结论2 2
  • python-markdown语法

    python的markdown扩展 xff0c 功能较为丰富 xff0c 里面甚至集成了一些 rST style 的命令 极大的扩展了文章的表现力 也有第三方扩展 64 Officially Supported Extensions Ext
  • 请求方式为post时SpringMVC无法直接跳转页面

    2020年3月24日补充 这种问题不存在于thymeleaf模板 使用thymeleaf模板后再后台直接跳转也是可以的 html页面 错误示范 报错 正确示范 起因 今天在学如何搭建简单的SpringSecurity时准备先搭建一个简单的s
  • Ubuntu 20使用devstack快速安装openstack最新版

    OpenStack介绍 openstack详细介绍及常用命令请查看此文 通过devstack部署OpenStack xff0c 官方文档点击此处查看 安装环境 工具 xff1a VMware Workstation 16 Pro 操作系统
  • windows 10 内置ubuntu 开启以及应用

    刚到新公司最不习惯的就是公司用的windows xff0c 用了两年的linux 突然之间用windows 是件很痛苦的事情 xff0c 不过win 10 很好的解决了我的问题 xff0c 最新版的 Windows 10 Insider P
  • python中exp函数如何实现指数计算?

    之前小编向大家介绍过python中的对数函数log函数 xff08 https www py cn jishu jichu 21780 html xff09 xff0c 对于有点复杂的计算 xff0c 我们是可以通过计算机来帮我们解决的 例
  • 1、stf二次开发-环境配置-node8安装

    1 stf二次开发 环境配置 node8安装 Contes7 X64 linux系统 stf二次开发 环境配置 node8安装 1 新建一个node文件夹用于安装node span class token function mkdir sp
  • 0、stf二次开发-解决CentOS网络问题

    0 stf二次开发 解决CentOS网络问题 stf二次开发 解决CentOS网络问题 转载 xff1a https www cnblogs com zhouheblog p 10442274 html
  • 32、取一个整数a从右端开始的4~7位

    32 取一个正整数a从右端开始的4 xff5e 7位 程序分析代码实现 程序分析 可以考虑两种实现方法 方法1 将合理的整数转换为字符串 span class token comment 方法1 转换为字符串处理 span span cla
  • 0、stf二次开发-CentOS-环境变量如何配置

    stf二次开发 CentOS 环境变量如何配置 需要root用户下执行以下代码 打开环境配置文件 gedit etc profil 在文本最下边添加需要配置的环境 span class token builtin class name ex
  • 1、stf二次开发-环境配置-adb安装

    1 stf二次开发 环境配置 adb安装 1 进入到想要安装adb的目录 span class token builtin class name cd span 想要安装的的目录 新建一个android目录并进入 span class to
  • 1、stf二次开发-环境配置-rethinkdb安装

    1 stf二次开发 环境配置 rethinkdb安装 此篇针对CentOS7的安装 xff0c 其他系统请参考rethinkdb官网 参考官网 span class token function sudo span span class t

随机推荐

  • 0、stf二次开发-CentOS-基础配置

    0 stf二次开发 CentOS 基础配置 使用centOS时需要用到命令 configure make make install 使用以上命令需要安装make vim gcc 即C 43 43 yum y span class token
  • 1、stf二次开发-环境配置-GraphicsMagick安装

    1 stf二次开发 环境配置 GraphicsMagick安装 1 下载GraphicsMagick tar gz压缩包 xff0c 放到自己要安装的目录 2 解压压缩包 GraphicsMagick 1 3 26 tar gz根据自己的压
  • github加速接口

    https github com
  • 交叉编译libX11

    0 前言 本文探索如何将libX11移植到ARM开发板 1 源码 从参考资料 1 或这里下载相关源码 xff0c 本文下载源码为 xff1a libX11 1 5 0 tar bz2 新建一个src目录 xff0c 并且将源码解压到其中 x
  • 2021-03-14

    题目描述 This past fall Farmer John took the cows to visit a corn maze But this wasn t just any corn maze it featured severa
  • java工具类 文件zip压缩 base64 加密,base64解密 zip解压

    代码 xff1a package com cfam utils import java io BufferedOutputStream import java io ByteArrayInputStream import java io B
  • Deno编译踩坑记(Mac环境)

    前言 最近入坑Deno xff0c 第一步肯定是从编译开始 xff0c 然后踩坑了 xff0c 记录一下 xff5e 常规编译 xff1a 1 安装rust curl proto 39 61 https 39 tlsv1 2 sSf htt
  • Debian下磁盘挂载及开机启动设置教程

    检查磁盘空间即剩余情况 本文是在实际使用过程中真实操作 xff0c 用于交流和学习 xff1b 1 使用fdisk l 命令查看当前磁盘的大小 xff0c 其中 dev sda磁盘发现并未使用 xff1b 使用时 xff0c 需要切换到ro
  • HC-06蓝牙模块

    主机 xff1a 用于向从机下发指令 xff0c 能够搜索从机并主动建立连接的一方 从机 xff1a 用于接收主机下发的命令 xff0c 不能主动建立连接 xff0c 只能等别人连接自己 xff08 HC 06只能工作在从机模式下 xff0
  • JAVA回文数的判断

    回文数 xff1a 如121 xff0c 1221这样正着和倒着读都一样的数叫做回文数 xff0c 代码的主要思路是先将用户输入的数字倒过来后再与原来的数进行判断 难点 xff1a 将用户输入的数字倒过来 上代码 xff1a package
  • IOS+openfire 即时通讯

    最近看到很多人在琢磨ios即时通讯这块 xff0c 于是出去好奇 xff0c 决定动手试试 xff0c 今天就先从xmpp这个框架来尝试 其实xmpp也就一个协议而已 xff0c 更多人还是喜欢把它叫做Jabber 首先还是提供一下下载地址
  • webpack进行js打包,引入js

    node中html引入jquery可以用webpack进行打包 webpack 3可以打包 xff0c webpack 4 打包需要安装webpack cli xff0c 否则会报错 直接引入js会报错 语法错误 xff0c 浏览器不支持E
  • iOS中UICollectionView(集合视图)的使用

    1 简单介绍与说明 简介 UICollectionView提供了一种自定义布局展示试图内容的方式 说明 涉及到的必须的基本类型与基本代理类型有UICollectionView UICollectionViewCell UICollectio
  • iOS表视图之增删单元格

    要进行单元格的修改 xff0c 首先我们要删除原来的视图并从对象库中拖曳一个Navigation Controller视图 xff08 导航控制器 xff09 到设计页面 xff0c 添加Navigation Controller视图的同时
  • 史上最全IOS的touch事件手势使用方法

    以下内容源于本人整理 部分来源于网络 如有侵权行为或错误之处还望指正 请联系邮箱huiyutianshi 64 qq com 关于touch事件的 手势和事件都是基于UIRrsponder的 UIResponder包含所有的响应事件 触摸
  • vtk 显示效果设置

    在vtk中 xff0c 显示样式的显示 xff0c 是通过vtkProperty来控制的 xff0c 这里介绍三种基本的属性设置方式 xff0c 点方式 xff0c 网格方式和面方式 xff0c 这里以 头像三角网格的显示为例介绍其显示 其
  • Qt 线程(一) Qt 多线程实现的两种方式 线程实现详解

    简述两种实现方式 Qt提供了一个管理线程的类 xff1a QThread 子类化QThread并重新实现run 使用worker object通过QObject moveToThread将它们移动到线程中 简介QThread类 一 公共槽函
  • 1000以内的完数

    题目 xff1a 一个数如果恰好等于它的因子之和 xff0c 这个数就称为 完数 例如 xff0c 6的因子为1 2 3 xff0c 而6 61 1 43 2 43 3 xff0c 因此6是 完数 编程找出1000之内的所有完数 xff0c
  • 自适应参数的DE算法——JADE,L-SHADE

    目录 JADELSHADE参考文献 最近复写一个DE 1 xff08 差分进化算法 xff09 参数的自适应策略的变体L SHADE 2 xff08 CEC冠军算法 xff09 的matlab版本 xff0c 发现其提出的自适应策略对DE改
  • 转:基于科大讯飞语音API语音识别开发详解

    原文来自于 xff1a http www 52wulian org android voice 最近项目需要用到android语音识别 xff0c 立马就想到科大讯飞 xff0c 结合官方实例及阅读API文档 xff0c 初步的完成了And