VOIP

一. 概述

语音通信增强(sevc),支持单麦、双麦、线性4-6麦、环型4-6麦、异形麦通话降噪功能,包含回声消除(echo),波束成形(beamforming),盲源分离(bss),神经网络降噪(nn),自动增益补偿(AGC)等功能模块。

通过设置对应的资源和内核库,Duilite SDK将麦克风采集的多路音频,经过上述模块的处理,输出为一路音频。

您可以使用处理后的音频来进行自己定制的功能,譬如VoIP等等。

二. SDK使用说明

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

2.1 准备

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

so:libsevc.so

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

sspe_aec_*_agc*.bin

三. 引擎运行流程图

 

 

四. 示例代码

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

4.1 配置config信息

 

        AILocalSevcConfig config = new AILocalSevcConfig();
        config.setSspeBinResource(SampleConstants.SEVC_SSPE_RES);

 

部分config 使用如下表

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

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

2. 如在 assets 里设置为名称

NA

NA

 

4.2 实现回调接口

 

private class AILocalSignalAndWakeupListenerImpl implements AILocalSevcListener {


        @Override
        public void onInit(int status) {
            appendText("Init result " + status);
            if (status == AIConstant.OPT_SUCCESS) {
                appendText("初始化成功!");

                AILocalSevcIntent intent = new AILocalSevcIntent();
                intent.setUseCustomFeed(true);
                mEngine.start(intent);

                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        readAndFeed();
                    }
                }).start();
            } else {
                appendText("初始化失败!code:" + status);
            }
        }

        @Override
        public void onError(AIError error) {
            appendText(error.toString() + "\n");
        }


        @Override
        public void onAgcDataReceived(byte[] bytes) {
            appendText("onAgcDataReceived size " + bytes.length);
        }

    }

 

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

 

        mEngine = AILocalSevcEngine.createInstance();
        mEngine.init(config, new AILocalSignalAndWakeupListenerImpl());

部分AILocalSevcEngine方法如下表

方法 方法说明 参数说明 备注
createInstance() 创建实例 NA 静态方法,非单例
init(AILocalSevcConfig config, AILocalSevcListener listener) 初始化 参照demo NA
start(AILocalSevcIntent aiLocalSevcIntent) 启动sevc 参考4.4参数说明 NA
stop() 停止引擎

NA

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

NA

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

data 音频数据流

size 数据大小

NA

 

4.4 设置intent,并且启动引擎

 

                AILocalSevcIntent intent = new AILocalSevcIntent();
                intent.setUseCustomFeed(true);
                mEngine.start(intent);

部分intent方法示例如下表

方法 方法说明 参数说明 备注
setUseCustomFeed(boolean useCustomFeed) 设置是否自行feed数据 默认false 设置为true,需要用户调用 feedData 方法输入音频数据

 

4.5 停止和销毁引擎

 

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

 

4.6 较为完整的代码块

AILocalSevcEngine
private AILocalSevcEngine mEngine;

AILocalSevcConfig config = new AILocalSevcConfig();
config.setSspeBinResource(SampleConstants.SEVC_SSPE_RES);
mEngine = AILocalSevcEngine.createInstance();
mEngine.init(config, new AILocalSignalAndWakeupListenerImpl());

private void readAndFeed() {
   try {
            InputStream inputStream = getAssets().open("5ch_3mic_2ref.wav");
            byte[] bytes = new byte[3200 * 6];
            int ret = inputStream.read(bytes);
            while (ret != -1) {
                mEngine.feedData(bytes, ret);
                ret = inputStream.read(bytes);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
}
 
private class AILocalSignalAndWakeupListenerImpl implements AILocalSevcListener {
 
 
        @Override
        public void onInit(int status) {
            appendText("Init result " + status);
            if (status == AIConstant.OPT_SUCCESS) {
                appendText("初始化成功!");
 
                AILocalSevcIntent intent = new AILocalSevcIntent();
                intent.setUseCustomFeed(true);
                mEngine.start(intent);
 
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        readAndFeed();
                    }
                }).start();
            } else {
                appendText("初始化失败!code:" + status);
            }
        }
 
        @Override
        public void onError(AIError error) {
            appendText(error.toString() + "\n");
        }
 
 
        @Override
        public void onAgcDataReceived(byte[] bytes) {
            appendText("onAgcDataReceived size " + bytes.length);
        }
 
}

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

五. 错误码

DUI Lite 2.0 - 错误码

 

六. 接口文档

 

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