多设备选择

一. 概述

多设备选择(mds, multiple device selection),用于在存在多个语音采集设备的场景中,选择最优输入设备

二. SDK使用说明

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

2.1 准备

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

so:libmds.so

资源:可以放在assets目录中,也可以自己手动放在磁盘中,比如/sdcard/

mds_offline_*.bin

 

三. 引擎运行流程图

 

 

四. 示例代码

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

4.1 配置config信息

 

AILocalMdsConfig config = new AILocalMdsConfig();
switch (DUILiteSDK.getAudioRecorderType()) {
            case DUILiteConfig.TYPE_COMMON_MIC:
                // 设置mds资源,与输入音频通道数相对应
                config.setMdsResource(SampleConstants.MDS_RES_SINGLE);
                // 输入音频通道数。不带AEC就是mic数,带AEC就是mic数+回路数
                config.setChannels(1);
                break;
            case DUILiteConfig.TYPE_COMMON_DUAL:
                config.setMdsResource(SampleConstants.MDS_RES_DUAL);
                config.setChannels(2);
                break;
            default:
                // demo 只支持单麦、双麦示例,其它类型的麦克风会初始化失败
                break;
        }

 

部分config 使用如下表

方法 方法说明 参数说明 默认值 备注
setMdsResource(String mdsResource) 设置mds资源

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

2. 如在 assets 里设置为名称

NA

NA

setChannels(int channels) 输入音频通道数 音频通道数 0 NA

 

4.2 实现回调接口

 

private class MdsListenerImpl implements AILocalMdsListener {

        @Override
        public void onResults(AIResult aiResult) {
            // 如果结果是 {"snr": inf} ,说明内核计算有数值溢出
            Log.d(TAG, "MdsListenerImpl onResults " + aiResult.getResultObject());
            appendText(aiResult.getResultObject().toString());
            gotResult = false;
        }

        @Override
        public void onInit(int status) {
            Log.d(TAG, "MdsListenerImpl onInit " + status);
            appendText(AIConstant.OPT_SUCCESS == status ? "初始化成功" : "初始化失败");
        }

        @Override
        public void onError(AIError aiError) {
            Log.d(TAG, "MdsListenerImpl onError " + aiError);
            appendText("onError " + aiError);
        }
    }

 

4.3 创建实例对象并且初始化

 

mdsEngine = AILocalMdsEngine.createInstance();
mdsEngine.init(config, new MdsListenerImpl());

部分AILocalMdsEngine方法如下表

方法 方法说明 参数说明 备注
createInstance() 创建实例 NA 静态方法,非单例
init(AILocalMdsConfig config, AILocalMdsListener listener) 初始化 参照demo NA
start(AILocalMdsIntent aiLocalMdsIntent) 启动多设备选择 参考4.4参数说明 NA
stop() 停止引擎

NA

该方法会停止接收录音数据和停止引擎,程序退出时可以调用
destroy() 销毁信号处理模块和唤醒引擎

NA

该方法会停止录音机和销毁录音机
feedData(byte[] data, int size) 传入数据,在不使用SDK录音机时调用

data 音频数据流

size 数据大小

NA
cancel() 取消引擎

NA

NA

 

4.4 设置intent,并开始多设备选择

 

AILocalMdsIntent mdsIntent = new AILocalMdsIntent();
        mdsIntent.setUseCustomFeed(true);   // mds 一般使用外部feed方式
        mdsEngine.start(mdsIntent);

部分intent方法示例如下表

方法 方法说明 参数说明 备注
setUseCustomFeed(boolean useCustomFeed) 设置是否自行feed数据 默认false 设置为true,需要用户调用 feedData 方法输入音频数据
setSpeechLen(int speechLen) 有效语音的长度 单位为毫秒(ms) 可选
setDoa(int doa) 说话人角度(多通道输入时使用) 说话人角度 可选,根据资源配置而定

 

4.5 停止和销毁引擎

 

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

 

4.6 较为完整的代码块

AILocalMdsEngine
private AILocalMdsEngine mdsEngine;
mdsEngine = AILocalMdsEngine.createInstance();
AILocalMdsConfig config = new AILocalMdsConfig();
switch (DUILiteSDK.getAudioRecorderType()) {
    case DUILiteConfig.TYPE_COMMON_MIC:
        // 设置mds资源,与输入音频通道数相对应
        config.setMdsResource(SampleConstants.MDS_RES_SINGLE);
        // 输入音频通道数。不带AEC就是mic数,带AEC就是mic数+回路数
        config.setChannels(1);
        break;
    case DUILiteConfig.TYPE_COMMON_DUAL:
        config.setMdsResource(SampleConstants.MDS_RES_DUAL);
 config.setChannels(2);
        break;
    default:
        // demo 只支持单麦、双麦示例,其它类型的麦克风会初始化失败
        break;
    }
 
mdsEngine.init(config, new MdsListenerImpl());
AILocalMdsIntent mdsIntent = new AILocalMdsIntent();
mdsIntent.setUseCustomFeed(true);   // mds 一般使用外部feed方式
mdsEngine.start(mdsIntent);
readAndFeed();

mEngine.stop();
mEngine.destroy();
private void readAndFeed() {
    Log.d(TAG, "readAndFeed");
    try {
            // test.wav 单麦音频,录音模式需要选择单麦模式
            InputStream inputStream = getAssets().open("test.wav");
            byte[] bytes = new byte[3200];
            int ret = inputStream.read(bytes);
            while (ret != -1) {
                mdsEngine.feedData(bytes, ret);
                ret = inputStream.read(bytes);
                // feed 短音频的话,可以不用sleep
                try {
                    Thread.sleep(5);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                // 得到结果后就不用再feed音频了
                if (gotResult)
                    break;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
}
private class MdsListenerImpl implements AILocalMdsListener {
 
        @Override
        public void onResults(AIResult aiResult) {
            // 如果结果是 {"snr": inf} ,说明内核计算有数值溢出
            Log.d(TAG, "MdsListenerImpl onResults " + aiResult.getResultObject());
            appendText(aiResult.getResultObject().toString());
            gotResult = false;
        }
 
        @Override
        public void onInit(int status) {
            Log.d(TAG, "MdsListenerImpl onInit " + status);
            appendText(AIConstant.OPT_SUCCESS == status ? "初始化成功" : "初始化失败");
        }
 
        @Override
        public void onError(AIError aiError) {
            Log.d(TAG, "MdsListenerImpl onError " + aiError);
            appendText("onError " + aiError);
        }
    }
}

五. 错误码

DUI Lite 2.0 - 错误码

 

六. 接口文档

 

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