ASR全称是Automatic Speech Recognition,是自动语音识别,将人说出来的化自动识别成文本。本文我们将简单快速的熟悉Android asr流程和外部调用原理。

在此先直接说明Android Asr流程原理,以便更容易理解后面的调用流程:
Android Asr只是定义了语音识别的接口,具体的引擎需要各个厂商单独定义,也就是说Android Asr只提供外部调用的接口,至于具体的语音识别功能需要其他引擎来支持,所以本文我们主要分析外部如何来调用Android Asr,至于语音识别引擎我们后续会以百度ASR引擎来讲解,接下来进入正题。

涉及的Android Asr 核心源码路径如下:
android.speech.SpeechRecognizer
android.speech.RecognitionListener
android.speech.RecognitionService

语音识别当然得需要录音,所以权限是必须的
外部调用方式,直接上代码分析:
private void initRecognizer() {
List list = this.getPackageManager().queryIntentServices(
new Intent(RecognitionService.SERVICE_INTERFACE), 0);
Log.i(TAG, " list.size=" + list.size());
// Toast.makeText(this, “Recognition Available”+ list.size(), Toast.LENGTH_SHORT).show();
for (ResolveInfo resolveInfo : list) {
// Toast.makeText(this, " resolveInfo=" + resolveInfo.toString(), Toast.LENGTH_SHORT).show();
Log.i(TAG, " resolveInfo=" + resolveInfo.toString());
}
if (SpeechRecognizer.isRecognitionAvailable(this)) {
mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(this,
new ComponentName(“com.ishare.asrengine”, “com.ishare.asrengine.engine.BaiduAsrService”));
mSpeechRecognizer.setRecognitionListener(this);
} else {
Toast.makeText(this, “Recognition UnAvailable”, Toast.LENGTH_SHORT).show();
}
}
关键信息在于三个方法:
SpeechRecognizer.isRecognitionAvailable(this)、SpeechRecognizer.createSpeechRecognizer、mSpeechRecognizer.setRecognitionListener(this);

SpeechRecognizer.isRecognitionAvailable判断是否有语音识别服务,查询所有的引擎服务,至少有一个时就可以使用,否则无法使用,也就是上面有没有语音识别引擎来支持此功能,没有的话肯定不能使用了,android是怎么来判断的呢。进isRecognitionAvailable,贴源码:final List list = context.getPackageManager().queryIntentServices(
new Intent(RecognitionService.SERVICE_INTERFACE), 0);
明白了吧,系统会查找有没有RecognitionService.SERVICE_INTERFACE这个action的服务,而这个服务当然是需要我们实现的,这个后面会有分析。

SpeechRecognizer.createSpeechRecognizer创建语音识别,其有两个参数,一个是context,另一个是serviceComponent,在此明白上面的服务检测了吧,创建语音识别的过程其实就是真正开启语音识别引擎服务的过程。

mSpeechRecognizer.setRecognitionListener(this);这个是监听,原理就是Asr引擎识别的过程和结果通过SpeechRecognizer回调,然后在此监听中来做处理,具体的监听能供大家参看源码,这里不做分析。

接下来调用mSpeechRecognizer.startListening(recognizerIntent);
这个没什么说的,就是启动语音识别。

以上就是外部客户端调用android Asr的流程,接下我们分析service,为什么要分析service,回想下,上面有个条件就是调用Asr的时候系统需要先检测是否有引擎服务,没有的话就不能用了,这个不用解释了吧,系统中不存在识别服务,肯定不能用识别功能,所以我们就需要做一个识别的服务,一般就会把像百度、讯飞等一些识别的sdk集成到这个服务里,本文中我们对服务只做功能讲解,具体的识别集成后续会以集成百度Asr为例类讲解,接下来就快速分析怎么来写这个服务类:
继承RecognitionService,在Mainfest中声明时候一定要定义action,上代码:






为什么要加这个action,返回前面的系统检查服务看源码就发现,系统就是检测有没有这个action服务,所以不管系统中集成哪个引擎,必须要启这个服务,而且必须是这个,这个action是android定义好的,自己不能换另外的action,这个非常重要,集成时候一定要注意。
继承RecognitionService后需要实现三个函数:
@Override
protected void onStartListening(Intent recognizerIntent, Callback listener) {
this.mRecognitionListener=listener;
startListen();
}

@Override
protected void onCancel(Callback listener) {
cancelListen();
}

@Override
protected void onStopListening(Callback listener) {
stopListen();
}
启动、停止、取消,没错,当客户端调用启动函数
mSpeechRecognizer.startListening的时候跟进源码一路看下来,你会发现其实最后onStartListening才是语音识别服务的真正开始,当然onCancel就是取消,onStopListening就是停止,所以一般我们在集成其他Asr引擎的时候,在此service的onCreate中会做一些相应的初始化工作,比如引擎初始化、监听等等,然后在这三个函数中才是语音识别功能的实现,好了,现在梳理一下思路,其实很简单,SpeechRecognizer提供接口给外部调用,具体的引擎在RecognitionService
中实现,按照这个思路即可实现Android系统级别的Asr功能。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐