Android SDK

一. 在线ASR 概述

DUI Lite SDK 为您提供易用的 API 来接入经由强大的深度网络模型优化的语音转文字能力。

DUI Lite SDK 支持 Android 和 iOS 平台的 DUI 语音 API 接入,您通过集成 DUI Lite SDK 获取从音频采集到识别的全流程支持。

结合DUI平台强大的可定制语言模型的特性,您可以通过上传说法和词表的方式,对偏僻的说法以及相关内容的识别效果进行优化。

二. SDK使用说明

使用当前功能时,请先授权,否则禁止使用。请参考 授权说明

2.1 准备

jar:DUI-lite-SDK-for-Android-xxx.jar

so:libvad.so  libduiutils.so  libopusogg.so

资源:具体使用到的资源请参考 demo,可以放在assets目录中,也可以自己手动放在磁盘中,比如/sdcard/

三. 功能特性

3.1 识别模式

  1. 一段语音结束后,反馈识别结果
  2. 实时反馈识别结果,开口说话时,当部分识别结果就绪后,能立即展示该部分结果

3.2 音频压缩

可选 ogg、 ogg_opus 、mp3 和 wav 4种格式音频上传服务器识别,压缩格式(ogg,ogg_opus)可大幅减少数据传输大小

3.3 内置录音机

DUI Lite SDK - ASR 内置录音功能,可采集麦克风数据,减少开发工作量

3.4 VAD(语音活动检测)

可选开启 vad,这样只上传有语音部分的音频数据,可减少网络传输数据

3.5 说法和词库

您可在 DUI开放平台 上传说法和词库,提高识别准确率

 

四. 性能指标

用户用15.08秒说了一句话  "苏州思必驰信息科技有限公司是一家语音技术公司专注于将领先的系列智能语音技术应用于移动互联智能设备客户联络中心等行业",使用 ogg 格式压缩音频后上传服务器

 
性能说明
用时

语音总计 15.08秒,音频边说边上传,从说完最后一个字到服务器返回识别结果约 0.4秒时间(识别速度与网络状况关系较大)

cpu cpu 大部分时间占用 1% 左右,在线识别只在将音频转成 ogg 或者 ogg_opus 时才会有一定的计算量,cpu占用 5% 左右
内存 java app heap 大约使用 3.5M
网络 使用 ogg 格式压缩音频后上传服务器,上传音频大小 55.9KB 。

五. 引擎运行流程图

六. 使用示例

涉及引擎类:AICloudASREngine,按照以下步骤构建你的云端识别应用,详细使用示例请参考 demo,更多的接口请参照Javadoc

6.1 配置AICloudASRConfig 参数

AICloudASRConfig config = new AICloudASRConfig();
config.setLocalVadEnable(true);
config.setVadResource(SampleConstants.VAD_RES);

可配置参数表格如下:

参数名 取值 说明 是否必须 默认值
setLocalVadEnable(boolean localVadEnable) true/false 配置vad true
setVadResource(String vadResource)

1. 如在 sd 里设置为绝对路径 如/sdcard/speech/***.bin

2. 如在 assets 里设置为名称

配置vad资源 如果使用vad,则必须设置此属性 NA
setMaxMessageQueueSize(int maxMessageQueueSize)

-1使用授权时配置的数值

0表示不限制长度,建议实际使用长度大于100

在设备性能不好的设备上可以设置消息队列最大长度,防止算力不够导致内核无法及时处理完音频数据而导致内存过大的问题 -1
setUseVprint(boolean useVprint)

true/false

打开后需要在com.aispeech.export.intent.AICloudASRIntent AICloudASRIntent 加上需要验证的声纹信息 false


6.2 实现回调接口

private class AICloudASRListenerImpl implements AIASRListener {
  
      @Override
      public void onReadyForSpeech() {
          Log.d(TAG, "语音引擎就绪,用户可以说话");
      }
  
      @Override
      public void onBeginningOfSpeech() {
          Log.d(TAG, "检测到用户开始说话");
      }
  
      @Override
      public void onEndOfSpeech() {
          Log.d(TAG, "用户停止说话");
      }
  
      @Override
      public void onRmsChanged(float rmsdB) {
          Log.d(TAG, "音频音量发生改变");
      }
  
      @Override
      public void onError(AIError error) {
          Log.e(Tag, "error:" + error.toString());
      }
  
      @Override
      public void onResults(AIResult results) {
          if (results.isLast()) {
              if (results.getResultType() == AIConstant.AIENGINE_MESSAGE_TYPE_JSON) {
                  Log.i(Tag, "result JSON = " + results.getResultObject().toString());
                  // 可以使用JSONResultParser来解析识别结果
                  // 结果按概率由大到小排序
                  JSONResultParser parser = new JSONResultParser(results.getResultObject()
                          .toString());
                  Log.d(TAG, "识别结果为 :  " + parser.getText() + "\n");
                  Log.d(TAG, "识别结果为 :  " + results.getResultObject().toString());
              }
          }
      }
  
      @Override
      public void onInit(int status) {
          Log.i(Tag, "Init result " + status);
          if (status == AIConstant.OPT_SUCCESS) {
              Log.d(TAG, "初始化成功!");
          } else {
              Log.d(TAG, "初始化失败!code:" + status);
          }
      }
  
    @Override
    public void onBufferReceived(byte[] buffer) {
        // TODO Auto-generated method stub
        Log.d(TAG, "录音机音频数据");
    }
  }

 

6.3 初始化engine并且传入回调接口

mEngine = AICloudASREngine.createInstance();
mEngine.init(config, new AICloudASRListenerImpl());

部分方法如下,获取全部参数请参考 Javadoc

方法名 方法释义 备注
createInstance() 创建实例 非单例模式
init(AICloudASRConfig config, final AIASRListener listener) 初始化engine config 与 listener参照6.1与6.2说明
start(AICloudASRIntent aICloudASRIntent) 启动录音,开始语音识别 intent属性参考6.4或者Javadoc
stop() 停止录音,等待识别结果  
feedData(byte[] data, int size) 传入数据,data 音频数据流,size 音频数据大小 不使用SDK录音机的情况下调用
cancel() 取消本次识别操作  
destroy() 销毁云端识别引擎  
getCurrentState() 获取当前的engine状态

STATE_IDLE:空闲状态

STATE_NEWED:初始化完毕等待就绪状态

STATE_RUNNING:录音中或运行中状态

STATE_WAITING:录音停止,等待结果状态

STATE_ERROR:错误状态

STATE_CANCELED:取消状态

 

6.4 配置启动属性并启动识别

实例化intent并启动识别,参考代码如下:

AICloudASRIntent aICloudASRIntent = new AICloudASRIntent();
aiCloudASRIntent.setResourceType("aihome");//设置识别引擎的资源类型,默认为comm
aiCloudASRIntent.setEnableNumberConvert(true);//设置启用识别结果汉字数字转阿拉伯数字功能
aiCloudASRIntent.setEnableSNTime(true);//设置rec结果增加对齐信息接口
aiCloudASRIntent.setCloudVadEnable(true);//设置是否开启服务端的vad功能,默认开启为true
//aICloudASRIntent.setEnableTone(false);//设置音调功能接口
//aICloudASRIntent.setEnableLanguageClassifier(false);//设置语言分类功能接口

List<String> customWakeupWord = new ArrayList<>();
customWakeupWord.add("你好晓乐");
// 设置自定义唤醒词
aiCloudASRIntent.setCustomWakeupWord(customWakeupWord);

mEngine.start(aiCloudASRIntent);

常用intent参数如下表,全部参数请查阅 Javadoc

方法名 方法释义 备注
setEnableEmotion(boolean enableEmotion) 是否开启情感识别 默认false
setFespxEngine(IFespxEngine fespxEngine) 设置关联 IFespxEngine 实例,只在使用内部录音机且多麦模式下才需要设置  
setNoSpeechTimeOut(int milliSecond) 设置无语音超时时长,单位毫秒;如果达到该设置值时,自动停止录音 默认值为5000ms,设置0表示不进行语音超时判断
setMaxSpeechTimeS(int seconds) 设置音频最大录音时长,达到该值将取消语音引擎并抛出异常,单位s 默认值为60s,最大的录音时长为60s,设置0代表不进行录音时长判断
setSaveAudioPath(String saveAudioPath) 设置保存的音频路径 最终的音频路径为path + recordId + ".type"
setSaveAudioPath(String saveAudioPath, boolean saveOriginalAudio) 设置保存的音频路径 是否保存从start到stop所有的音频,default is false
setWaitingTimeout(int waitingTimeout) 设置等待识别结果超时时间 单位毫秒,小于或等于0则不设置超时,默认5000ms
setUseOneShot(boolean useOneShot) 是否使用oneshot功能,即唤醒后立马起识别 默认false
setUseOneShot(boolean useOneShot, int intervalTimeThresh) 设置是否使用oneshot功能,以及oneshot功能的唤醒词和命令词之间的时间间隔阈值,如果小于该阈值,就认为是oneshot,如果大于该阈值,就认为不是oneshot useOneShot默认false,intervalTimeThresh默认600ms
setPauseTime(int pauseTime) 设置VAD右边界 单位为ms,默认为300ms
setLmList(String[] lmList) 设置用户定制的语言模型列表  
setServer(String server) 设置服务器地址 默认不用设置
setUserId(String userId) 设置用户id  
setLmId(String lmId) 设置识别lmid 无默认值,可用custom lmid
setEnablePunctuation(boolean enablePunctuation) 设置是否启用标点符号识别 默认false
setEnableNumberConvert(boolean enableNumberConvert) 设置是否启用识别结果汉字数字转阿拉伯数字功能 默认false
setSelfCustomWakeupScore(int selfCustomWakeupScore) 设置自定义唤醒词得分 默认为0
setCustomWakeupWord(List<String> customWakeupWord) 设置自定义唤醒词,可用于过滤和指定唤醒词识别比如 ["你好小乐","你好小白"] 无默认唤醒词
setCustomWakeupWord(List<String> customWakeupWord, boolean filter) 设置自定义唤醒词和 是否过滤句首唤醒词,用于 oneshot 功能。 默认false,无默认唤醒词;效果:比如音频输入为"你好小驰,今天天气怎么样",filter 为 true 后识别结果即为"今天天气怎么样"
setEnableTone(boolean enableTone) 设置音调功能 默认false
setEnableLanguageClassifier(boolean enableLanguageClassifier) 设置语言分类功能 默认false
setEnableSNTime(boolean enableSNTime) 设置rec结果增加对齐信息 默认false(关闭)
setResourceType(String type) 设置识别引擎的资源类型 默认为comm,可取 airobot, aihome, custom
setRealback(boolean realback) 设置是否使用实时反馈功能 默认false
setCloudVadEnable(boolean cloudVadEnable) 设置是否开启服务端的vad功能,一般近场关闭,远场打开 默认为true
setUseCustomFeed(boolean useCustomFeed) 设置是否自行feed数据,不使用内部录音机(包括MockRecord和AIAudioRecord) 默认false
setUseCustomFeed(boolean useCustomFeed, boolean encodedAudio) 设置是否自行feed数据,设置是否encode对应音频 默认都是false
setAudioType(PCM_ENCODE_TYPE audioType) 设置 PCM 编码成其它格式,以减小传输大小。云端识别需要将PCM音频编译成其它音频格式发送给服务器。 默认PCM_ENCODE_TYPE.OGG,可取 OGG_OPUS,WAV,MP3,OPUS
setEnableConfidence(boolean enableConfidence) 设置置信度 默认为true

 

6.5 销毁对象

识别完成或者功能使用之后记得在合适的位置销毁engine。

mEngine.stop();
mEngine.destroy();

6.6 完整示例代码

AICloudASREngine
AICloudASREngine mEngine;
AICloudASRConfig config = new AICloudASRConfig();
config.setLocalVadEnable(true);
config.setVadResource(SampleConstants.VAD_RES);

mEngine = AICloudASREngine.createInstance();
mEngine.init(config, new AICloudASRListenerImpl());



AICloudASRIntent aICloudASRIntent = new AICloudASRIntent();
aICloudASRIntent.setServer("wss://asr.dui.ai/runtime/v2/recognize");//设置服务器地址,默认不用设置
aICloudASRIntent.setEnablePunctuation(false);//设置是否启用标点符号识别,默认为false关闭
aICloudASRIntent.setResourceType("aihome");//设置识别引擎的资源类型,默认为comm
aICloudASRIntent.setCloudVadEnable(false);
aICloudASRIntent.setEnableNumberConvert(true);//设置启用识别结果汉字数字转阿拉伯数字功能
aICloudASRIntent.setEnableSNTime(true);//设置rec结果增加对齐信息接口
aICloudASRIntent.setCloudVadEnable(true);//设置是否开启服务端的vad功能,默认开启为true
// aICloudASRIntent.setEnableTone(false);//设置音调功能接口
// aICloudASRIntent.setEnableLanguageClassifier(false);//设置语言分类功能接口

List<String> customWakeupWord = new ArrayList<>();
customWakeupWord.add("你好晓乐");
// 设置自定义唤醒词,是否过滤唤醒词,默认为false,不过滤
aICloudASRIntent.setCustomWakeupWord(customWakeupWord);
// 设置自定义唤醒词,是否过滤唤醒词,默认为false,不过滤
// aICloudASRIntent.setCustomWakeupWord(customWakeupWord,true);

aICloudASRIntent.setPauseTime(500);
aICloudASRIntent.setWaitingTimeout(5000);//设置等待识别结果超时时长,默认5000ms
aICloudASRIntent.setNoSpeechTimeOut(0);
aICloudASRIntent.setSaveAudioPath("/sdcard/aispeech");//保存的音频路径,格式为.ogg
// aICloudASRIntent.setMaxSpeechTimeS(0);//音频最大录音时长

mEngine.start(aICloudASRIntent);


mEngine.stop();
mEngine.destroy();


private class AICloudASRListenerImpl implements AIASRListener {
  
      @Override
      public void onReadyForSpeech() {
          Log.d(TAG, "语音引擎就绪,用户可以说话");
      }
  
      @Override
      public void onBeginningOfSpeech() {
          Log.d(TAG, "检测到用户开始说话");
      }
  
      @Override
      public void onEndOfSpeech() {
          Log.d(TAG, "用户停止说话");
      }
  
      @Override
      public void onRmsChanged(float rmsdB) {
          Log.d(TAG, "音频音量发生改变");
      }
  
      @Override
      public void onError(AIError error) {
          Log.e(Tag, "error:" + error.toString());
      }
  
      @Override
      public void onResults(AIResult results) {
          if (results.isLast()) {
              if (results.getResultType() == AIConstant.AIENGINE_MESSAGE_TYPE_JSON) {
                  Log.i(Tag, "result JSON = " + results.getResultObject().toString());
                  // 可以使用JSONResultParser来解析识别结果
                  // 结果按概率由大到小排序
                  JSONResultParser parser = new JSONResultParser(results.getResultObject()
                          .toString());
                  Log.d(TAG, "识别结果为 :  " + parser.getText() + "\n");
                  Log.d(TAG, "识别结果为 :  " + results.getResultObject().toString());
              }
          }
      }
  
      @Override
      public void onInit(int status) {
          Log.i(Tag, "Init result " + status);
          if (status == AIConstant.OPT_SUCCESS) {
              Log.d(TAG, "初始化成功!");
          } else {
              Log.d(TAG, "初始化失败!code:" + status);
          }
      }
  
    @Override
    public void onBufferReceived(byte[] buffer) {
        // TODO Auto-generated method stub
        Log.d(TAG, "录音机音频数据");
    }
  }

七. 错误码

DUI Lite 2.0 - 错误码

 

八. 接口文档

 

更多的接口内容与描述请参阅 javadoc