多设备选择
一. 概述
多设备选择(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 较为完整的代码块