我是靠谱客的博主 体贴超短裙,这篇文章主要介绍Android 百度语音识别(详细步骤+源码)前言正文,现在分享给大家,希望可以做个参考。

前言

因为项目中用到了语音识别的技术,但是项目源码我不能公开,所以,重新写一个简单的集成教程,不喜可不看,不做键盘侠,文明你我他。
效果图
在这里插入图片描述
识别结果
在这里插入图片描述
最终效果
在这里插入图片描述

源码在文章最后,不需要下载积分什么的,哪种方式太恶心了。另外请用自己的手机运行,别用任何的虚拟机和模拟器。

正文

下面是详细步骤,不漏过任何一个细节,力求让你一步到位

① 创建平台应用

既然使用了百度语音,自然免不了要注册该平台的账号,否则凭什么让你使用,点击百度智能云进入,没有账号的可以先注册账号,注册应该就不用我讲解了吧?这里默认都有账号了,然后登录
在这里插入图片描述
然后左侧导航栏点击找到语音技术
在这里插入图片描述
然后会进入一个应用总览页面,
在这里插入图片描述
然后点击创建应用
在这里插入图片描述
在这里插入图片描述
立即创建
在这里插入图片描述
点击查看应用详情
在这里插入图片描述
这几个值都是等下项目中要用的,请注意,最好是复制粘贴,不要手打,上图中有一个下载SDK,点击进入下载页面,第一个就是
在这里插入图片描述
点击下载到本地,下载之后是一个压缩文件,解压之后先不用管它,然后在Android Studio里面创建一个项目

② 创建Android项目并配置

在这里插入图片描述
在这里插入图片描述
这时候你运行到自己的手机上,如果出现Hello World!,就说明你这个项目没有问题。哎呀~不得了啊!你真是一个百年不遇的代码奇才! 继续啊!
File → New → Import Module…
在这里插入图片描述
通过上面的步骤,插入一个模块进来
在这里插入图片描述
在这里插入图片描述
点击OK

在这里插入图片描述
很明显,我找到了,你呢?找到了就找到了,说个????啊,人格分裂 继续啊,点击Finish 就会在你当前的项目中加入这个模块,与app是平级的。
在这里插入图片描述
这里就是在加载模块中的文件了,加载完毕之后,你可以打开settings.gradle,会发现多了一个 ‘:core’,当然这是在工程中加入了这个模块。
在这里插入图片描述
还要在你的app里面加入这个才能使用,
加入的方法有两个,

1. 手动选择

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
点击OK,然后再点击一次OK
在这里插入图片描述
模块已经添加进来了,当然这样比较繁琐,还有更简单的办法下面可以自动添加依赖。

2. 自动添加依赖

在这里插入图片描述
找到app下面的build.gradle配置文件,在dependencies闭包下,加入

复制代码
1
2
implementation project(path: ':core')

然后右上角点击 Sync 同步到项目中

下面修改core的AndroidManifest.xml文件中的APP_ID、API_KEY、SECRET_KEY,以及添加权限,里面的值修改为之前在平台注册应用生成的值。

复制代码
1
2
3
4
5
6
7
8
9
10
11
<uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 蓝牙录音使用,不需要可以去除 --> <uses-permission android:name="android.permission.BROADCAST_STICKY" /> <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

在这里插入图片描述
在这里插入图片描述
改好之后,请注意,每个人都是不一样,你如果发现你创建的应用的配置的值和我创建的是一模一样的,你马上去百度提BUG,他们的程序员要就要下岗了~

OK,现在配置也完成了,接下来就是使用了。

③ 使用

首先是修改
在这里插入图片描述
布局修改的代码如下:

复制代码
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
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:gravity="center" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <TextView android:gravity="center" android:id="@+id/tv_txt" android:padding="20dp" android:textColor="#000" android:text="识别到的内容" android:layout_width="match_parent" android:layout_height="wrap_content"/> <Button android:id="@+id/btn_stop" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:text="停止" /> <Button android:id="@+id/btn_start" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:text="开始" /> </LinearLayout>

说道语音识别自然要用到这个麦克风,这个权限是需要动态申请的。

复制代码
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
/** * android 6.0 以上需要动态申请权限 */ private void initPermission() { String permissions[] = {Manifest.permission.RECORD_AUDIO, Manifest.permission.ACCESS_NETWORK_STATE, Manifest.permission.INTERNET, Manifest.permission.WRITE_EXTERNAL_STORAGE }; ArrayList<String> toApplyList = new ArrayList<String>(); for (String perm : permissions) { if (PackageManager.PERMISSION_GRANTED != ContextCompat.checkSelfPermission(this, perm)) { toApplyList.add(perm); } } String tmpList[] = new String[toApplyList.size()]; if (!toApplyList.isEmpty()) { ActivityCompat.requestPermissions(this, toApplyList.toArray(tmpList), 123); } } /** * 权限申请回调,可以作进一步处理 * @param requestCode * @param permissions * @param grantResults */ @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { // 此处为android 6.0以上动态授权的回调,用户自行实现。 }

得到权限之后就可以进行下一步了,首先是初始化控件以及语音是被的核心SDK

复制代码
1
2
3
4
5
6
protected TextView txtResult;//识别结果 protected Button startBtn;//开始识别 一直不说话会自动停止,需要再次打开 protected Button stopBtn;//停止识别 private EventManager asr;//语音识别核心库
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/** * 初始化控件 */ private void initView() { txtResult = (TextView) findViewById(R.id.tv_txt); startBtn = (Button) findViewById(R.id.btn_start); stopBtn = (Button) findViewById(R.id.btn_stop); startBtn.setOnClickListener(new View.OnClickListener() {//开始 @Override public void onClick(View v) { asr.send(SpeechConstant.ASR_START, "{}", null, 0, 0); } }); stopBtn.setOnClickListener(new View.OnClickListener() {//停止 @Override public void onClick(View v) { asr.send(SpeechConstant.ASR_STOP, "{}", null, 0, 0); } }); }

在onCreate方法中调用
在这里插入图片描述

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); initPermission(); //初始化EventManager对象 asr = EventManagerFactory.create(this, "asr"); //注册自己的输出事件类 asr.registerListener(this); // EventListener 中 onEvent方法 }

同时还需要实现EventListener,注意到这个实现的是百度的,不是自带的。
在这里插入图片描述
实现之后还需要一个回调方法,如下:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/** * 自定义输出事件类 EventListener 回调方法 */ @Override public void onEvent(String name, String params, byte[] data, int offset, int length) { if (name.equals(SpeechConstant.CALLBACK_EVENT_ASR_PARTIAL)) { // 识别相关的结果都在这里 if (params == null || params.isEmpty()) { return; } if (params.contains(""final_result"")) { // 一句话的最终识别结果 txtResult.setText(params); } } }

最后就是在onDestroy里面关闭和处理

复制代码
1
2
3
4
5
6
7
8
9
10
@Override protected void onDestroy() { super.onDestroy(); //发送取消事件 asr.send(SpeechConstant.ASR_CANCEL, "{}", null, 0, 0); //退出事件管理器 // 必须与registerListener成对出现,否则可能造成内存泄露 asr.unregisterListener(this); }

可以运行了
在这里插入图片描述
点击开始,然后说 “你好”,识别出结果
在这里插入图片描述

可以看到,识别的结果还是蛮精准的,但是我们要的数据就只有那两个字而已,所以要进行数据的解析了

④ JSON数据解析

通过刚才代码的中大日志打印拿到JSON字符串,将这个字符串转成实体bean.
在这里插入图片描述
转出来的实体bean, 命名为ASRresponse,代码如下:

复制代码
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
138
139
140
141
142
143
144
145
146
147
148
149
150
package com.llw.asrdemo; import java.util.List; public class ASRresponse { /** * results_recognition : ["你好,"] * result_type : final_result * best_result : 你好, * origin_result : {"asr_align_begin":80,"asr_align_end":130,"corpus_no":6835867007181645805,"err_no":0,"raf":133,"result":{"word":["你好,"]},"sn":"82d975e0-6eb4-43ac-a0e7-850bb149f28e"} * error : 0 */ private String result_type; private String best_result; private OriginResultBean origin_result; private int error; private List<String> results_recognition; public String getResult_type() { return result_type; } public void setResult_type(String result_type) { this.result_type = result_type; } public String getBest_result() { return best_result; } public void setBest_result(String best_result) { this.best_result = best_result; } public OriginResultBean getOrigin_result() { return origin_result; } public void setOrigin_result(OriginResultBean origin_result) { this.origin_result = origin_result; } public int getError() { return error; } public void setError(int error) { this.error = error; } public List<String> getResults_recognition() { return results_recognition; } public void setResults_recognition(List<String> results_recognition) { this.results_recognition = results_recognition; } public static class OriginResultBean { /** * asr_align_begin : 80 * asr_align_end : 130 * corpus_no : 6835867007181645805 * err_no : 0 * raf : 133 * result : {"word":["你好,"]} * sn : 82d975e0-6eb4-43ac-a0e7-850bb149f28e */ private int asr_align_begin; private int asr_align_end; private long corpus_no; private int err_no; private int raf; private ResultBean result; private String sn; public int getAsr_align_begin() { return asr_align_begin; } public void setAsr_align_begin(int asr_align_begin) { this.asr_align_begin = asr_align_begin; } public int getAsr_align_end() { return asr_align_end; } public void setAsr_align_end(int asr_align_end) { this.asr_align_end = asr_align_end; } public long getCorpus_no() { return corpus_no; } public void setCorpus_no(long corpus_no) { this.corpus_no = corpus_no; } public int getErr_no() { return err_no; } public void setErr_no(int err_no) { this.err_no = err_no; } public int getRaf() { return raf; } public void setRaf(int raf) { this.raf = raf; } public ResultBean getResult() { return result; } public void setResult(ResultBean result) { this.result = result; } public String getSn() { return sn; } public void setSn(String sn) { this.sn = sn; } public static class ResultBean { private List<String> word; public List<String> getWord() { return word; } public void setWord(List<String> word) { this.word = word; } } } }

这里我用GSON来解析JSON数据。
在这里插入图片描述

复制代码
1
2
3
//GSON implementation 'com.squareup.retrofit2:converter-gson:2.4.0'

记得Sync一下
然后回到MainActivity
在这里插入图片描述
修改的代码如下:

复制代码
1
2
3
4
5
6
7
8
9
10
11
Gson gson = new Gson(); ASRresponse asRresponse = gson.fromJson(params, ASRresponse.class);//数据解析转实体bean if(asRresponse == null) return; //从日志中,得出Best_result的值才是需要的,但是后面跟了一个中文输入法下的逗号, if(asRresponse.getBest_result().contains(",")){//包含逗号 则将逗号替换为空格,这个地方还会问题,还可以进一步做出来,你知道吗? txtResult.setText(asRresponse.getBest_result().replace(',',' ').trim());//替换为空格之后,通过trim去掉字符串的首尾空格 }else {//不包含 txtResult.setText(asRresponse.getBest_result().trim()); }

然后再运行一下
在这里插入图片描述
OK,搞定了。其实看下来也不难,只不过是你没有找到好一点的文章,你说呢?这里是初学者-Study,山高水长,后会有期~

⑤ 疑难杂症

  经过了几次对读者问题解决之后,我打算添加这一环节,非常有必要,当你看完我的博客出现问题之后,请先运行我的源码,源码没有问题的话再和自己的代码取做对比,如果最后你发现不了什么问题。这里要注意的地方有三个:① 真机运行,别用任何虚拟器,虚拟机。② 检查百度智能云上面的应用包名和自己项目的包名是否一致。③ 检查AppID、API Key、Secret Key是否与core模块中的AndroidManifest.xml中的配置对应的上。④ 检查是否领取了免费调试额度。如下图所示,如果你的立即领取为灰色,那么现在则要领取了才能正常调用百度语音识别的SDK。如下图
在这里插入图片描述
  在我写这篇博客的时候,我创建应用的时候自己就领取了这个免费额度,所以上面的文章中没有提到这一点,在这里补充上去,现在的新用户创建应用时,百度改变了规则,需用开发者手动领取,没有领取的,你自然就调用不了SDK了。综上所述能解决你大部分问题。再加上我的博客基本上无懈可击,可以很负责任的说,我的这个博客绝对比官方文档要详细很多,可以说是手把手教学了,另外有问题也可以私信我,或者评论一下就可以。

这里再补充一个读者解决问题的过程,因为我之前写的时候没有碰到过,不过既然是解决问题的方式之一,而且也有用的话,也就放到文章里面来吧。这是我在评论里看到的;

如果出现Attemp to…的问题,把start那里的第一个Null改成 “{}” 试试;

复制代码
1
2
asr.send(SpeechConstant.ASR_START, "{}", null, 0, 0);

如果出现VAD…的,把minsdk改成21

源码地址:ASRDemo

下载APK的二维码
在这里插入图片描述

最后

以上就是体贴超短裙最近收集整理的关于Android 百度语音识别(详细步骤+源码)前言正文的全部内容,更多相关Android内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(75)

评论列表共有 0 条评论

立即
投稿
返回
顶部