一、Android 提供了三种方式:
语音识别方法一:使用intent调用语音识别程序
1.
以下例程功能为:在应用程序中使用intent来调出语言识别界面,录音并识别后将识别的字串返回给应用程序。注意:使用前需要安装语音识别程序如语音搜索。
2.
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.
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.
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 {
@Override
public 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;
}
}
可以上边拿到音频数据,可以实现边识别边录音
8000HZ 16bit stereo: 每秒钟有 8000 次采样, 采样数据用 16 位(2字节)记录, 双声道(立体声);
8000HZ 16bit mono: 每秒钟有 8000 次采样, 采样数据用 16 位(2字节)记录, 单声道;
三、其他:
Android平台使用PocketSphinx做离线语音识别,小范围语音99%识别率
- 最近语音识别很火,但是都是用的在线语音识别,研究了一下离线语音识别,小范围内的语音识别率还不错,在此记录一下
首先本文要说的两个前提1.android平台离线语音识别 2.小范围语音
小范围语音指的是相对固定的命令。本文的例子大概实现了20条语音命令,超出范围的无法识别。因此本文中离线语音的使用范围也有限,对于一些固定的输入可能有用,比如用语音命令代替打开,播放,重启这些简单的固定的命令。