实现这个功能的目的,是我看见我公司硬件工程师给客户回答问题的时候用公司研发的APP,每次都是手动输入打字,看着他带着老花镜的样子,于心不忍,毕竟咱就是干这个的.

实现效果

集成 百度语音实时识别 https://ai.baidu.com/sdk#asr

AndroidManifest.xml 文件

   <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.WRITE_EXTERNAL_STORAGE" /><!-- 蓝牙录音使用,不需要可以去除 --><uses-permission android:name="android.permission.BROADCAST_STICKY" /><uses-permission android:name="android.permission.BLUETOOTH" /><uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /><uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"tools:ignore="GoogleAppIndexingWarning"><!-- 百度控制台申请的KEY --><meta-dataandroid:name="com.baidu.speech.APP_ID"android:value="22611822"/><meta-dataandroid:name="com.baidu.speech.API_KEY"android:value="YoR10GzzuZ58FYLpQ1utD5vy"/><meta-dataandroid:name="com.baidu.speech.SECRET_KEY"android:value="gGQvipUXC0dSSGmAQNMeHCMKTW4fGGrH"/><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application>

build.gradle

    packagingOptions{doNotStrip "*/*/libvad.dnn.so"doNotStrip "*/*/libbd_easr_s1_merge_normal_20151216.dat.so"}

集成jar包

dependencies {//...省略implementation files('libs\\bdasr_V3_20191210_81acdf5.jar')
}

到这里基本就可以集成了百度语音实时识别,但是这里有个坑.就是语音申请的时候得领取配额

一定要领取配额,不然一顿 4004,一开始我以为是集成错误导致了,包名检查了N次…

使用方法 这里我直接附上我写的代码了

    protected TextView txtResult;private EventManager asr;protected boolean enableOffline = false; // 测试Unit 2.0 功能,必须一直联网private EditText etText;private LinearLayout llView;private CustomPopWindow mCustomPopWindowCause;private TextView tvContent;private TextView tvState;private LinearLayout llClick;/** * 基于SDK集成2.2 发送开始事件 * 点击开始按钮 * 测试参数填在这里 */@SuppressLint("HandlerLeak")private void start() {Map<String, Object> params = new LinkedHashMap<String, Object>();String event = null;event = SpeechConstant.ASR_START; // 替换成测试的eventif (enableOffline) {params.put(SpeechConstant.DECODER, 2);}// 基于SDK集成2.1 设置识别参数params.put(SpeechConstant.ACCEPT_AUDIO_VOLUME, false);params.put(SpeechConstant.PID, 15374); // 或 19364 Unit 2.0 固定pid,仅支持中文普通话params.put(SpeechConstant.NLU, "enable");params.put(SpeechConstant.VAD_ENDPOINT_TIMEOUT, 0); // 长语音String json = null; // 可以替换成自己的jsonjson = new JSONObject(params).toString(); // 这里可以替换成你需要测试的jsonasr.send(event, json, null, 0, 0);Log.e("X000", json + "");}/** * 点击停止按钮 * 基于SDK集成4.1 发送停止事件 */private void stop() {asr.send(SpeechConstant.ASR_STOP, null, null, 0, 0); //}/** * enableOffline设为true时,在onCreate中调用 * 基于SDK离线命令词1.4 加载离线资源(离线时使用) */private void loadOfflineEngine() {Map<String, Object> params = new LinkedHashMap<String, Object>();params.put(SpeechConstant.DECODER, 2);params.put(SpeechConstant.ASR_OFFLINE_ENGINE_GRAMMER_FILE_PATH, "assets://baidu_speech_grammar.bsg");asr.send(SpeechConstant.ASR_KWS_LOAD_ENGINE, new JSONObject(params).toString(), null, 0, 0);}/** * enableOffline为true时,在onDestory中调用,与loadOfflineEngine对应 * 基于SDK集成5.1 卸载离线资源步骤(离线时使用) */private void unloadOfflineEngine() {asr.send(SpeechConstant.ASR_KWS_UNLOAD_ENGINE, null, null, 0, 0); //}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.common_mini);EventBus.getDefault().register(this);initView();initPermission();// 基于sdk集成1.1 初始化EventManager对象asr = EventManagerFactory.create(this, "asr");// 基于sdk集成1.3 注册自己的输出事件类asr.registerListener(this); // EventListener 中 onEvent方法if (enableOffline) {loadOfflineEngine(); // 测试离线命令词请开启, 测试 ASR_OFFLINE_ENGINE_GRAMMER_FILE_PATH 参数时开启}}// 基于sdk集成1.2 自定义输出事件类 EventListener 回调方法// 基于SDK集成3.1 开始回调事件@Overridepublic void onEvent(String name, String params, byte[] data, int offset, int length) {if (params != null && !params.isEmpty()) {try {JSONObject object = new JSONObject(params);JSONArray jsonArray = object.getJSONArray("results_recognition");StringBuffer str = new StringBuffer();if (jsonArray != null || jsonArray.length() != 0) {for (int i = 0; i < jsonArray.length(); i++) {String msg = jsonArray.getString(i);str.append(msg + " ");}tvContent.setText(str.toString());}} catch (JSONException e) {e.printStackTrace();}}}private void initView() {txtResult = (TextView) findViewById(R.id.txtResult);etText = findViewById(R.id.et_text);llView = findViewById(R.id.ll_layout);findViewById(R.id.btn_x).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {ShowVoice();}});}@Subscribe(threadMode = ThreadMode.MAIN)public void ConsultEvent(XYTextEvent item) {String context = item.getContext();String trim = etText.getText().toString().trim();if (!trim.isEmpty()) {etText.setText(trim + context);} else {etText.setText(context);}}/** * 展示语音 */@SuppressLint("ClickableViewAccessibility")private void ShowVoice() {final View contentView = LayoutInflater.from(MainActivity.this).inflate(R.layout.dialog_windows, null);mCustomPopWindowCause = new CustomPopWindow.PopupWindowBuilder(MainActivity.this).setView(contentView).enableBackgroundDark(true) //弹出popWindow时,背景是否变暗.setBgDarkAlpha(0.6f) // 控制亮度.enableOutsideTouchableDissmiss(true).create();mCustomPopWindowCause.showAtLocation(llView, Gravity.FILL, 0, 0);tvContent = contentView.findViewById(R.id.tv_content);tvState = contentView.findViewById(R.id.tv_state);llClick = contentView.findViewById(R.id.ll_click);//触摸手势事件llClick.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:tvState.setText("正在说...~");llClick.setBackgroundResource(R.drawable.ra_bg);start();break;case MotionEvent.ACTION_UP:tvState.setText("按住说话~");llClick.setBackgroundResource(R.drawable.re_bg);stop();EventBus.getDefault().post(new XYTextEvent(tvContent.getText().toString()));mCustomPopWindowCause.dissmiss();// etText.setText(tvContent.getText().toString());break;}return true;}});}/** * android 6.0 以上需要动态申请权限 */private void initPermission() {String permissions[] = {Manifest.permission.RECORD_AUDIO,Manifest.permission.ACCESS_NETWORK_STATE,Manifest.permission.INTERNET,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);}}@Overridepublic void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {// 此处为android 6.0以上动态授权的回调,用户自行实现。}@Overrideprotected void onPause() {super.onPause();asr.send(SpeechConstant.ASR_CANCEL, "{}", null, 0, 0);}@Overrideprotected void onDestroy() {super.onDestroy();// 基于SDK集成4.2 发送取消事件asr.send(SpeechConstant.ASR_CANCEL, "{}", null, 0, 0);if (enableOffline) {unloadOfflineEngine(); // 测试离线命令词请开启, 测试 ASR_OFFLINE_ENGINE_GRAMMER_FILE_PATH 参数时开启}// 基于SDK集成5.2 退出事件管理器// 必须与registerListener成对出现,否则可能造成内存泄露asr.unregisterListener(this);if (EventBus.getDefault().isRegistered(this))EventBus.getDefault().unregister(this);}

附带三方库

    implementation 'com.github.pinguo-zhouwei:CustomPopwindow:2.1.1'implementation 'org.greenrobot:eventbus:3.1.1'

后记 :功能实现了,老工程师很开心.他跟我说他之所以打字,是因为他在给客户回答问题的时候得思索一下… 至于语音输入功能,他说现在的输入法都有这个功能了.要不你打字的时候,试一下长按空格键…-_-||

Android集成百度语音识别相关推荐

  1. Android集成百度语音识别到HelloWorld需要注意什么?(保姆级教学)

    Android集成百度语音识别怎么避坑? 首先先放一张集成失败的图(记得一定要用真机,因为它不支持VAD,我这里使用Pixel2): 首先你去百度搜索"百度语音识别",或者点击我下 ...

  2. Android集成百度语音识别API

    创建应用 在百度AI开放平台(http://ai.baidu.com/)创建应用,选择语音识别接口 SDK下载 image.png 导入jar包和so库文件 (1)将DEMO中的/app/libs文件 ...

  3. android百度导航实现,Android 集成百度地图实现设备定位

    Android 集成百度地图实现设备定位 步骤1: 申请android 端SDK : http://lbsyun.baidu.com/ 步骤2: 下载基础版SDK 步骤3: 下载示例程序 步骤4: 开 ...

  4. Android 集成百度地图之申请TTS授权最新版

    Android 集成百度地图之申请TTS授权最新版. 前提:登录百度地图开放平台,且已创建好应用. 开发文档-Android 导航SDK-TTS授权申请. 这里有个坑,简单说下,进入http://yu ...

  5. Android集成百度定位以及导航详解

    Android集成百度定位以及导航详解                    百度地图Android SDK 官方下载地址:                            包括类参考.示例代码 ...

  6. Android集成百度定位,超详细,拒绝坑,附demo!!!

    众所周知,百度地图作为定位,地图,导航界的大佬之一,我们的项目中有这方面的需求,百度地图集成也是个不错的选择. 百度地图集成成本极低,首先,它免费,官网文档清晰,demo明确,但还是有很多人要才坑,正 ...

  7. Android 集成百度地图AR识别SDK(二)

    废话 今天我们开始集成百度地图AR识别SDK(后面简称AR SDK)的第二章,这一章我们主要讲Android Studio如何配置AR SDK 我们如果单单只看文档的话,很难看懂如何集成,我们需要结合 ...

  8. Android集成百度钱包

    老板要求集成百度钱包,刚听到这个消息的时候我是拒绝的,但是没办法,谁让我是小员工呢 接下来是我接入百度钱包时的流程(遇到的各种方方面面的问题和解决办法) 一 : 集成: 从官网上下载SDK(https ...

  9. android开发-百度语音识别Android SDK的简单使用

    目录 1.引言 2.开发环境 3.准备开发环境 3.1安装Android studio 3.2创建百度智能云平台应用 3.1下载百度语音识别SDK 4.实现语音识别的简单案例 4.1创建Android ...

最新文章

  1. Exchange 2003允许部分用户发送邮件到部分外网服务器
  2. Android Log工具类,Toast工具类,获取当前方法名称
  3. 如果谁和飞鸽传书讨论这两个问题
  4. 大年30还多少天_大美鹅老李告诉你30天的鹅需要多少温度?
  5. 【三边定位】 演示程序V0.1
  6. rsa解密的应用_安全-加解密
  7. MySQL之视图、触发器、事务、存储过程、函数
  8. java getreturntype_java.lang.reflect.Method.getGenericReturnType()方法示例
  9. 【PHP面向对象(OOP)编程入门教程】20.PHP5接口技术(interface)
  10. BAT中删除目录,如何不显示删除的文件
  11. jQuery、layer实现弹出层的打开、关闭功能实例详解
  12. JAAS(Java 认证和授权服务)
  13. 【linux内核分析与应用-陈莉君】IO空间管理
  14. xxl job踩坑记
  15. python利器app插件_python利器app
  16. 搭建表白墙 公众号_韶大表白墙 第十季 第75期 | 篮球共青杯决赛体教1班穿黑色衣服的0号...
  17. Ubuntu18.04 网卡问题解决(?)
  18. Not Shading英语翻译
  19. 一文搞懂Kiss、Yagni原则
  20. 很难找齐的常识(转收藏)

热门文章

  1. SQL Server-判断日期是否为周六 周日
  2. 浅谈单片机、ARM和DSP的异同
  3. 从0开始学习python7:Python中词频统计以及sort的排序用法
  4. Ed2k协议背景介绍及eMule协议的整体架构
  5. 时间、延迟以及延缓操作
  6. 微信小程序云数据库中实现分页
  7. http工作中常见的状态码
  8. 真的!?在阅读体验感上赢过微信读书?
  9. 戴尔电脑怎么安装一级计算机,戴尔电脑如何重装系统
  10. Android快递轨迹查询 “KD快递查询”