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); }
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
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 函数的返回值,处理输入不正确或者内部处理错误都会有返回值,错误码可以查看错误检查一节
sami_core_handle = nil;