百度语音识别Demo -- 简单应用
2017-10-15 02:52
519 查看
先到百度语音官网上查看集成指南
![](https://img-blog.csdn.net/20171015024954803?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbmFydXRvX3Bpbmc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
然后再去下载语音识别-离在线融合SDK(bd_speech_sdk_asr_v3.0.3.20170801_60da871.zip)
![](https://img-blog.csdn.net/20171015030233917?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbmFydXRvX3Bpbmc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
直接参考SDK中的ActivityMiniRecog类
这里,我就直接上代码了,我是在Android Studio 2.3.3 平台上编译的
1、app\build.gradle
2、AndroidManifest.xml
![](https://img-blog.csdn.net/20171015031439186?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbmFydXRvX3Bpbmc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
3、将SDK中的app/libs/bdasr_V3_20170801_60da871.jar 复制到您的项目的同名目录中。
4、将SDK中的app/src/main/jniLibs 下armeabi等5个目录,复制到您的项目的同名目录中。
![](https://img-blog.csdn.net/20171015031939206?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbmFydXRvX3Bpbmc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
5、activity_main.xml
6、MainActivity.java
7、asrfinishjson/AsrFinishJsonData.java
8、asrfinishjson\OriginResult.java
9、asrpartialjson\AsrPartialJsonData.java
10、asrpartialjson\OriginResult.java
11、asrpartialjson\Result.java
工程文件如下:
然后再去下载语音识别-离在线融合SDK(bd_speech_sdk_asr_v3.0.3.20170801_60da871.zip)
直接参考SDK中的ActivityMiniRecog类
这里,我就直接上代码了,我是在Android Studio 2.3.3 平台上编译的
1、app\build.gradle
apply plugin: 'com.android.application' android { compileSdkVersion 25 buildToolsVersion "26.0.1" defaultConfig { applicationId "com.sky.baiduspeechdemo" minSdkVersion 15 targetSdkVersion 25 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { //compile fileTree(dir: 'libs', include: ['*.jar']) compile fileTree(exclude: '*.bak', dir: 'libs') compile 'com.android.support:appcompat-v7:25.3.1' compile 'com.google.code.gson:gson:2.8.2' }
2、AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.sky.baiduspeechdemo"> <!-- begin: baidu speech sdk 权限 --> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- end: baidu speech sdk 权限 --> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <!-- APP_ID API_KEY SECRET_KEY--> <meta-data android:name="com.baidu.speech.APP_ID" android:value="替换成你申请的AppID"/> <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" /> <activity android:name=".MainActivity" android:configChanges="orientation|keyboardHidden|screenLayout" android:screenOrientation="portrait"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
3、将SDK中的app/libs/bdasr_V3_20170801_60da871.jar 复制到您的项目的同名目录中。
4、将SDK中的app/src/main/jniLibs 下armeabi等5个目录,复制到您的项目的同名目录中。
5、activity_main.xml
<?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:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.sky.baiduspeechdemo.MainActivity"> <Button android:id="@+id/btnStartRecord" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/start_record"/> <Button android:id="@+id/btnStopRecord" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/stop_record"/> <LinearLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="2" android:orientation="vertical"> <View android:layout_width="match_parent" android:layout_height="3dp" android:background="#000"/> <ScrollView android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/tvResult" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/parse_process" /> </ScrollView> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:orientation="vertical"> <View android:layout_width="match_parent" android:layout_height="3dp" android:background="#000"/> <ScrollView android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/tvParseResult" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/parse_result" /> </ScrollView> </LinearLayout> </LinearLayout>
6、MainActivity.java
package com.sky.baiduspeechdemo; import android.Manifest; import android.content.pm.PackageManager; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView; import com.baidu.speech.EventListener; import com.baidu.speech.EventManager; import com.baidu.speech.EventManagerFactory; import com.baidu.speech.asr.SpeechConstant; import com.google.gson.Gson; import com.sky.baiduspeechdemo.asrfinishjson.AsrFinishJsonData; import com.sky.baiduspeechdemo.asrpartialjson.AsrPartialJsonData; import org.json.JSONObject; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.Map; public class MainActivity extends AppCompatActivity implements EventListener { private static final String TAG = "MainActivity"; private Button btnStartRecord; private Button btnStopRecord; private TextView tvResult; private TextView tvParseResult; private EventManager asr; private boolean logTime = true; private String final_result; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); initPermission(); asr = EventManagerFactory.create(this, "asr"); asr.registerListener(this); // EventListener 中 onEvent方法 btnStartRecord.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { start(); } }); btnStopRecord.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { stop(); } }); } private void initView() { tvResult = (TextView) findViewById(R.id.tvResult); tvParseResult = (TextView) findViewById(R.id.tvParseResult); btnStartRecord = (Button) findViewById(R.id.btnStartRecord); btnStopRecord = (Button) findViewById(R.id.btnStopRecord); btnStopRecord.setVisibility(View.GONE); } /** * android 6.0 以上需要动态申请权限 */ private void initPermission() { String permissions[] = {Manifest.permission.RECORD_AUDIO, Manifest.permission.ACCESS_NETWORK_STATE, Manifest.permission.INTERNET, Manifest.permission.READ_PHONE_STATE, Manifest.permission.WRITE_EXTERNAL_STORAGE }; ArrayList<String> toApplyList = new ArrayList<String>(); for (String perm :permissions){ if (PackageManager.PERMISSION_GRANTED != ContextCompat.checkSelfPermission(this, perm)) { toApplyList.add(perm); //进入到这里代表没有权限. } } String tmpList[] = new String[toApplyList.size()]; if (!toApplyList.isEmpty()){ ActivityCompat.requestPermissions(this, toApplyList.toArray(tmpList), 123); } } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { // 此处为android 6.0以上动态授权的回调,用户自行实现。 } /* * EventListener 回调方法 * name:回调事件 * params: JSON数据,其格式如下: * * */ @Override public void onEvent(String name, String params, byte[] data, int offset, int length) { String result = ""; if (length > 0 && data.length > 0) { result += ", 语义解析结果:" + new String(data, offset, length); } if (name.equals(SpeechConstant.CALLBACK_EVENT_ASR_READY)) { // 引擎准备就绪,可以开始说话 result += "引擎准备就绪,可以开始说话"; } else if (name.equals(SpeechConstant.CALLBACK_EVENT_ASR_BEGIN)) { // 检测到用户的已经开始说话 result += "检测到用户的已经开始说话"; } else if (name.equals(SpeechConstant.CALLBACK_EVENT_ASR_END)) { // 检测到用户的已经停止说话 result += "检测到用户的已经停止说话"; if (params != null && !params.isEmpty()) { result += "params :" + params + "\n"; } } else if (name.equals(SpeechConstant.CALLBACK_EVENT_ASR_PARTIAL)) { // 临时识别结果, 长语音模式需要从此消息中取出结果 result += "识别临时识别结果"; if (params != null && !params.isEmpty()) { result += "params :" + params + "\n"; } // Log.d(TAG, "Temp Params:"+params); parseAsrPartialJsonData(params); } else if (name.equals(SpeechConstant.CALLBACK_EVENT_ASR_FINISH)) { // 识别结束, 最终识别结果或可能的错误 result += "识别结束"; btnStartRecord.setEnabled(true); asr.send(SpeechConstant.ASR_STOP, null, null, 0, 0); if (params != null && !params.isEmpty()) { result += "params :" + params + "\n"; } Log.d(TAG, "Result Params:"+params); parseAsrFinishJsonData(params); } printResult(result); } private void printResult(String text) { tvResult.append(text + "\n"); } private void start() { tvResult.setText(""); btnStartRecord.setEnabled(false) cf09 ; Map<String, Object> params = new LinkedHashMap<String, Object>(); String event = null; event = SpeechConstant.ASR_START; params.put(SpeechConstant.PID, 1536); // 默认1536 params.put(SpeechConstant.DECODER, 0); // 纯在线(默认) params.put(SpeechConstant.VAD, SpeechConstant.VAD_DNN); // 语音活动检测 params.put(SpeechConstant.VAD_ENDPOINT_TIMEOUT, 2000); // 不开启长语音。开启VAD尾点检测,即静音判断的毫秒数。建议设置800ms-3000ms params.put(SpeechConstant.ACCEPT_AUDIO_DATA, false);// 是否需要语音音频数据回调 params.put(SpeechConstant.ACCEPT_AUDIO_VOLUME, false);// 是否需要语音音量数据回调 String json = null; //可以替换成自己的json json = new JSONObject(params).toString(); // 这里可以替换成你需要测试的json asr.send(event, json, null, 0, 0); printResult("输入参数:" + json); } private void stop() { asr.send(SpeechConstant.ASR_STOP, null, null, 0, 0); } @Override protected void onDestroy() { super.onDestroy(); asr.send(SpeechConstant.ASR_CANCEL, "{}", null, 0, 0); } private void parseAsrPartialJsonData(String data) { Log.d(TAG, "parseAsrPartialJsonData data:"+data); Gson gson = new Gson(); AsrPartialJsonData jsonData = gson.fromJson(data, AsrPartialJsonData.class); String resultType = jsonData.getResult_type(); Log.d(TAG, "resultType:"+resultType); if(resultType != null && resultType.equals("final_result")){ final_result = jsonData.getBest_result(); // tvParseResult.setText("解析结果:" + final_result); } } private void parseAsrFinishJsonData(String data) { Log.d(TAG, "parseAsrFinishJsonData data:"+data); Gson gson = new Gson(); AsrFinishJsonData jsonData = gson.fromJson(data, AsrFinishJsonData.class); String desc = jsonData.getDesc(); if(desc !=null && desc.equals("Speech Recognize success.")){ tvParseResult.setText("解析结果:" + final_result); }else{ String errorCode = "\n错误码:" + jsonData.getError(); String errorSubCode = "\n错误子码:"+ jsonData.getSub_error(); String errorResult = errorCode + errorSubCode; tvParseResult.setText("解析错误,原因是:" + desc + "\n" + errorResult); } } }
7、asrfinishjson/AsrFinishJsonData.java
package com.sky.baiduspeechdemo.asrfinishjson; public class AsrFinishJsonData { private String error; private String sub_error; private String desc; private OriginResult origin_result; public String getError() { return error; } public String getSub_error() { return sub_error; } public String getDesc() { return desc; } public OriginResult getOrigin_result() { return origin_result; } }
8、asrfinishjson\OriginResult.java
package com.sky.baiduspeechdemo.asrfinishjson; public class OriginResult { private String error; private String sub_error; private String sn; private String desc; public String getSn() { return sn; } public String getDesc() { return desc; } public String getError() { return error; } public String getSub_error() { return sub_error; } }
9、asrpartialjson\AsrPartialJsonData.java
package com.sky.baiduspeechdemo.asrpartialjson; import java.util.ArrayList; public class AsrPartialJsonData { private ArrayList<String> results_recognition; private OriginResult origin_result; private String error; private String best_result; private String result_type; public ArrayList<String> getResults_recognition() { return results_recognition; } public OriginResult getOrigin_result() { return origin_result; } public String getBest_result() { return best_result; } public String getError() { return error; } public String getResult_type() { return result_type; } }
10、asrpartialjson\OriginResult.java
package com.sky.baiduspeechdemo.asrpartialjson; public class OriginResult { private String corpus_no; private String err_no; private String sn; private Result result; public Result getResult() { return result; } public String getCorpus_no() { return corpus_no; } public String getErr_no() { return err_no; } public String getSn() { return sn; } }
11、asrpartialjson\Result.java
package com.sky.baiduspeechdemo.asrpartialjson; import java.util.ArrayList; import java.util.List; public class Result { private ArrayList<String> uncertain_word; private ArrayList<String> word; public ArrayList<String> getUncertain_word() { return uncertain_word; } public ArrayList<String> getWord() { return word; } }
工程文件如下:
相关文章推荐
- Extjs应用tab页的最简单Demo
- Flex RemoteObject 简单应用Demo
- Managed DirectX中的DirectShow应用(简单Demo及源码)
- jquery demo - jquery表格插件flexigrid的java简单应用实例
- Extjs应用tab页的最简单Demo
- 概率神经网络 (PNN) 应用的简单DEMO
- 我的java学习路之循环学习应用demo2简单数学计算
- jsTree简单应用Demo
- Managed DirectX中的DirectShow应用(简单Demo及源码)
- jquery demo - jquery表格插件flexigrid的java简单应用实例
- 【自己的整理】socket.io官方demo|创建简单的聊天应用
- (插件设计与简单应用)php中钩子(hook)的应用示例demo
- 玩转百度语音识别,就是这么简单
- 玩转百度语音识别,就是这么简单
- 对象池的应用的简单Demo
- php 百度语音识别 REST API demo
- array高亮及替换(合并)与简单应用(文字背景)demo
- CyclicBarrier 简单的demo,思考应用场景
- ios 简单的rss 解析应用demo
- java版阿里云,百度ai,讯飞语音识别效果简单对比及demo