zoukankan      html  css  js  c++  java
  • 语音识别(二)

    div>

    百度公司推出语音识别An⁃droid SDK(离在线),给开发者提供一个语音识别的接口,通过云端的识别,给开发者返回识别结果,使开发者能够使用语音进行二次开发。语音控制具有非接触、非侵入性和易于使用的特点,是智能家居的一个新的方向。该设计是基于语音控制的智能家居系统,采用基于Android平台的移动设备作为控制终端,STM32 模块作为执行设备的主控板,通过服务器命令转发,实现了用语音命令通过Android移动设备对家居的设备控制。</
     
    语音唤醒功能。在此功能界面中,无须手动控制,通过检测关键词,唤醒语音识别功能。通过创建唤醒管理器,注册唤醒事件监听器,当有唤醒词出现时,进入处理事件,在处理事件中跳转到语音识别界面,启动录音,等待使用者说话,等语音输入结束,进行预处理,通过百度语音接口上传到服务器并获取识别出来的字符串。
     
     
    参考的demo中的"唤醒后识别", 就是比较费电^_
    使用demo中的"唤醒后识别", 这个只要没有主动释放, 就会一直处于被唤醒状态, 你试下官方demo就知道了
    使用的手机所以服务是一直在运行导致比较耗电,  智能音箱应该是有单独的低功耗模块识别唤醒
     

    百度语音所有功能免费,功能也比较简单实用,包括语音识别,语音合成和语音唤醒,正好可以组成一套完整的语音交互功能。

    百度语音的demo里给的语音唤醒是在onResume()开始唤醒监听,唤醒成功后在onPause()里就停止唤醒监听。

    而我现在要在唤醒成功后弹出语音识别的UI界面,所以弹出UI的同时就会停止唤醒监听。如果语音识别成功,UI界面消失,唤醒监听会重新开始,此时说出唤醒词即可重新唤醒。但是如果识别失败,封装好的UI界面会变成下图情况,这时候就要手动点击重试或者取消才可以,不符合全语音交互的理念。为了解决这个情况,要将停止(应该是开始吧?) 唤醒监听写到onStop()里,这样即使语音识别失败,也可以重新唤醒。

     
     
     

    接口使用及调用流程

    SDK调用过程如下:

    1. 初始化

      1.1.初始化EventManager类

      1.2.自定义输出事件类

      1.3.注册自己的输出事件类

      1.4.加载离线资源(如果需要离线命令词功能)

    2. 开始识别/唤醒

      2.1. 设置识别/唤醒输入参数

      2.2. 发送start开始事件

    3. 回调事件

      3.1. 开始回调事件

    4. 控制识别/唤醒

      4.1. 控制停止识别/唤醒,可以向SDK发送停止事件

      4.2. 取消本次识别,可以向SDK发送取消事件

    5. 事件管理器退出。

      5.1. 卸载离线资源(如果1.4加载离线资源)

      5.2. 释放资源

    在线识别调用流程

    SDK 的调用过程可以参见DEMO中的ActivityMiniRecog类

    集成时请确认已经复制或者修改了一下文件,一共4步:

    1. AndroidManifest.xml
    2. app/libs/bdasr_V3_xxxxx_xxxxx.jar
    3. app/src/main/jniLibs 下armeabi等5个目录
    4. 官网申请应用时的包名与build.gradle里一致,demo的包名是"com.baidu.speech.recognizerdemo"。这步没做会导致离线命令词或者唤醒报“no licence” 错误
    5. 运行时 getApplicationInfo().nativeLibraryDir 目录下查看是否有完整so文件。 特别是系统app需要手动push so文件到这个目录下。

    准备工作:

    百度AI开发平台下载语音识别sdk

    官网注册应用,将自己的包名填写在官网申请的应用(应该是包名!!!)

    AndroidManifest.xml  中是   包名
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.smartcar">

     appuild.gradle  中是    applicationId  (应用的唯一标识)

      defaultConfig {
     
    applicationId "xt.car" 

    开始向项目中集成百度语音接口:

    1.AndroidManifest.xml 文件

    设置权限(Application外

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

    设置APP_ID, APP_KEY, SECRET_KEY  (Application内

    <meta-data android:name="com.baidu.speech.APP_ID"
    android:value="××××××××××" />
    <meta-data
    android:name="com.baidu.speech.API_KEY"
    android:value="×××××××××××××" />
    <meta-data
    android:name="com.baidu.speech.SECRET_KEY"
    android:value="×××××××××××××" />
    <service android:name="com.baidu.speech.VoiceRecognitionService" android:exported="false" />

    2.bdasr_V3_xxxxxxxx_xxxx.jar 库

    将core/libs/bdasr_V3_xxxxx_xxxxx.jar 复制到您的项目的同名目录中。

    右击,add as library

    此时观察build.gradlemodule app)文件发现自动添加了如下一行  

      implementation files('libs\bdasr_V3_20191210_81acdf5.jar')

    3.复制NDK 架构目录     

    1. 将 core/src/main/jniLibs 下armeabi等包含so文件的5个目录,复制合并到您的项目的同名或者存放so的目录中。如果build.gradle中定义过jniLibs.srcDirs ,则复制合并到这个目录。
    2. 如与第三方库集成,至少要保留armeabi目录。如第三方库有7个架构目录,比语音识别SDK多出2个目录 mips和mips64,请将mips和mips64目录删除,剩下5个同名目录合并
    3. 如第三方库仅有armeabi这一个目录,请将语音识别SDK的额外4个目录如armeabi-v7a删除,合并armeabi目录下的so。 即目录取交集,so文件不可随意更改所属目录。
    4. 打包成apk文件,按照zip格式解压出libs目录可以验证。
    5. 运行时 getApplicationInfo().nativeLibraryDir 目录下查看是否有完整so文件。 特别是系统app需要手动push so文件到这个目录下。

    4.  .xml

    5.  MainActivity.java

    ————————————————————————————————————————————————————————

    识别输入事件

    ,以下参数均为SpeechConstant类的常量,如SpeechConstant.ASR_START**, 实际的String字面值可以参见SpeechConstant类或自行打印

    事件名类型场景描述
    ASR_START String
    (JSON结构的字符串)
    json内的参数
    见下文
    “ASR_START 参数”
    全部 开始一次识别。 注意不要连续调用ASR_START参数。下次调用需要在CALLBACK_EVENT_ASR_EXIT回调后,或者在ASR_CANCEL输入后。
    ASR_STOP     全部 停止录音
    ASR_CANCEL     全部 取消本次识别

    输出参数

    语音回调事件统一由 public void onEvent(String name, String params, byte[] data, int offset, int length) 该方法回调。其中name是回调事件, params是回调参数。(data,offset,length)缓存临时数据,三者一起,生效部分为 data[offset] 开始,长度为length。

    事件名(name)事件参数类型描述
    CALLBACK_EVENT
    _ASR_READY
          引擎准备就绪,可以开始说话
    CALLBACK_EVENT
    _ASR_BEGIN
          检测到第一句话说话开始。SDK只有第一句话说话开始的回调,没有长语音每句话说话结束的回调。
    CALLBACK_EVENT
    _ASR_END
          检测到第一句话说话结束。SDK只有第一句话说话结束的回调,没有长语音每句话说话结束的回调。
    CALLBACK_EVENT
    _ASR_PARTIAL
    params json   识别结果
      params[results_recognition] String[]   解析后的识别结果。如无特殊情况,请取第一个结果
      params[result_type] String partial_result 临时识别结果
      params[result_type] String final_result 最终结果,长语音每一句都有一个最终结果
      params[result_type] String nlu_result 语义结果,在final_result后回调。语义结果的内容在(data,offset,length中)
      (data,offset,length) String   语义结果的内容 ,当 params[result_type]=nlu_result时出现。
             
             
             
             
             
    CALLBACK_EVENT
    _ASR_EXIT
          识别结束,资源释放
             
    CALLBACK_EVENT
    _ASR_VOLUME
    params json   当前音量回调。必须输入ACCEPT_AUDIO_VOLUME参数激活
      params[volume] float   当前音量
      params[volume-percent] int   当前音量的相对值(0-100)

  • 相关阅读:
    Android 列表之分组ListView
    【转】容易忽视但是功能灰常强大的Java API
    onSaveInstanceState和onRestoreInstanceState的用处
    asp.net中url重写
    泛型数据类型转换
    关于 url重写后性能问题
    用CSS实现新闻轮播效果
    Java命名规范(简略)
    关于ngclass中添加多个样式类的解决方案
    python 常用标准库
  • 原文地址:https://www.cnblogs.com/xtxt1127/p/12462769.html
Copyright © 2011-2022 走看看