百度Android语音识别SDK分在线与离线两种,这篇文章介绍在线SDK的使用方法。

在线SDK是以JAR包和动态链接库形式发布和使用,可以从百度开放云平台网站中下载SDK及使用说明文档。

http://developer.baidu.com/wiki/index.php?title=docs/cplat/media/voice

完成语音SDK的集成分以下几步,本文将一步步介绍SDK集成方法。

1、注册开放开放平台

点击管理控制台,选择移动应用管理


选择创建应用,填写应用名称


可以看到右上角有ID、API KEY、Secret KEY,点击可以复制其内容,保存这些字符串,在使用语音SDK时会用到。


2、申请开启语音识别服务 ,选择媒体云---语音识别,点击申请开启服务,填写理由。


等待对接成功


3、使用语音识别SDK前的准备

之前准备了SDK开发包以及ID、API KEY、Secret KEY。

首先将开发包中的lib中的库添加到工程中


声明权限

     <uses-permission android:name="android.permission.RECORD_AUDIO" />    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />    <uses-permission android:name="android.permission.INTERNET" />    <uses-permission android:name="android.permission.READ_PHONE_STATE" />    <uses-permission android:name="android.permission.WAKE_LOCK" />    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /></span>

4、语音识别

SDK有两种实现语音识别的方式,一种是直接使用SDK中的语音识别控件,一种是使用SDK中的语音识别服务。

语音识别控件方式

语音识别控件BaiduASRDigitalDialog,提供了整套语音交互、提示音、音量反馈、动效反馈。开发者初始化一个BaiduASRDigitalDialog对象,并设置相关参数及结果回调,调用Show()方法就可以弹出对话框开始识别,识别结束后会在回调中得到识别结果。

if (mDialog == null || mCurrentTheme != Config.DIALOG_THEME) {                    mCurrentTheme = Config.DIALOG_THEME;                    if (mDialog != null) {                        mDialog.dismiss();                    }                    Bundle params = new Bundle();                    params.putString(BaiduASRDigitalDialog.PARAM_API_KEY, Constants.API_KEY);                    params.putString(BaiduASRDigitalDialog.PARAM_SECRET_KEY, Constants.SECRET_KEY);                    params.putInt(BaiduASRDigitalDialog.PARAM_DIALOG_THEME, Config.DIALOG_THEME);                    mDialog = new BaiduASRDigitalDialog(this, params);                    mDialog.setDialogRecognitionListener(mRecognitionListener);                }                mDialog.getParams().putInt(BaiduASRDigitalDialog.PARAM_PROP, Config.CURRENT_PROP);                mDialog.getParams().putString(BaiduASRDigitalDialog.PARAM_LANGUAGE,                        Config.getCurrentLanguage());                mDialog.show();

  

识别对话框支持的参数定义在BaiduASRDigitalDialog中以PARAM_前缀的常量。列表如下:

PARAM_API_KEY

string

开放平台认证API_key

PARAM_SECRET_KEY

string

开放平台认证Secret_key

PARAM_LANGUAGE

string

LANGUAGE_CHINESE

语种,取值定义在VoiceRecognitionConfig类中前缀为LANGUAGE_的常量

PARAM_PARTIAL_RESULTS

boolean

true

连续上屏

PARAM_NLU_ENABLE

boolean

false

是否语义解析。Prop为输入时暂不支持语义,请显示指定为其它领域。

PARAM_NLU_PARAMS

string

预留语义解析参数

PARAM_PROP

int

PROP_INPUT

领域参数,定义在VoiceRecognitionConfig类中前缀为PROP_的常量

PARAM_PORMPT_TEXT

string

“请说话”

对话框提示语

PARAM_PROMPT_SOUND_ENABLE

boolean

true

提示音,需要集成SDK包Raw文件夹的资源

PARAM_DIALOG_THEME

int

THEME_BLUE_LIGHTBG

样式。定义在前缀为THEME_的常量中

PARAM_TIPS

String[]

引导语列表

PARAM_SHOW_TIPS_ON_START

boolean

false

对话框弹出时首先显示引导语列表

PARAM_SHOW_TIP

boolean

false

识别启动3秒未检测到语音,随机出现一条引导语

PARAM_SHOW_HELP_ON_SILENT

boolean

false

静音超时后将“取消”按钮替换为“帮助”

设置回调方法,处理返回的结果

 mRecognitionListener = new DialogRecognitionListener() {            @Override            public void onResults(Bundle results) {                ArrayList<String> rs = results != null ? results                        .getStringArrayList(RESULTS_RECOGNITION) : null;                if (rs != null && rs.size() > 0) {                    mResult.setText(rs.get(0));                }            }        };


       API方式              首先需要配置语音识别引擎ASREngine的参数VoiceRecognitionConfig       
VoiceRecognitionConfig config = new VoiceRecognitionConfig();                config.setProp(Config.CURRENT_PROP);                config.setLanguage(Config.getCurrentLanguage());                config.enableVoicePower(Config.SHOW_VOL); // 音量反馈。                if (Config.PLAY_START_SOUND) {                    config.enableBeginSoundEffect(R.raw.bdspeech_recognition_start); // 设置识别开始提示音                }                if (Config.PLAY_END_SOUND) {                    config.enableEndSoundEffect(R.raw.bdspeech_speech_end); // 设置识别结束提示音                }                config.setSampleRate(VoiceRecognitionConfig.SAMPLE_RATE_8K); // 设置采样率,需要与外部音频一致

然后启动识别
 int code = mASREngine.startVoiceRecognition(mListener, config);

其中mListener是识别过程的回调,需要对其中的方法进行实现
 /**     * 重写用于处理语音识别回调的监听器     */    class MyVoiceRecogListener implements VoiceClientStatusChangeListener {        @Override        public void onClientStatusChange(int status, Object obj) {            switch (status) {            // 语音识别实际开始,这是真正开始识别的时间点,需在界面提示用户说话。                case VoiceRecognitionClient.CLIENT_STATUS_START_RECORDING:                    isRecognition = true;                    mHandler.removeCallbacks(mUpdateVolume);                    mHandler.postDelayed(mUpdateVolume, POWER_UPDATE_INTERVAL);                    mControlPanel.statusChange(ControlPanelFragment.STATUS_RECORDING_START);                    break;                case VoiceRecognitionClient.CLIENT_STATUS_SPEECH_START: // 检测到语音起点                    mControlPanel.statusChange(ControlPanelFragment.STATUS_SPEECH_START);                    break;                // 已经检测到语音终点,等待网络返回                case VoiceRecognitionClient.CLIENT_STATUS_SPEECH_END:                    mControlPanel.statusChange(ControlPanelFragment.STATUS_SPEECH_END);                    break;                // 语音识别完成,显示obj中的结果                case VoiceRecognitionClient.CLIENT_STATUS_FINISH:                    mControlPanel.statusChange(ControlPanelFragment.STATUS_FINISH);                    isRecognition = false;                    updateRecognitionResult(obj);                    break;                // 处理连续上屏                case VoiceRecognitionClient.CLIENT_STATUS_UPDATE_RESULTS:                    updateRecognitionResult(obj);                    break;                // 用户取消                case VoiceRecognitionClient.CLIENT_STATUS_USER_CANCELED:                    mControlPanel.statusChange(ControlPanelFragment.STATUS_FINISH);                    isRecognition = false;                    break;                default:                    break;            }        }        @Override        public void onError(int errorType, int errorCode) {            isRecognition = false;            mResult.setText(getString(R.string.error_occur, Integer.toHexString(errorCode)));            mControlPanel.statusChange(ControlPanelFragment.STATUS_FINISH);        }        @Override        public void onNetworkStatusChange(int status, Object obj) {            // 这里不做任何操作不影响简单识别        }    }

获得识别BDVRClient对象

mASREngine = VoiceRecognitionClient.getInstance(this);        mASREngine.setTokenApis(Constants.API_KEY, Constants.SECRET_KEY);

请求参数设置 每次识别需要通过通过VoiceRecognitionConfig设置参数,其中一些方法在API中有说明

方法

参数

描述

enableBeginSoundEffect

int soundResourceId 启动提示音资源Id

设置开始提示音,soundResourceId为放置在Raw文件夹的资源Id。

enableEndSoundEffect

int soundResourceId 说话结束提示音资源Id

检测到用户说话结束播报的提示音,非识别结束

setSampleRate

int rate 采样率

设置音频采样率,

通常建议开发者不指定采样频率,由BDVRClient自动根据当前网络环境选择采样频率。WiFi环境下将使用16kHz采样,移动网络下将使用8kHz采样,来节省流量。参考常量定义

SAMPLE_RATE_8K 8K采样率

SAMPLE_RATE_16K 16K采样率

setProp

int prop

开发者可以通过指定垂直分类来获取更精准的语音识别结果。

注:垂直分类目前支持地图,音乐,视频,APP,网址,开发者需要注意设定采样频率时只能在这五种垂直分类中选择。若指定其他分类,可能会影响识别结果的精度。参考PROP_前缀的常量定义。

setUseDefaultAudioSource

booleanuseDefaultSource

设置是否使用缺省的录音。 如果不使用,用户需要调用VoiceRecognitionClient对象的feedAudioBuffer方法为识别器提供语音数据

enableNLU

启用语义解析,只在搜索模式起作用

getSampleRate

获取当前识别采样率

setLanguage

String Language

设置语种。目前支持的语种有中文普通话(LANGUAGE_CHINESE)、中文粤语(LANGUAGE_CANTONSE)、英文(LANGUAGE_ENGLISH)。


开始语音识别,BDVRClient在开始识别后,会启动录音、预处理、上传到服务器并获取识别结果。

 int code = mASREngine.startVoiceRecognition(mListener, config);                if (code != VoiceRecognitionClient.START_WORK_RESULT_WORKING) {                    mResult.setText(getString(R.string.error_start, code));                } 

取消语音识别

 mASREngine.stopVoiceRecognition();

结束语音识别

mRecognitionClient.speakFinish();

读者可以结合着SDK文档与demo源代码一起来学习百度语音识别SDK的使用。


语音识别的demo下载: http://download.csdn.net/detail/voicefans/7451441


小伙伴注意: 需要按照文章开头的去申请api key和secret key, 修改Constant.java,填上自己的key就ok了。VoiceRecognitionDemoActivity.java 展示了如何使用Dialog方式识别


如果遇到问题欢迎留言交流。












更多相关文章

  1. 【Mark】Android(安卓)EditText详解及用法
  2. [AndroidTips]通过广播Intent控制Android系统自带的音乐播放器
  3. 点击Android按钮跳转到React-native指定界面
  4. android 如何使用jni
  5. android语音识别接科大讯飞sdk
  6. android 获取string.xml中的value
  7. Android使用webrtc实现检测用户是否在说话
  8. Android实现语音识别 && 讯飞平台语音识别语音播报
  9. Android开发之Java设计模式基础篇

随机推荐

  1. Android四种点击事件和五中存储方式
  2. Using Memory Efficiently(Pro Android A
  3. Android中的跨进程通信的实现——远程调
  4. 设置和取消闹钟
  5. Android(安卓)ViewPager左右滑动月历
  6. Android Logcat 封装类
  7. android中的侧滑效果
  8. Android(安卓)BCM4330 FM 驱动驱动
  9. ubuntu下启动AS 模拟器报错" Unknown AVD
  10. Android(安卓)之Console不断自动弹出的解