You need to enable JavaScript to run this app.
导航

【OC】回声消除-V2

最近更新时间2023.03.16 11:40:12

首次发布时间2023.03.16 11:40:12

使用步骤

1. 创建handle

sdk支持带模型的算法和dsp处理的算法,dsp效果的适用于性能比较低端的机器。算法模型详见回声消除介绍小节。
带模型的算法:

SAMICore_CreateParameter *create_param = [[SAMICore_CreateParameter alloc] init];
create_param.sampleRate = sample_rate;
create_param.maxBlockSize = block_size;
create_param.modelBuffer = reinterpret_cast<char*>(model_buffer.data());
create_param.modelLen = model_buffer.size();
create_param.numChannel = num_channels;
int ret = 0;
SAMICore *sami_core_handle = [[SAMICore alloc] initWithIdentify:SAMICore_Identify_RNNAEC param:create_param result:&ret];
if(ret != SAMI_OK) {
    std::cerr << "create handler failed: " << ret;
    exit(-1);
}

dsp效果

SAMICore_CreateParameter *create_param = [[SAMICore_CreateParameter alloc] init];
create_param.sampleRate = sample_rate;
create_param.maxBlockSize = block_size;
create_param.numChannel = num_channels;
int ret = 0;
SAMICore *sami_core_handle = [[SAMICore alloc] initWithIdentify:SAMICore_Identify_AEC param:create_param result:&ret];
if(ret != SAMI_OK) {
    std::cerr << "create handler failed: " << ret;
    exit(-1);
}

2. 初始化buffer

SAMICore_AudioBuffer *in_mic_buffer = [[SAMICore_AudioBuffer alloc] initWithNumberSamples:block_size
                                                                           numberChannels:num_channels
                                                                             isInterleave:false];

SAMICore_AudioBuffer *in_ref_buffer = [[SAMICore_AudioBuffer alloc] initWithNumberSamples:block_size
                                                                           numberChannels:num_channels
                                                                             isInterleave:false];

SAMICore_AudioBuffer *out_buffer = [[SAMICore_AudioBuffer alloc] initWithNumberSamples:block_size
                                                                           numberChannels:num_channels
                                                                             isInterleave:false];

SAMICore_AecInput *aec_input = [[SAMICore_AecInput alloc] init];
aec_input.mic = in_mic_buffer;
aec_input.ref = in_ref_buffer;

SAMICore_AudioBlock *in_block = [[SAMICore_AudioBlock alloc] init];
in_block.dataType = SAMICore_DataType_AecInput;
in_block.numberAudioData = 1;
in_block.audioData = aec_input;

SAMICore_AudioBlock *out_block = [[SAMICore_AudioBlock alloc] init];
out_block.dataType = SAMICore_DataType_AudioBuffer;
out_block.numberAudioData = 1;
out_block.audioData = out_buffer;

num_channels : 需要跟创建handle设置的一致
block_size:每一个处理的实际帧数,要求 block_size<= create_param.maxBlockSize

3. 处理数据

for(int inx = 0; inx + block_size < (int)num_frames;) {
    for(int c = 0; c < num_channels; ++c) {
        ((float**)in_mic_buffer.data)[c] = mic_input_data[c].data() + inx;
        ((float**)in_ref_buffer.data)[c] = ref_input_data[c].data() + inx;
    }

    ret = [sami_core_handle processWithInBlock:in_block outBlock:out_block];
    if(ret != SAMI_OK) {
        std::cerr << "ret: " << ret << std::endl;
        exit(0);
    }

    audio_encoder->writePlanarData((float**)out_buffer.data, num_channels, block_size);
    inx += block_size;
}

注意检查 SAMICoreProcess 函数的返回值,处理输入不正确或者内部处理错误都会有返回值,错误码可以查看错误检查一节

4. 释放handle

sami_core_handle = nil;