48kHz의 샘플링 속도로 실행되는 VoIP 애플리케이션을 개발 중입니다. Opus는 내부적으로 48kHz를 사용하며 코덱으로 사용되며 대부분의 최신 Android 하드웨어는 기본적으로 48kHz로 실행되기 때문에 AEC는 지금 놓치고있는 유일한 퍼즐 조각입니다. 이미 WebRTC 구현을 찾았지만 작동하게 만드는 방법을 알아낼 수 없습니다. 메모리가 무작위로 손상되어 조만간 모든 것이 손상되는 것 같습니다. 그것이 충돌하지 않을 때, 사운드는 마치 프레임의 절반에 대해 더 조용한 것처럼 다소 흐트러집니다. 내가 실제 반향 제거를 주석하고 그냥 플로트 변환 및 대역 분할을 앞뒤로이 손상 메모리를하지 않는 경우48 kHz의 어쿠스틱 반향 제거 (AEC) 라이브러리가 있습니까?
webrtc::SplittingFilter* splittingFilter;
webrtc::IFChannelBuffer* bufferIn;
webrtc::IFChannelBuffer* bufferOut;
webrtc::IFChannelBuffer* bufferOut2;
// ...
splittingFilter=new webrtc::SplittingFilter(1, 3, 960);
bufferIn=new webrtc::IFChannelBuffer(960, 1, 1);
bufferOut=new webrtc::IFChannelBuffer(960, 1, 3);
bufferOut2=new webrtc::IFChannelBuffer(960, 1, 3);
// ...
int16_t* samples=(int16_t*)data;
float* fsamples[3];
float* foutput[3];
int i;
float* fbuf=bufferIn->fbuf()->bands(0)[0];
// convert the data from 16-bit PCM into float
for(i=0;i<960;i++){
fbuf[i]=samples[i]/(float)32767;
}
// split it into three "bands" that the AEC needs and for some reason can't do itself
splittingFilter->Analysis(bufferIn, bufferOut);
// split the frame into 6 consecutive 160-sample blocks and perform AEC on them
for(i=0;i<6;i++){
fsamples[0]=&bufferOut->fbuf()->bands(0)[0][160*i];
fsamples[1]=&bufferOut->fbuf()->bands(0)[1][160*i];
fsamples[2]=&bufferOut->fbuf()->bands(0)[2][160*i];
foutput[0]=&bufferOut2->fbuf()->bands(0)[0][160*i];
foutput[1]=&bufferOut2->fbuf()->bands(0)[1][160*i];
foutput[2]=&bufferOut2->fbuf()->bands(0)[2][160*i];
int32_t res=WebRtcAec_Process(aecState, (const float* const*) fsamples, 3, foutput, 160, 20, 0);
}
// put the "bands" back together
splittingFilter->Synthesis(bufferOut2, bufferIn);
// convert the processed data back into 16-bit PCM
for(i=0;i<960;i++){
samples[i]=(int16_t) (CLAMP(fbuf[i], -1, 1)*32767);
}
것은 소리가 나지 않는다 : 여기에 20 밀리 프레임을 처리하는 내 코드는 이상하고 실행됩니다. (저는 AEC에 farend/speaker 신호를 전달합니다. 질문에 포함 시키면 코드의 엉망진창을 만들고 싶지 않습니다.)
나는 안드로이드의 AEC도 시험해 봤습니다. 작동하는 동안 캡처 한 신호를 16 kHz에서 업 샘플링합니다.
결론 닫기 : 모든 다른 VoIP 구현이 "음성만을위한 충분한 대역폭"을 제공하는 낮은 샘플 속도를 사용한다는 사실을 알지 못합니다. 우리가보다 강력한 하드웨어와보다 효과적인 코덱을 가지고 있기 때문에 앞으로 나아갈 때라고 생각합니다. – Grishka