Android 百度在线语音识别

来源:互联网 发布:淘宝买家id在哪里看 编辑:程序博客网 时间:2024/04/29 02:32
首先需要在百度进行用户注册,然后新建一个应用,选择你需要的服务,并且设置好创建的apk的包名。
然后在AndroidManifest.xml中配置:
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.example.baiduvoicetest">    <!-- 允许应用使用麦克风录音 -->    <uses-permission android:name="android.permission.RECORD_AUDIO" />    <!-- 获取当前的网络状态,优化录音及网络参数。-->    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />    <!-- 允许应用联网,发送语音数据至服务器,获得识别结果。 -->    <uses-permission android:name="android.permission.INTERNET" />    <!-- 获取当前wifi状态,优化录音及网络参数 -->    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />    <!-- 获取用户手机的IMEI,用来唯一的标识用户。 -->    <uses-permission android:name="android.permission.READ_PHONE_STATE" />    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />    <application        android:allowBackup="true"        android:icon="@mipmap/ic_launcher"        android:label="@string/app_name"        android:supportsRtl="true"        android:theme="@style/AppTheme">        <!-- begin: baidu speech sdk-->        <meta-data            android:name="com.baidu.speech.APP_ID"            android:value="api id" />        <meta-data            android:name="com.baidu.speech.API_KEY"            android:value="api key" />        <meta-data            android:name="com.baidu.speech.SECRET_KEY"            android:value="secret key" />        <service            android:name="com.baidu.speech.VoiceRecognitionService"            android:exported="false"></service>        <!-- end: baidu speech sdk-->        <activity android:name=".MainActivity">            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>    </application></manifest>


AndroidManifest.xml主要配置了一些权限和注册apk时生成的key。百度的文档中还有一个BaiduASRDigitalDialog的activity的注册,不过我没有用到,所以这里就不添加了。

然后将之前下载的jar包添加到lib文件夹,还有几个.so结尾的文件也要添加到main文件夹底下,不然会报错。



完整代码:

public class MainActivity extends Activity implements RecognitionListener {    @Bind(R.id.btn_voice)    public Button btnVoice;    @Bind(R.id.tv_content)    public TextView tvContent;    private SpeechRecognizer speechRecognizer;    private CircleLoadingProgress mLoadingDialog = null;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        ButterKnife.bind(this);        // 创建识别器        speechRecognizer = SpeechRecognizer.createSpeechRecognizer(this, new ComponentName(this, VoiceRecognitionService.class));        // 注册监听器        speechRecognizer.setRecognitionListener(this);    }    @OnClick(R.id.btn_voice)    public void startVoice() {        showLoadingDialog("识别中。。。");        start();    }    private void start() {        Intent intent = new Intent();        bindParams(intent);        speechRecognizer.startListening(intent);    }    public void bindParams(Intent intent) {        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);        // 提示音        if (sp.getBoolean("tips_sound", true)) {            intent.putExtra(Constant.EXTRA_SOUND_START, R.raw.bdspeech_recognition_start);            intent.putExtra(Constant.EXTRA_SOUND_END, R.raw.bdspeech_speech_end);            intent.putExtra(Constant.EXTRA_SOUND_SUCCESS, R.raw.bdspeech_recognition_success);            intent.putExtra(Constant.EXTRA_SOUND_ERROR, R.raw.bdspeech_recognition_error);            intent.putExtra(Constant.EXTRA_SOUND_CANCEL, R.raw.bdspeech_recognition_cancel);        }        // 音频源        if (sp.contains(Constant.EXTRA_INFILE)) {            String tmp = sp.getString(Constant.EXTRA_INFILE, "").replaceAll(",.*", "").trim();            intent.putExtra(Constant.EXTRA_INFILE, tmp);        }        // 保存过程中产生的音频文件        if (sp.getBoolean(Constant.EXTRA_OUTFILE, false)) {            intent.putExtra(Constant.EXTRA_OUTFILE, "sdcard/outfile.pcm");        }        // 离线语音识别路径        if (sp.getBoolean(Constant.EXTRA_GRAMMAR, false)) {            intent.putExtra(Constant.EXTRA_GRAMMAR, "assets:///baidu_speech_grammar.bsg");        }        // 采样率        if (sp.contains(Constant.EXTRA_SAMPLE)) {            String tmp = sp.getString(Constant.EXTRA_SAMPLE, "").replaceAll(",.*", "").trim();            if (null != tmp && !"".equals(tmp)) {                intent.putExtra(Constant.EXTRA_SAMPLE, Integer.parseInt(tmp));            }        }        // 语种        if (sp.contains(Constant.EXTRA_LANGUAGE)) {            String tmp = sp.getString(Constant.EXTRA_LANGUAGE, "").replaceAll(",.*", "").trim();            if (null != tmp && !"".equals(tmp)) {                intent.putExtra(Constant.EXTRA_LANGUAGE, tmp);            }        }        // 语义解析设置        if (sp.contains(Constant.EXTRA_NLU)) {            String tmp = sp.getString(Constant.EXTRA_NLU, "").replaceAll(",.*", "").trim();            if (null != tmp && !"".equals(tmp)) {                intent.putExtra(Constant.EXTRA_NLU, tmp);            }        }        // 语义活动检测        // search 搜索(短)        // input 输入(长)        if (sp.contains(Constant.EXTRA_VAD)) {            String tmp = sp.getString(Constant.EXTRA_VAD, "").replaceAll(",.*", "").trim();            if (null != tmp && !"".equals(tmp)) {                intent.putExtra(Constant.EXTRA_VAD, tmp);            }        }        // 垂直领域        String prop = null;        if (sp.contains(Constant.EXTRA_PROP)) {            String tmp = sp.getString(Constant.EXTRA_PROP, "").replaceAll(",.*", "").trim();            if (null != tmp && !"".equals(tmp)) {                intent.putExtra(Constant.EXTRA_PROP, Integer.parseInt(tmp));                prop = tmp;            }        }    }    @Override    public void onReadyForSpeech(Bundle params) {        // 准备就绪    }    @Override    public void onBeginningOfSpeech() {        // 开始说话处理    }    @Override    public void onRmsChanged(float rmsdB) {        // 音量变化处理    }    @Override    public void onBufferReceived(byte[] buffer) {        // 录音数据传出处理    }    @Override    public void onEndOfSpeech() {        // 说话结束处理    }    @Override    public void onError(int error) {        StringBuilder sb = new StringBuilder();        switch (error) {            case SpeechRecognizer.ERROR_AUDIO:                sb.append("音频问题");                break;            case SpeechRecognizer.ERROR_SPEECH_TIMEOUT:                sb.append("没有语音输入");                break;            case SpeechRecognizer.ERROR_CLIENT:                sb.append("其它客户端错误");                break;            case SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS:                sb.append("权限不足");                break;            case SpeechRecognizer.ERROR_NETWORK:                sb.append("网络问题");                break;            case SpeechRecognizer.ERROR_NO_MATCH:                sb.append("没有匹配的识别结果");                break;            case SpeechRecognizer.ERROR_RECOGNIZER_BUSY:                sb.append("引擎忙");                break;            case SpeechRecognizer.ERROR_SERVER:                sb.append("服务端错误");                break;            case SpeechRecognizer.ERROR_NETWORK_TIMEOUT:                sb.append("连接超时");                break;        }        sb.append(":" + error);        tvContent.setText("识别失败:" + sb.toString());        cancelLoadingDialog();    }    @Override    public void onResults(Bundle results) {        ArrayList<String> nbest = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);        // 语音结果json格式        String json_res = results.getString("origin_result");        tvContent.setText(nbest.get(0));        cancelLoadingDialog();    }    @Override    public void onPartialResults(Bundle partialResults) {        // 临时结果处理    }    @Override    public void onEvent(int eventType, Bundle params) {        // 处理事件回调    }    public void showLoadingDialog(String message) {        if (mLoadingDialog == null) {            mLoadingDialog = new CircleLoadingProgress(this);        }        if (message != null) {            mLoadingDialog.setMessage(message);        }        mLoadingDialog.show();    }    public void cancelLoadingDialog() {        if (mLoadingDialog != null && mLoadingDialog.isShowing()) {            mLoadingDialog.cancel();        }    }    @Override    protected void onDestroy() {        speechRecognizer.destroy();        super.onDestroy();        ButterKnife.unbind(this);    }}

界面布局:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical"    android:padding="10dp"    tools:context="com.example.baiduvoicetest.MainActivity">    <Button        android:id="@+id/btn_voice"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="语音" />    <TextView        android:id="@+id/tv_content"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_marginTop="10dp"        android:text="Hello World!" /></LinearLayout>

其中Constant文件来自于官网demo中。

示意图:

                              

0 0
原创粉丝点击