在线识别语音技术

  • 1. 开发背景
  • 2. 开发过程
    • 2.1 下载SDK
    • 2.2 熟悉源码
      • 2.2.1 初始化
      • 2.2.2 开始识别/唤醒
      • 2.2.3 回调事件
      • 2.2.4. 控制识别/唤醒
      • 2.2.5. 事件管理器退出
    • 2.3 SDK接入
      • 2.3.1 导入core 模块
      • 2.3.2 配置app依赖core
      • 2.3.3 测试及解决运行问题
      • 2.3.4 集成方法对比
    • 2.4 基于SDK集成开发
      • 2.4.1 配置AndroidManifest.xml 文件
        • a.设置权限
        • b.设置APP_ID, APP_KEY, SECRET_KEY及注意点
      • 2.4.2 Main.java
  • 3. 开发结果
    • 3.1.效果图
    • 3.2.简单展望

1. 开发背景

在AI席卷全球时,围绕语音交互的产品之争正愈演愈烈,苹果siri、亚马逊echo这些产品风靡全球的同时,国内外科技巨头、创业团队也在暗流涌动,各种智能音箱以及语音解决方案层出不穷。这种顺势发展的方式,造就了语音交互已经成为人工智能领域最成熟也是落地最快的技术。尤其是深度学习的起势,让语音识别、语音合成以及自然语言处理的发展速度提升到了一个新的高度。
    发展到现在各个公司平台语音识别技术都相当成熟,Android 平台现在主要是基于谷歌、科大讯飞、百度等较为主流的SDK进行开发。谷歌的话,在国内的环境是需要修改,且访问速度慢;科大讯飞的话,虽然也是国内的,但只有一段时间的试用期;最终选择百度,既方便使用,又是白嫖产品。

2. 开发过程

2.1 下载SDK

1)百度搜索 “语音识别技术” 点击第一个超链接进入主页面

2)主页面菜单栏下 开发与教学=>SDK下载

3)找到 “语音识别Android SDK” 进行下载,后续也可进入 “使用说明”,查看源码的使用方式。

2.2 熟悉源码

源代码提供的是一个在SDK的基础上封装了输入和输出格式的DEMO,主要由app、core、uiasr、uidialog这四个Module组成。其中core为核心且带有SDK的库,其下的 “ActivityMiniRecog类” (精简版识别,带有SDK唤醒运行的最少代码,仅仅展示如何调用)中的在线识别部分也是此次研究的重点。

参见DEMO中的ActivityMiniRecog类
SDK调用过程(在线识别)如下:

2.2.1 初始化

  • 1.初始化EventManager类
          SDK中,通过工厂创建语音识别的事件管理器。注意识别事件管理器只能维持一个,请勿同时使用多个实例。即创建一个新的识别事件管理器后,之前的那个置为null,并不再使用。
 EventManager asr = EventManagerFactory.create(this, "asr"); // this是Activity或其它Context类
  • 2.自定义输出事件类
          SDK中,需要实现EventListener的输出事件回调接口。该类需要处理SDK在识别过程中的回调事件。可以参考DEMO中对SDK的调用封装。
 EventListener yourListener = new EventListener() {@Overridepublic void onEvent(String name, String params, byte [] data, int offset, int length) {if(name.equals(SpeechConstant.CALLBACK_EVENT_ASR_READY)){// 引擎就绪,可以说话,一般在收到此事件后通过UI通知用户可以说话了}if(name.equals(SpeechConstant.CALLBACK_EVENT_ASR_PARTIAL)){// 一句话的临时结果,最终结果及语义结果}// ... 支持的输出事件和事件支持的事件参数见“输入和输出参数”一节}};
  • 3.注册自己的输出事件类
 asr.registerListener(yourListener);

2.2.2 开始识别/唤醒

  • 1.设置识别/唤醒输入参数
          SDK中,您需要根据文档或者demo确定您的输入参数。DEMO中有UI界面简化选择和测试过程。demo中,在点击“开始录音”按钮后,您可以在界面或者日志中看见ASR_START事件的json格式的参数。
  • 2.发送start开始事件
 asr.send(SpeechConstant.ASR_START, json, null, 0, 0);

2.2.3 回调事件

  • 1.开始回调事件
          回调事件在您实现的EventListener中获取。OnEvent方法中, name是输出事件名,params该事件的参数,(data,offset, length)三者一起组成额外数据。如回调的音频数据,从data[offset]开始至data[offset + length] 结束,长度为length。
 public void onEvent(String name, String params, byte [] data, int offset, int length);

2.2.4. 控制识别/唤醒

  • 1.控制停止识别/唤醒,可以向SDK发送停止事件
 asr.send(SpeechConstant.ASR_STOP, null, null, 0, 0); //发送停止录音事件,提前结束录音等待识别结果
  • 2.取消本次识别,可以向SDK发送取消事件
 asr.send(SpeechConstant.ASR_CANCEL null, null, 0, 0); //发送停止录音事件,提前结束录音等待识别结果

2.2.5. 事件管理器退出

  • 1.释放资源
 asr.unregisterListener(this);

2.3 SDK接入

demo 根目录下有doc_integration_DOCUMENT目录,里面有demo的测试图文教程和集成图文教程。其中 “ASR-INTEGRATION-helloworld-V3.01.docx” 中描述了如何集成Android识别SDK到新项目。

2.3.1 导入core 模块

  • 1.导入demo的core module


        此时查看项目目录下的settings.gradle, 可以看见core module已经被加载,同时可以看见core目录的图标。

2.3.2 配置app依赖core

  • 1.右击app目录选择Open Module Settings
  • 2.在打开的界面选择Dependencies.然后选择app----+号-----选择3 Module Dependency

  • 3.在弹出的界面勾选core后点击OK


        此时观察build.gradle(module :app)文件,发现自动添加了如下一行implementation project(path: ‘:core’)。

        并根据core/build.gradle(module :core)更改app/build.gradle(module :app)部分版本号。至此,成功集成。

2.3.3 测试及解决运行问题

修改app/java/com.baidu.speech.recognizerdemo/MainActivity.java,集成完毕,直接启动app即可测试。

  • 运行app时可能会出现下面这个问题
 Compatible side by side NDK version was not found. Default is 20.0.5594570.
  • *解决方法:tools–>sdk manager–>Android sdk–>sdk tools–>show package detail–>找到相对应NDK

2.3.4 集成方法对比

网上还有一种分别在新项目的 core/libs和新项目下新建一个core/src/main/jniLibs文件夹中导入jar和.so库的集成操作。但这种操作比起上述详细说明的操作,在我看来相对更为复杂,且容易出错。

2.4 基于SDK集成开发

主要是对 core模块中的 “ActivityMiniRecog类” 进行仿写。

2.4.1 配置AndroidManifest.xml 文件

a.设置权限

<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" />

b.设置APP_ID, APP_KEY, SECRET_KEY及注意点

 <meta-data android:name="com.baidu.speech.APP_ID"android:value="15590577" /><meta-dataandroid:name="com.baidu.speech.API_KEY"android:value="q2uPyBe6LmWTZlvb0g1dzcHV" /><meta-dataandroid:name="com.baidu.speech.SECRET_KEY"android:value="y7S7hAI894BB3LF1yHYmvQEus1B6wPvj" />
  • 关于APP_ID, APP_KEY, SECRET_KEY的使用,许多网上的教程说要到百度上去注册账号,然后创建应用啥的,但如果只是简单的做个demo的话,完全没有必要。可以在demo的core\src\main\AndroidManifest.xml中找到包名ApplicationId:com.baidu.speech.recognizerdemo(官方提供)的上述信息,进行简单使用。

2.4.2 Main.java

package com.example.speechtest;import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;import com.baidu.speech.EventListener;
import com.baidu.speech.EventManager;
import com.baidu.speech.EventManagerFactory;
import com.baidu.speech.asr.SpeechConstant;import org.json.JSONException;
import org.json.JSONObject;import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.Map;// 继承百度内部的监听
public class Main extends AppCompatActivity implements EventListener {protected EditText Result;protected Button btn;// 设置事件管理器private EventManager asr;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 动态申请权限initPermission();// 基于sdk集成1.1 初始化EventManager对象 设置自定义监听asr = EventManagerFactory.create(this, "asr");// 基于sdk集成1.3 注册自己的输出事件类asr.registerListener(this);Result = findViewById(R.id.EditView);btn = findViewById(R.id.button);btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast toast = Toast.makeText(getApplicationContext(),"开始识别",Toast.LENGTH_LONG);toast.show();start();}});}/*** 基于SDK集成2.2 发送开始事件* 点击开始按钮*/private void start(){Map<String, Object> params = new LinkedHashMap<String, Object>();// 基于SDK集成2.1 设置识别参数params.put(SpeechConstant.ACCEPT_AUDIO_VOLUME, false);String json = null; // 可以替换成自己的jsonjson = new JSONObject(params).toString(); // 这里可以替换成你需要测试的json// 基于SDK集成2.2 发送start开始事件asr.send(SpeechConstant.ASR_START, json, null, 0, 0);}/**基于sdk集成1.2 自定义输出事件类*EventListener 回调方法*/@Overridepublic void onEvent(String name, String params, byte[] data, int offset, int length) {if (SpeechConstant.CALLBACK_EVENT_ASR_PARTIAL.equals(name)){// 识别相关的结果都在这里CALLBACK_EVENT_ASR_PARTIALtry {// 结果类型result_type(临时结果partial_result,最终结果final_result)// best_result最佳结果参数//在2.2熟悉源码的2.2.1设置识别/唤醒输入参数中可查看原始JsonJSONObject object = new JSONObject(params);String result = object.getString("best_result");String resultType = object.getString("result_type");// 判断识别是否结束if ("final_result".equals(resultType)){Result.setText(result);Toast toast = Toast.makeText(getApplicationContext(),"识别已结束",Toast.LENGTH_SHORT);toast.show();}} catch (JSONException e) {e.printStackTrace();}}}/*** android 6.0 以上需要动态申请权限* (以下可直接从ActivityMiniRecog类中复制)*/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以上动态授权的回调,用户自行实现。}
}

3. 开发结果

3.1.效果图

  • 初始界面:
  • 开始识别
  • 识别结束

3.2.简单展望

简单熟悉了对在线语音识别的操作后,发现其应用是十分广泛的。最简单的例子就是可以应用于期末大作业NotePad的扩展应用语音搜索上,然后复杂些的,基于SDK进行封装输入和输出格式等,应用在手机语音助手,智能家具,机器人等等上。语音交互的发展越来越好,人们也在人机合一的道路上前进了一大步。

参考资料:
(官网)短语语音识别-Android-SDK使用说明
demo/doc_integration_DOCUMENT/ASR-INTEGRATION-helloworld-V3.01.docx

百度语音识别——在线识别相关推荐

  1. 跨平台Android和IOS百度语音在线识别原生插件

    一.插件推荐 跨平台Office文档.图片在线预览,视频播放原生插件 Android和IOS图片在线预览,视频播放原生插件 跨平台Android和IOS百度OCR文字识别.证卡识别.票据识别原生插件 ...

  2. 通过百度语音在线识别控制灯和播放本地音乐

    参考链接:https://blog.csdn.net/qazwyc/article/details/57153734 本文所有代码链接:https://pan.baidu.com/s/1LT5LBkO ...

  3. java+百度语音识别(语音助手)

    文章目录 项目实施图 java实时录音 java文字转语音 百度AI账号注册 百度AI接口调用 项目中应用 具体实现效果 程序缺点 因为小项目是基于:java学生管理系统(百度人脸识别 + Swing ...

  4. 百度Android在线语音识别SDK用法

    百度Android语音识别SDK分在线与离线两种,这篇文章介绍在线SDK的用法. 在线SDK是以JAR包和动态链接库形式公布和使用,能够从百度开放云平台站点中下载SDK及使用说明文档. 完毕语音SDK ...

  5. 百度语音识别技术负责人李先刚:如何利用Deep CNN大幅提升识别准确率?

     百度语音识别技术负责人李先刚:如何利用Deep CNN大幅提升识别准确率? 机器之心mp 2016-11-04 14:24:34 技术 百度 阅读(440) 评论(0) 机器之心原创 作者:赵云 ...

  6. 百度语音识别之拼音识别

    这篇文章是基于之前的百度语音识别集成到Fragment篇拓展来的,不会可以先点开看看. 首先先下载一个工具包链接:复制以下链接下载,名字如下 https://pan.baidu.com/s/1wgJo ...

  7. python识别英语语音翻译器_Python结合百度语音识别实现实时翻译软件的实现

    一.所需库安装 pip install PyAudio pip install SpeechRecognition pip install baidu-aip pip install Wave pip ...

  8. 基于springboot+h5+websocket的即时通讯客服系统和百度实时语音转译(语音在线识别)

    本文章由本人原创 下载链接:https://download.csdn.net/download/u014191624/51948075 这是一个基于springboot+h5+websocket的即 ...

  9. 基于百度OCR的网站验证码在线识别

    0.问题: 动态识别网站验证码以便后续操作 1.思路: 1.1.获取验证码图片 1.2.使用百度OCR接口在线识别验证码 2.实现: 2.1.获取验证码图片 2.1.1使用webdriver模拟浏览器 ...

最新文章

  1. python打印浮点数_python怎么输出浮点数
  2. 今日 Paper | 多人线性模型;身体捕捉;会话问答;自然语言解析;神经语义
  3. linux部署安装nexus私服
  4. 区分:AndroidDriver, iOSDriver, AppiumDriver and Remote WebDriver
  5. jvm 调优_Java架构—JVM调优
  6. 字王谈M1字形与个人云字库
  7. C#动态链接库的创建及使用
  8. Requests库基本使用
  9. Cookies 、 Session 和 token 的区别
  10. 由捧哏巨匠谈创新的难度
  11. oracle8i odac for c,ODAC112021Xcopy for 32位
  12. android wp主题,WP主题:ebou4
  13. 申请苹果个人开发者经历
  14. 自用win软件小合集
  15. 简单分享,阿里巴巴测试岗4轮面经(已拿34K+ offer)
  16. 方舟linux服务器更新,方舟怎么更新服务器版本 | 手游网游页游攻略大全
  17. ai智能电话机器人语音识别技术
  18. c语言编程杨辉三角形流程图,使用c语言输出杨辉三角形的简单方法
  19. 图像形态学处理(3)
  20. 7-3 最长公共前后缀

热门文章

  1. 赛迪顾问发布区块链研判报告
  2. CMDB与DevOps的集成
  3. 【javascript】高级语法——严格模式(详解)
  4. 海信鸿蒙系统下载,鸿蒙系统 - 建议|申诉建议 花粉俱乐部
  5. crc32 mysql_mysql使用crc32字段建索引提高查询效率
  6. 美国计算机加音乐专业,卡内基梅隆大学音乐与技术本科专业 让音乐无限可能!...
  7. What’s the difference between Taxonomies and Ontologies? - Ask Dr. Search
  8. mysql has gone_导致“mysql has gone away”的两种情况
  9. 学习 PixiJS — 粒子效果
  10. Vue3后台管理系统模板推荐