Android 语音识别 研究

来源:互联网 发布:nginx 三级域名泛解析 编辑:程序博客网 时间:2024/05/14 22:40

一、Android 提供了三种方式:

语音识别方法一:使用intent调用语音识别程序

1. 说明
以下例程功能为:在应用程序中使用intent来调出语言识别界面,录音并识别后将识别的字串返回给应用程序。注意:使用前需要安装语音识别程序如语音搜索。

2. 本例参考自android例程:
development/samples/ApiDemos/src/com/example/android/apis/app/VoiceRecognition.java

3. 可从此处下载可独立运行的代码:
http://download.csdn.net/source/2591401

4.这种方法需要联网,借助于云端技术可以识别用户的语音输入。

5、核心代码:new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH)

6、这种方式有个回调函数可以返回音频文件,即可实现边录音边识别。

语音识别方法二:应用程序自己调用语音识别库

1. 说明
以下例程功能为:应用程序自身调用语言识别函数,程序以循环方式等待录音并识别后的字串。

2. 本例参考自android代码:
frameworks/base/core/java/android/speech/srec/Recognizer.java中注释部分

3. 可从此处下载可独立运行的代码:
http://download.csdn.net/source/2591401

4.语音识别库是嵌入到系统里的,系统提供的识别库有限。

5、这个应该不需要联网吧(未验证)

语音识别方法三:调用语音Service识别

1. 说明
以下例程功能为:在应用程序中使用通于访问service调用语言识别功能,录音并识别后将识别的字串通过Listener返回给应用程序。注意:使用前需要安装语音识别服务,如编译安装源码中的development/samples/VoiceRecogitionService。

2. 本例参考自android源码

a) 后台服务
参见development/samples/VoiceRecognitionService/*
此处实现了一个模拟的后台服务,它并未实现真的语音识别,而只是一个框架以示例,编译并安装它,即可在设置的语音输入与输出中看到它,它包含了一个设置界面,当连接这个Service时,如果设置了Letters,则直接返回abc,如果设置了Numbers,则直接返回123
你可以自己实现,用于连接android源码自带的识别引擎srec.

b) 前台程序
参见frameworks/base/core/java/android/speech/Recognition*
它与后台Service交互,此段代码实现在应用程序界面中

3. 可从此处下载可独立运行的代码(前台程序):
http://download.csdn.net/source/2591401

二、第三方语音识别平台:

1、、科大讯飞

sdk:使用有ui的sdk需要导入jar包和动态库,调用jar包里面的接口,进行相关功能实现;
讯飞语音+:需要安装讯飞语音+APK,导入讯飞语音+的开发jar包,用户可以自定义界面,目前讯飞语音+包含本地合成功能。

语音+可以支持离线语音合成。离线语音识别的功能,但是收费。

2、百度语音识别:


有两种方式:

(1)、调用 语音识别控件

(2)、api 方式

上一章描述了如何使用BaiduASRDigitalDialog进行语音识别,此种方式提供了统一的简便易用

的交互,如果此种交互无法满足开发者的需求,开发者可以直接使用语音识别 API 定制自己的语音

交互。

在使用api方式时有个重要的参数

class MyVoiceRecogListener implements VoiceClientStatusChangeListener { @Overridepublic void onClientStatusChange(int status, Object obj) {switch (status) {case VoiceRecognitionClient.CLIENT_STATUS_START_RECORDING:break;case VoiceRecognitionClient.CLIENT_STATUS_SPEECH_START://检测到语音起点break; case VoiceRecognitionClient.CLIENT_STATUS_AUDIO_DATA: //有音频数据输出if (obj != null && obj instanceof byte[]) { //处理数据 }break;case VoiceRecognitionClient.CLIENT_STATUS_SPEECH_END://已经检测到语音终点,等待网络返回break;case VoiceRecognitionClient.CLIENT_STATUS_FINISH://语音识别完成if(currentVoiceType == VOICE_TYPE_SEARCH){mStatusTextView.setText(R.string.finished);//obj 是一个ArrayList<String>,里面有多个候选词}break;case VoiceRecognitionClient.CLIENT_STATUS_UPDATE_RESULTS://多句模式会有部分结果(一个分句)返回if(currentVoiceType == VOICE_TYPE_SEARCH){//obj 是一个ArrayList<String>,里面有多个候选词}else if(currentVoiceType == VOICE_TYPE_INPUT){//obj 是一个List<List<Candidate>>,里面有多个候选词List<List<Candidate>> result = (List<List<Candidate>>) obj;}break;case VoiceRecognitionClient.CLIENT_STATUS_USER_CANCELED://通知用户已取消break;default:break;}}


可以上边拿到音频数据,可以实现边识别边录音

百度语音返回的音频格式为pcm16位(直接把byte[] 拼在一起存成pcm格式文件),这里官方没有介绍。(官方有两个设置 一个是16K,一个是 8K ,实际测试就是对应下面两种)为一下两种:


8000HZ 16bit stereo: 每秒钟有8000 次采样, 采样数据用 16 位(2字节)记录, 双声道(立体声);

8000HZ 16bit mono: 每秒钟有 8000 次采样, 采样数据用 16 位(2字节)记录, 单声道;


三、其他:

Android平台使用PocketSphinx做离线语音识别,小范围语音99%识别率

    最近语音识别很火,但是都是用的在线语音识别,研究了一下离线语音识别,小范围内的语音识别率还不错,在此记录一下

首先本文要说的两个前提1.android平台离线语音识别 2.小范围语音

小范围语音指的是相对固定的命令。本文的例子大概实现了20条语音命令,超出范围的无法识别。因此本文中离线语音的使用范围也有限,对于一些固定的输入可能有用,比如用语音命令代替打开,播放,重启这些简单的固定的命令。

0 0