本地语音唤醒(Android)

一. 唤醒 SDK概述

Wakeup 提供单独的离线语音唤醒能力,通过不间断侦测语音,当出现唤醒词的语音时可执行相关事件的技术,具有功耗低、唤醒率高的特点。可以设置自定义唤醒词。

二. SDK使用说明

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

2.1 准备

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

so:libwakeup.so

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

三. 引擎运行流程图

四. 示例代码

涉及引擎类:AIWakeupEngine,详细使用示例请参考 demo

4.1 配置config信息

AIWakeupConfig config = new AIWakeupConfig();
config.setWakeupResource(SampleConstants.WAKEUP_RES);

部分配置信息如下:

方法 方法说明 参数说明 默认值 备注
setWakeupResource(String wakeupResource) 设置唤醒资源

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

2. 如在 assets 里设置为名称

NA NA
setOneShotCacheTime(int oneShotCacheTime) 设置oneshot功能下需要缓存的音频时长,根据具体的硬件性能和唤醒词长度调节。 单位毫秒 1200ms NA

 

4.2 实现唤醒回调接口

// 回调方法
private class AISpeechListenerImpl implements AIWakeupListener {

    @Override
    public void onError(AIError error) {
        Log.e(TAG, "error " + error.toString());
    }

    @Override
    public void onInit(final int status) {
        Log.i(TAG, "Init result " + status);
        if (status == AIConstant.OPT_SUCCESS) {
            Log.i(TAG, "初始化成功");
        } else {
            Log.i(TAG, "初始化失败!code:" + status);
        }
    }


    @Override
    public void onWakeup(String recordId, final double confidence, final String wakeupWord) {
        Log.d(TAG, "\n唤醒成功  wakeupWord = " + wakeupWord + "  confidence = " + confidence);
        //在这里启动其他引擎,比如tts或者识别
    }

    @Override
    public void onReadyForSpeech() {
        Log.d(TAG, "onReadyForSpeech: ");
    }


    @Override
    public void onResultDataReceived(byte[] buffer, int size) {

    }

    @Override
    public void onRawDataReceived(byte[] buffer, int size) {

    }

}

 

4.3 实例化唤醒引擎并初始化

AIWakeupEngine mEngine;
mEngine = AIWakeupEngine.createInstance();
mEngine.init(config, new AISpeechListenerImpl());

AIWakeupEngine部分方法如下表所示

方法 方法说明 参数说明 默认值 备注
createInstance() 创建唤醒实例 NA NA 静态方法,非单例
init(AIWakeupConfig config, AIWakeupListener listener) 初始化引擎

config :配置参数

listener:回调方法

NA NA
setDynamicParam(String[] pinyin, float[] thresh) 动态调整参数,目前只支持更新唤醒词的thresh

pinyin 唤醒词,必须在AIWakeupIntent设置过,参数示例:["ni hao xiao chi"]

thresh 唤醒词对应的阈值,参数示例:[0.2]

NA NA
feedData(byte[] data, int size) 自行feed音频数据,不使用内部录音机时可用

data 音频数据

size 音频数据大小

NA NA
start(AIWakeupIntent aiWakeupIntent) 开启唤醒,如果使用内部录音机的话一并开启

aiWakeupIntent 配置参数

NA NA
stop() 关闭唤醒,如果使用内部录音机的话一并关闭

NA

NA NA
forceRequestWakeupResult() 强制请求唤醒结果,即使没有唤醒也会给出唤醒词为null的结果

NA

NA NA
destroy() 销毁唤醒内核和录音机

NA

NA NA

更详细的使用请参考 Javadoc

 

4.4 配置intent并开启唤醒

AIWakeupIntent intent = new AIWakeupIntent();
intent.setWakeupWord(new String[]{"ni hao xiao chi"}, new float[]{0.1f});
mEngine.start(intent);

部分intent配置如下表

方法 方法说明 参数说明 默认值 备注
setUseOneShot(boolean useOneShot)

设置是否使用 oneshot 功能

oneshot 功能即 唤醒词+命令词,如用户说:你好小弛,打开设置。

“你好小弛”是唤醒词,唤醒回调触发,此时使用 asr识别,可以识别出“打开设置”

true/false false NA
setInputContinuousAudio(boolean inputContinuousAudio) 设置是否输入实时的长音频,默认接受长音频为true(如果是一二级唤醒,即每个唤醒词独立且非实时,则需要设置为false,如果不设置会影响性能) true/false true 当设置为false时,每次送一段音频段都会给予是否唤醒的反馈,如果没有被唤醒,则抛出wakeupWord:null, confidence:0的信息
setWakeupWord(String[] pinyin, float[] threshold) 设置唤醒词列表

pinyin    唤醒词的拼音,建议三到五字,如:["ni hao xiao chi","xiao chi ni hao"]

threshold 阈值,0-1,可根据需求自行调整,如:[0.1f, 0.1f]

NA NA
setDcheck(String[] dcheck) 设置唤醒是否开启校验

"1"表示开启校验,"0"表示不开启校验

校验值,如:["1","0"]

NA NA
setVadEnable(boolean vadEnable) 设置是否启动vad功能,需要资源配合。在资源支持vad功能的情况下,默认启动vad

true/false

true NA
setUseCustomFeed(boolean useCustomFeed) 设置是否自行feed数据

true 用户调用 feedData 方法输入音频数据

false NA
setDumpWakeupAudioPath(String dumpWakeupAudioPath) 设置dump唤醒音频保存的文件夹

dumpWakeupAudioPath dump唤醒音频保存的文件夹,比如/sdcard/speech/dumpwkp。不设置则不dump音频

NA NA

更多的api与说明请参考最新的 Javadoc

 

4.5 停止销毁引擎

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

请在合适的位置调用以上两个方法。

 

4.6 语音唤醒完整的参考代码块

AIWakeupEngine
AIWakeupEngine mEngine;
mEngine = AIWakeupEngine.createInstance();
AIWakeupConfig config = new AIWakeupConfig();
config.setWakeupResource(SampleConstants.WAKEUP_RES);
mEngine.init(config, new AISpeechListenerImpl());



AIWakeupIntent intent = new AIWakeupIntent();
intent.setWakeupWord(new String[]{"ni hao xiao chi"}, new float[]{0.1f});
mEngine.start(intent);



//如下注释的代码为动态设置唤醒env(当前只支持更新thresh),以下2行效果一样
// mEngine.setDynamicParam(new String[]{"ni hao xiao chi"}, new float[]{0.2f});
mEngine.setDynamicParam("words=ni hao xiao chi;thresh=0.2;");    // 效果同上


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



// 回调方法
private class AISpeechListenerImpl implements AIWakeupListener {

    @Override
    public void onError(AIError error) {
        Log.e(TAG, "error " + error.toString());
    }

    @Override
    public void onInit(final int status) {
        Log.i(TAG, "Init result " + status);
        if (status == AIConstant.OPT_SUCCESS) {
            Log.i(TAG, "初始化成功");
        } else {
            Log.i(TAG, "初始化失败!code:" + status);
        }
    }


    @Override
    public void onWakeup(String recordId, final double confidence, final String wakeupWord) {
        Log.d(TAG, "\n唤醒成功  wakeupWord = " + wakeupWord + "  confidence = " + confidence);
        //在这里启动其他引擎,比如tts或者识别
    }

    @Override
    public void onReadyForSpeech() {
        Log.d(TAG, "onReadyForSpeech: ");
    }


    @Override
    public void onResultDataReceived(byte[] buffer, int size) {

    }

    @Override
    public void onRawDataReceived(byte[] buffer, int size) {

    }

}

五. 错误码

DUI Lite 2.0 - 错误码

 

六. 接口文档

 

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