zoukankan      html  css  js  c++  java
  • 百度语音识别开放平台SDK用法

    版权声明:本文为博主原创文章,未经博主同意不得转载。 https://blog.csdn.net/zpf8861/article/details/30229039

    百度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中的库加入到project中


            声明权限

    [java] view plaincopy在CODE上查看代码片派生到我的代码片
    1.  <uses-permission android:name="android.permission.RECORD_AUDIO" />  
    2. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />  
    3. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  
    4. <uses-permission android:name="android.permission.INTERNET" />  
    5. <uses-permission android:name="android.permission.READ_PHONE_STATE" />  
    6. <uses-permission android:name="android.permission.WAKE_LOCK" />  
    7. <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />  
    8. <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />  
    9. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /></span>  

       4、语音识别

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

    语音识别控件方式

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

    [java] view plaincopy在CODE上查看代码片派生到我的代码片
    1. if (mDialog == null || mCurrentTheme != Config.DIALOG_THEME) {  
    2.                     mCurrentTheme = Config.DIALOG_THEME;  
    3.                     if (mDialog != null) {  
    4.                         mDialog.dismiss();  
    5.                     }  
    6.                     Bundle params = new Bundle();  
    7.                     params.putString(BaiduASRDigitalDialog.PARAM_API_KEY, Constants.API_KEY);  
    8.                     params.putString(BaiduASRDigitalDialog.PARAM_SECRET_KEY, Constants.SECRET_KEY);  
    9.                     params.putInt(BaiduASRDigitalDialog.PARAM_DIALOG_THEME, Config.DIALOG_THEME);  
    10.                     mDialog = new BaiduASRDigitalDialog(this, params);  
    11.                     mDialog.setDialogRecognitionListener(mRecognitionListener);  
    12.                 }  
    13.                 mDialog.getParams().putInt(BaiduASRDigitalDialog.PARAM_PROP, Config.CURRENT_PROP);  
    14.                 mDialog.getParams().putString(BaiduASRDigitalDialog.PARAM_LANGUAGE,  
    15.                         Config.getCurrentLanguage());  
    16.                 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

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

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

    [java] view plaincopy在CODE上查看代码片派生到我的代码片
    1. mRecognitionListener = new DialogRecognitionListener() {  
    2.   
    3.            @Override  
    4.            public void onResults(Bundle results) {  
    5.                ArrayList<String> rs = results != null ? results  
    6.                        .getStringArrayList(RESULTS_RECOGNITION) : null;  
    7.                if (rs != null && rs.size() > 0) {  
    8.                    mResult.setText(rs.get(0));  
    9.                }  
    10.   
    11.            }  
    12.        };  


    
    
    API方式
    首先须要配置语音识别引擎ASREngine的參数VoiceRecognitionConfig
    [java] view plaincopy在CODE上查看代码片派生到我的代码片
    1. VoiceRecognitionConfig config = new VoiceRecognitionConfig();  
    2.                 config.setProp(Config.CURRENT_PROP);  
    3.                 config.setLanguage(Config.getCurrentLanguage());  
    4.                 config.enableVoicePower(Config.SHOW_VOL); // 音量反馈。  
    5.                 if (Config.PLAY_START_SOUND) {  
    6.                     config.enableBeginSoundEffect(R.raw.bdspeech_recognition_start); // 设置识别開始提示音  
    7.                 }  
    8.                 if (Config.PLAY_END_SOUND) {  
    9.                     config.enableEndSoundEffect(R.raw.bdspeech_speech_end); // 设置识别结束提示音  
    10.                 }  
    11.                 config.setSampleRate(VoiceRecognitionConfig.SAMPLE_RATE_8K); // 设置採样率,须要与外部音频一致  

    然后启动识别
    [java] view plaincopy在CODE上查看代码片派生到我的代码片
    1. int code = mASREngine.startVoiceRecognition(mListener, config);  

    当中mListener是识别过程的回调,须要对当中的方法进行实现
    [java] view plaincopy在CODE上查看代码片派生到我的代码片
    1. /** 
    2.     * 重写用于处理语音识别回调的监听器 
    3.     */  
    4.    class MyVoiceRecogListener implements VoiceClientStatusChangeListener {  
    5.   
    6.        @Override  
    7.        public void onClientStatusChange(int status, Object obj) {  
    8.            switch (status) {  
    9.            // 语音识别实际開始,这是真正開始识别的时间点。需在界面提示用户说话。  
    10.                case VoiceRecognitionClient.CLIENT_STATUS_START_RECORDING:  
    11.                    isRecognition = true;  
    12.                    mHandler.removeCallbacks(mUpdateVolume);  
    13.                    mHandler.postDelayed(mUpdateVolume, POWER_UPDATE_INTERVAL);  
    14.                    mControlPanel.statusChange(ControlPanelFragment.STATUS_RECORDING_START);  
    15.                    break;  
    16.                case VoiceRecognitionClient.CLIENT_STATUS_SPEECH_START: // 检測到语音起点  
    17.                    mControlPanel.statusChange(ControlPanelFragment.STATUS_SPEECH_START);  
    18.                    break;  
    19.                // 已经检測到语音终点,等待网络返回  
    20.                case VoiceRecognitionClient.CLIENT_STATUS_SPEECH_END:  
    21.                    mControlPanel.statusChange(ControlPanelFragment.STATUS_SPEECH_END);  
    22.                    break;  
    23.                // 语音识别完毕,显示obj中的结果  
    24.                case VoiceRecognitionClient.CLIENT_STATUS_FINISH:  
    25.                    mControlPanel.statusChange(ControlPanelFragment.STATUS_FINISH);  
    26.                    isRecognition = false;  
    27.                    updateRecognitionResult(obj);  
    28.                    break;  
    29.                // 处理连续上屏  
    30.                case VoiceRecognitionClient.CLIENT_STATUS_UPDATE_RESULTS:  
    31.                    updateRecognitionResult(obj);  
    32.                    break;  
    33.                // 用户取消  
    34.                case VoiceRecognitionClient.CLIENT_STATUS_USER_CANCELED:  
    35.                    mControlPanel.statusChange(ControlPanelFragment.STATUS_FINISH);  
    36.                    isRecognition = false;  
    37.                    break;  
    38.                default:  
    39.                    break;  
    40.            }  
    41.   
    42.        }  
    43.   
    44.        @Override  
    45.        public void onError(int errorType, int errorCode) {  
    46.            isRecognition = false;  
    47.            mResult.setText(getString(R.string.error_occur, Integer.toHexString(errorCode)));  
    48.            mControlPanel.statusChange(ControlPanelFragment.STATUS_FINISH);  
    49.        }  
    50.   
    51.        @Override  
    52.        public void onNetworkStatusChange(int status, Object obj) {  
    53.            // 这里不做不论什么操作不影响简单识别  
    54.        }  
    55.    }  

    获得识别BDVRClient对象

    [java] view plaincopy在CODE上查看代码片派生到我的代码片
    1. mASREngine = VoiceRecognitionClient.getInstance(this);  
    2.         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

    boolean useDefaultSource

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

    enableNLU

     

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

    getSampleRate

     

    获取当前识别採样率

    setLanguage

    String Language

    设置语种。

    眼下支持的语种有中文普通话(LANGUAGE_CHINESE)、中文粤语(LANGUAGE_CANTONSE)、英文(LANGUAGE_ENGLISH)。


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

    [java] view plaincopy在CODE上查看代码片派生到我的代码片
    1. int code = mASREngine.startVoiceRecognition(mListener, config);  
    2.                if (code != VoiceRecognitionClient.START_WORK_RESULT_WORKING) {  
    3.                    mResult.setText(getString(R.string.error_start, code));  
    4.                }   

    取消语音识别

    [java] view plaincopy在CODE上查看代码片派生到我的代码片
    1. mASREngine.stopVoiceRecognition();  

    结束语音识别

    [java] view plaincopy在CODE上查看代码片派生到我的代码片
    1. mRecognitionClient.speakFinish();  
查看全文
  • 相关阅读:
    [转载]「服务」WCF中NetNamedPipeBinding的应用实例
    [转载] ABP框架理论学习之后台工作(Jobs)和后台工作者(Workers)
    .NET Core use NLog
    把.netcore console 安装到Windows 系统服务。
    利用Linq Skip() Take()分页
    C#访问Java的WebService添加SOAPHeader验证的问题
    马丁福勒 关于微服务特点的描述
    转载 springboot 配置读取
    luajit与NYI
    lua启用lua-resty-core
  • 原文地址:https://www.cnblogs.com/ldxsuanfa/p/10632094.html
  • Copyright © 2011-2022 走看看