다자간 통화 서비스 Popcorn Buzz의 통화 품질 올리기

LINE에서 Mobile VoIP 개발을 담당하고 있는 강인규(IG), 곽정남(JN)입니다.
이번 블로그에서는 새롭게 런칭된 팝콘 버즈(Popcorn Buzz)의 통화 품질 향상 방법에 대해 이야기하고자 합니다.

소개

팝콘 버즈(Popcorn Buzz)는 인터넷을 통해 동시에 200명까지 통화할 수 있는 그룹 콜 서비스입니다. 아래 그림과 같이 팝콘 버즈(Popcorn Buzz)의 사용자들은 인터넷을 통해 가상의 공간에 함께 모여서 대화나 회의를 할 수 있습니다.
voip-01<그림1 : Popcorn Buzz 서비스 구성도>

기존의 LINE에서도 프리콜이라는 1:1 통화 서비스를 제공하고 있었습니다. 팝콘 버즈(Popcorn Buzz)도 이러한 통화의 한 형태이기 때문에 좋은 통화 품질을 제공하는 것이 중요하며 팝콘 버즈(Popcorn Buzz)의 클라이언트 모듈에는 LINE 메신저의 음질 향상을 위한 기술요소가 포함되어 있습니다. 하지만 팝콘 버즈(Popcorn Buzz)에서는 1:1 통화에서는 고려하지 않아도 될, 여러 사람들이 동시에 통화하는 환경을 고려해야 했습니다.

통화에 참여하는 사용자의 환경은 통화 품질을 결정하는 가장 중요한 요인 중의 하나입니다. 사용자가 놓인 환경이 중요한 이유는 주변 환경의 잡음을 결정하기 때문입니다. 즉, 사용자는 조용한 집에서 혹은 사무실, 카페 등에서 통화를 할 수 있는데 그 주변 잡음의 정도에 따라 통화 품질에 차이가 발생하게 됩니다. 시끄러운 주변에서 통화하는 상대방은 주변 잡음이 상대적으로 크기 때문에 대화의 의미 전달이 수월하지 않을 수 있습니다. 특히 팝콘 버즈(Popcorn Buzz)와 같은 다자간 통화 서비스는 여러 사람이 여러 환경에 놓이게 되므로 사용자들간의 주변 잡음이 통화 품질에 미치는 영향은 더욱 심각할 수 있습니다. 예를 들어 참여자 중 한 사람이 심각한 잡음 환경에 있다면 모든 참여자의 통화를 불편하게 만들 수 있습니다.

다양한 단말이 동시에 통화하는 상황도 통화 품질 저하에 주요 원인이 될 수 있습니다. 특히 단말 특성에 의해 에코가 발생할 수 있습니다. 에코란 스피커로 출력된 소리가 다시 마이크로 입력되어 상대방이 자신의 목소리를 듣는 현상입니다. 에코는 마이크의 감도가 좋고, 스피커의 출력이 크며, 마이크와 스피커의 간격이 가까울수록 더 두드러질 수 있습니다. 주로 휴대폰의 핸드셋, 스피커폰 모드에서 에코가 발생하며 특히 스피커폰으로 통화할 때는 스피커의 출력이 크기 때문에 입력 신호보다 큰 에코가 유입되기도 합니다.

근래의 모바일 단말은 이러한 에코를 자체적으로 제거해주기도 합니다. 하지만 얼마나 깨끗하게 제거해주는지는 단말이나 제조사에 따라 다양할 수 있으며 더러는 잘 동작하지 않기 때문에 단말 자체의 에코 제거를 쓰지 않는 편이 좋을 수도 있습니다. 즉, 모든 단말의 완벽한 에코 제거는 보장하기 어려운 것이 현실입니다. 만일 에코에 취약한 단말이 그룹 콜에 참여하게 된다면 다른 참여자에게 불편을 야기하게 될 수 있습니다.

또한, 단말의 마이크 특성이 다른 것도 팝콘 버즈(Popcorn Buzz)의 품질 저하 요인이 될 수 있습니다. 어떤 단말은 마이크의 민감도가 높아서 사용자의 목소리를 크게 전송할 수도 있고 반대로 마이크의 민감도가 낮은 단말을 사용하는 사용자의 목소리는 작게 들리게 될 것입니다. 팝콘 버즈(Popcorn Buzz)에서는 이러한 목소리의 절대적인 크기를 비슷하게 조절하여 볼륨 차이로 인한 불편함을 감쇠시키고 있습니다.

Popcorn Buzz에서는 위와 같은 문제에 대응하기 위해 Voice Quality Enhancement(이하 VQE)라는 소프트웨어 모듈을 구현하였습니다.

통화 품질 향상을 위한 VQE 구현

통화 환경 모델링

소개에서 말씀드린 팝콘 버즈(Popcorn Buzz)의 통화 환경을 그림으로 표현하면 <그림2>와 같습니다. 단말의 마이크로 유입되는 신호는 자신의 목소리(Near-End Signal)뿐 아니라 스피커 출력으로 발생한 상대방 소리(Far-End Signal), 즉 에코(Echo)와 주변의 잡음(Noise)까지 함께 유입됩니다.
voip-02<그림2: 통화 환경>

따라서 마이크에서 캡처된 신호(Captured Signal)는 위 3가지 신호가 모두 합해진 <그림3>과 같은 형태로 나타나게 됩니다.
voip-03<그림3: 단말의 마이크에서 캡처된 신호>

하지만, 실제 환경에서는 스피커로 출력된 신호와 마이크에서 캡처된 신호만을 알 수 있고 순수한 신호(자신의 목소리, 에코, 잡음)는 알 수 없습니다. 따라서, 캡처된 신호로부터 에코와 잡음을 추정해서 제거해줘야 합니다.

팝콘 버즈(Popcorn Buzz)에서는 효율적으로 에코와 잡음을 추정하기 위해 스피커로 출력된 신호와 마이크에서 캡처된 신호와의 유사 정도에 따라 <표1>의 4개 구간으로 구분하고 있습니다.

<표1: 에코와 잡음을 추정하기 위해 구분된 마이크 신호>
번호 유사도 음성여부 설명
1 낮음 O Near-End Only talk 구간(본인만 발성한 구간)
2 높음 O Far-End Only talk 구간(상대방만 발성한 구간, 에코)
3 보통 O Double talk 구간(본인과 상대방이 동시에 발성한 구간)
4 낮음 X Silence 구간(본인과 상대방이 둘 다 발성하지 않은 구간, 잡음 구간)

VQE 구조

VQE에는 에코나 잡음처럼 통화를 방해하는 요소를 제거하는 모듈뿐 아니라 통화 품질을 개선하기 위한 다양한 모듈이 있습니다. 그 중 대표적인 3가지 모듈이 에코제거를 위한 AEC(Acoustic Echo Canceller)와 주변 잡음 제거를 위한 NS(Noise Suppressor), 그리고 음성의 크기를 일정하게 유지시키기 위한 AGC(Automatic Gain Controller)입니다.

아래의 <그림4> 구조도에는 VQE 내의 음성 신호의 처리 순서를 도식화하고 있습니다. 왼쪽 아래의 마이크로부터 사용자의 음성이 입력되면 AEC/NS/AGC 모듈이 차례로 수행됩니다.
voip-04<그림4 : VQE 구조도>

각 모듈은 마이크에서 캡처된 신호가 <표1>의 분류와 같이 어떤 구간으로 분류되었는지에 따라 통화 품질을 향상시키는 처리 방법이 다르게 수행됩니다.

AEC(Acoustic Echo Cancellation)

마이크에서 캡처된 신호는 <그림3>처럼 에코와 잡음이 더해져 있습니다. 이 합쳐진 신호에서 에코를 제거하고 자신의 목소리와 잡음만을 남기는 것이 AEC의 기능입니다. 에코를 제거하기 위해서는 먼저 에코를 추정해야 합니다. 에코 추정은 <그림5>처럼 스피커 출력 전의 신호가 어떤 과정을 거쳐 마이크에 캡처되었는지를 추정함으로써 구할 수 있습니다. 이때 이 과정을 모델링한 것을 전달함수(Transfer Function)라고 합니다.

AEC에서는 전달함수를 추정하기 위해 스피커 출력 전의 신호와 캡처된 신호와의 유사도 방식을 통해 <표1>에서처럼 마이크에서 캡처된 신호 구간을 구분합니다. 에코가 발생하는 2구간마다 전달함수를 갱신하고 1, 3, 4구간에서는 갱신하지 않습니다. 이렇게 만들어진 전달함수와 스피커 출력 전의 신호의 곱으로 에코를 추정할 수 있습니다. 이제 마이크 신호에서 추정된 에코를 제거하면 <그림5>와 같이 에코는 사라지고 자신의 목소리와 잡음만 남게 됩니다.
voip-05<그림5 : AEC 동작>

NS(Noise Suppression)

AEC에서 에코를 제거했더라도 자신의 목소리는 주변 잡음과 섞여 오염된 형태로 수집이 됩니다. NS는 사용자의 주변 환경으로부터 발생하는 잡음을 제거하여 명료도를 개선시키는 기술입니다. 잡음을 제거하기 위해서는 먼저 잡음을 추정해야 합니다. NS는 <표1>의 4번 구간마다 잡음의 크기를 추정합니다. 캡처된 신호에서 추정된 잡음을 제거하면 <그림6>과 같이 자신의 목소리만 출력으로 얻을 수 있습니다.
voip-06<그림6 : NS 동작>

AGC(Automatic Gain Controller)

마이크에서 캡처된 음성의 크기는 마이크 감도, 사용자의 상태(상황/감정/마이크와의 거리)에 따라 달라집니다. AGC는 이러한 음성의 크기를 일정하게 유지하기 위해 환경에 따라 증폭도를 자동으로 변화시키는 기술입니다. 즉, <그림7>처럼 작은 소리의 음성은 크게, 큰 소리의 음성은 작게 조절하는 역할을 합니다. 만약, AGC가 없다면 사용자는 수시로 볼륨조작을 해야 하는 불편함이 발생할 것입니다.
voip-07<그림7 : AGC 동작>

이해도를 높이기 위해 <그림4>에는 하나의 AGC만 있습니다. 하지만 실제로 VQE 내에는 수신한 음성(RX audio stream)을 위한 AGC가 하나 더 있습니다. 이는 단말의 스피커의 출력특성에 대한 음량 조절역할을 수행합니다.

Popcorn Buzz에서의 VQE 튜닝

Popcorn Buzz 서비스에서는 한 명의 참여자가 방 전체에 영향을 주게 됩니다. 또한, 여러 참여자들의 소리가 믹싱되기 때문에 한 참여자의 작은 에코와 잡음도 모이게 되면 큰 불편을 초래하기도 합니다. 그렇기 때문에 Popcorn Buzz에서 VQE의 역할은 1:1 통화 서비스에 비해 더욱 중요하며 AEC와 NS를 강하게 설정하도록 튜닝하고 있습니다. 하지만 이는 다른 Side effect를 야기시킬 수도 있습니다. AEC와 NS의 Suppression 강도는 Near-End Signal의 왜곡과 Trade-off 관계에 있기 때문입니다. 즉, 강한 Suppression은 에코와 잡음을 잘 제거하지만, Near-End Signal의 왜곡을 발생시킬 수 있습니다. 이를 보상하기 위해 Popcorn Buzz의 VQE에서는 통화 품질을 유지하기 위해 캡처된 음성이 어떤 구간에 속하는지에 따라 Suppression 강도를 다르게 적용하고 있습니다.
예를 들면, <표1>의 1번 구간은 상대방에 전송될 가장 중요한 정보이기 때문에 이 구간에 대해서는 잡음만을 제거하되 신호의 왜곡을 최소화합니다. <표1>의 2, 4번 구간은 에코와 잡음 구간이기 때문에 이 구간에 대해서는 강하게 제거합니다. <표1>의 3번 구간은 상대방에게 전송될 중요한 정보인 동시에 에코와 잡음이 섞인 구간입니다. 이 구간에 대해서는 에코와 잡음을 제거하되 신호의 왜곡을 최소화하도록 하고 있습니다.

사용자에게 일관된 경험을 제공하는 것은 매우 중요합니다. 팝콘 버즈(Popcorn Buzz)처럼 다자간 통신의 경우 그 중요성은 더욱 크게 부각될 것입니다. 하지만 시중에 출시된 단말은 그 종류가 매우 다양하고 서로 다른 음향적 특성(마이크, 스피커의 하드웨어 사양)을 갖고 있기에 일관된 경험을 제공하기란 더욱 어려운 환경입니다. 출시가 되었지만 아직도 개선할 부분과 추가로 개발해야 할 기능이 남아 있습니다. 사용자들이 더 좋은 품질의 서비스를 이용하는 것을 기대하며 블로그 작성을 마칩니다.