안녕하세요.
오늘은 오디오 Speex 코덱의 모듈인 AEC와 RES 부분을 따서 api화 해보았습니다.
1. Speex란 무엇인가
먼저 Speex 코덱이란 음성 통화를 목적으로 만들어진 오디오 코덱인데요. 내부에 통화 품질 향상을 위한 여러가지 모듈이 들어있습니다. denoise, dereverb, AGC, AEC, RES, VAD와 같이 음성처리에 필요한 여러가지 모듈을 오픈소스화하여 제공하고 있습니다. <Speex 공식 사이트>2. 모듈에 대한 설명
Noise Reduction(관련 위키)음성 통화에서 생길 수 있는 여러가지 노이즈(통화자의 음성이 아닌 다른 소리들)을 제거해주는 모듈
Denoising, Dereverbing, AEC(Acoustic Echo Cancellation), RES(Residual Echo Suppression) 등이 있습니다.
여기서 제가 API화 하였던 AEC, RES는 원거리 통화 상황에서 발생할 수 있는 에코를 제거해주는 것입니다.(관련 위키)
에코란 무엇인가 |
그렇다면 에코가 무엇일까요? 위에 그림을 보시면 알수 있습니다. 우리가 컴퓨터에서 원거리 화상 통화를 하고있다고 생각해봅시다. 상대가 말하는 신호는 위에 스피커로부터 나오고 있습니다. 그런데 그 스피커에서 나오는 음성이 너무 커서 나의 음성과 섞여 마이크로 들어갔습니다.
상대가 듣는 음성 = 나의 음성 + 스피커로부터 나오는 본인의 음성 + 노이즈
이렇게 되겠죠. 그런데 소리가 마이크로 바로 들어가는 신호가 있을 수 있고 벽에 튕겨서 들어가는 소리가 있을 수 있습니다. 그런 신호들을 에코라고 부릅니다. AEC는 에코를 제거해주어 상대가 나의 음성만 들을 수 있도록 만들어주는 기술입니다. AEC는 에코신호의 linear 특성을 반영하여 linear 에코를 잡아주는 역할이고, 벽에 튕겨져 나오거나 스피커의 왜곡에 의해 생기는 non-linear 특성을 잡아주는 알고리즘이 RES입니다. 그래서 둘을 함께 사용합니다.
이 기술을 이용하면 화상 채팅, 화상 통화, 원거리 회의 시스템 등 스피커와 마이크가 같이 있는 환경에서 사용되는 어플리케이션에 필수적으로 들어가야 하는겁니다. 이와 관련된 프로젝트를 하신다면 이 모듈을 사용할 것을 권해드립니다.
3. 테스트 코드
<Speex_AEC>제가만든 윈도우 버전의 테스트 코드입니다. Speex_AEC 폴더에 보시면 visual studio 2015로 만들어진 프로젝트가 있습니다. 이를 다운받으시고 사용하시면 됩니다.
testecho.c 파일에 메인함수가 존재합니다.
인풋으로 mic.raw(마이크 신호) ref.raw(스피커 신호)가 들어가고 out.raw형태로 나오게 됩니다.
.raw란 말 그대로 가공되지 않은 음성 데이터를 말합니다.
안에 보시면 샘플레이트나 한 프레임 사이즈를 바꿀 수 있도록 되어있습니다.
그리고 mdf.c와 preprocess.c 부분을 참고하시면 위에 파라미터들을 바꾸실 수 있습니다. 이는 본인의 마이크나 스피커 상황에 맞도록 튜닝하셔서 환경에 맞게 최적의 성능을 만들어 내실 수 있습니다. 고전적인 알고리즘이지만 성능이 꽤 괜찮으니 사용해보세요.
테스트로 넣어놓은 마이크 신호와 스피커 신호는 16000Hz에 1ch signed 16bit 형태로 되어있습니다. 참고하세요.
맨위 스피커 신호, 두번째 마이크 신호, 세번째 캔슬된 에코신호, 마지막 최종 에코가 제거된 신호 |
0 Comments