뒤로가기back

WebRTC에 Audio AI SDK 통합하기 (2) : 효과적인 통합 개발을 위한 테스트 환경 구축 방법

2023.06.23 by Jack Noh

WebRTC에 Audio AI SDK 통합하기 (2) : 효과적인 통합 개발을 위한 테스트 환경 구축 방법

(Writer: Jack Noh)

 

 

지난 포스트를 통해 WebRTC와 그 오디오 파이프라인에 대해 간단히 설명드렸던 것처럼, WebRTC는 매우 거대한 멀티미디어(오디오, 비디오, 데이터 전송 등) 기술이며, 오디오 부분만 보더라도 여러 모듈들(APM, ACM, ADM, …)이 존재합니다. 그만큼 활용 범위가 높은 기술이기도 한데요, 이번 포스팅에서는 WebRTC에 오디오AI SDK를 통합하는 과정 중 매우 중요한, ‘견고한 테스트 환경’을 구축하는 방법에 대해 이야기 해보려고 합니다.

 

 

WebRTC Audio Processing Module

 

WebRTC의 오디오 모듈들 중에 노이즈 제거 필터를 통합하기 가장 적합한 모듈은 무엇일까요? 사실 앞선 포스트를 읽어보셔서 눈치채셨겠지만, 이런 다른 SDK를 통합하기에 적합한(사실상 통합을 위해 만들어놓은) 모듈은 바로 APM(Audio Processing Module)입니다. 애초에 APM 자체가 통화 품질을 높이기 위한 신호 처리 기반의 오디오 신호 필터들을 모아놓은 모듈이기 때문입니다.

 

Audio Processing Module은 주로 단말(Client-side)에서 오디오에 효과를 주는 핵심 모듈입니다. 이 모듈은 오디오 신호를 통화(call)에 적합한 좋은 품질로 향상 효과를 주는 목적으로 필터들을 모듈화해놓은 것입니다. APM 모듈의 필터들은 Sub-module로 불리며 다양한 역할을 수행합니다.

 

WebRTC의 대표적인 Submodule들을 간략히 소개하자면 아래와 같습니다.

  • High Pass Filter(HPF): 저주파수 신호를 제거하여 목소리 같은 고주파 신호만을 추출하는 필터

  • Automatic Gain Controller(AGC): 오디오 신호의 크기를 자동으로 조절하여 일정한 수준으로 유지하는 필터

  • Acoustic Echo Cancellation(AEC): 스피커에서 나오는 신호(Far-end)가 다시 마이크로 들어가는 에코를 제거해주는 필터

  • Noise Suppression(NS): 주변 환경음(노이즈)를 제거해주는 신호처리 기반의 필터

 

이러한 Submodule들은 Near-end Stream(마이크 입력 신호를 상대방에게 전송)과 Far-end Stream(상대방으로 부터 수신 받은 오디오 데이터를 스피커로 출력)에서 각각 알맞게 활용되는데요. 화상회의 하는 시나리오를 예를 들어서 설명드려볼게요.

먼저 마이크에 입력된 오디오 신호는 저주파수 잡음을 제거하기 위해 High Pass Filter(HPF)를 거치게 됩니다. 다음에 갑자기 큰 소리로 인해 청감적인 불편함을 없애기 위해서 자동으로 신호 크기를 제어하는 Automatic Gain Controller(AGC)를 거치게 되죠. 그 이후에 에코(스피커에서 나오는 신호가 다시 마이크로 들어가는 것)를 방지하고자 Acoustic Echo Cancellation(AEC)를 통하게 됩니다. 그 이후에 주변 환경 노이즈를 제거하는 Noise Suppressor(NS)를 거치는 것이죠.

글 보다는 그림으로 표현하는게 훨씬 간단합니다. 아래 그림에서 ProcessStream()이란 마이크에서 입력받은(Capture) 신호 Stream의 프로세싱을 나타냅니다. 정방향이란 표현을 쓰기도 합니다. 동시에 ProcessReverseStream()은 원격의 상대(Peer)로 부터 온 오디오 데이터를 SPK로 출력(Render)하기 위한 역박향 Stream을 프로세싱하기 위해 존재합니다. 각 프로세싱은 Near-end Stream과 Far-end Stream의 APM에서의 효과 처리 과정이라고 이해해 주시면 됩니다.

위에서 설명한 흐름에 대해 아래 그림으로 한번 더 확인해보시죠.

 



WebRTC APM의 대표적인 Submodules
(WebRTC Branch: branch-heads/5736)

 

 

참고로 두 Stream의 프로세싱은 독립적이지 않습니다. 왜냐하면 상대방이 말하는 목소리가 다시 마이크로 들어가는 에코를 지워주기 위해서는 ProcessReverseStream()에서 신호를 분석 한 후에 ProcessStream()가 넘겨 받아 이 에코를 지워줘야 하기 때문입니다. (위에서 설명한 AEC의 역할!)

 

자, WebRTC의 APM은 이러한 구조로 이루어져있다는 것을 파악하였고, 여기에 저는 가우디오랩의 뛰어난 음원분리 기술인 GSEP-LD를 통합하고자 했는데요. 직관적으로 보면 NS 자리에 GSEP-LD를 대체하는 것이 좋을 것 같습니다만, 과연 그럴까요?

 

신호 처리의 관점에서는 그렇게 보일 수 있지만, 우리가 통합하고자하는 SDK는 인공지능 기반이기에 아직 확단할 수는 없습니다. AEC 전에 통합하는 것이 효과를 높일 수도 있고요, 혹은 반대로 아예 끝단에 통합을 하는것이 효과가 좋을 수도 있습니다.

 

‘최적의 통합 위치는 기존 노이즈 제거 필터의 위치와 같을까요?’의 질문에 이어 숱한 의문들이 생겨납니다.

 

‘다른 Submodule과의 Side-Effect는 없을까요?’

‘NS와 GSEP-LD를 동시에 사용해보는건 어떨까요?’

‘저주파 노이즈를 제거하기 위한 HPF 필터까지 굳이 사용해야 할까요?’

‘AEC 동작 여부에 따라 GSEP-LD 성능은 어떻게 달라질까요?’

 

 

WebRTC의 APM을 분석해보니 테스트로 챙겨야할 것들이 생각보다 많았습니다. 이제 이러한 경우들을 견고하게 테스트하기 위한 방법을 알아보도록 합시다.

 

참고로 WebRTC에 다른 SDK를 Submodule로 통합하는 방법은 어렵지 않습니다. 본 글은 WebRTC Audio 파이프라인의 테스트 환경 구축에 대한 이야기에 한정하기에 자세히 다루지는 않습니다만, 짧게 설명드리자면 이렇습니다.

WebRTC APM은 C++ 언어로 작성되어 있는데, 먼저 APM의 다른 Submodules과 동일하게 인스터스 및 상태를 관리하기 위해 Wrapper Class를 작성합니다. 그 이후에 실제 APM Class에 통합하고자하는 Wrapper Class 다른 Submodules을 참고해서 같은 방식으로 관리해주면 됩니다.

 

 

효과적인 통합을 위한 APM CLI 활용하기

 

이제 APM 모듈에 대한 이해를 바탕으로 견고한 테스트 환경을 구축하여 GSEP-LD의 결과를 얻어보도록 하겠습니다. 이를 위해서는 APM만 독립적으로 실행이 가능한 CLI(Command Line Interface)를 만들어 파일 출력 결과를 얻어보는게 효과적입니다. (실제로 들어보기도 해야하기 때문 입니다!)

 

저희가 파악한 효과적인 통합을 위해 APM CLI를 사용하는 방법은 2가지 입니다.

 

첫 번째 방법은 1)WebRTC 오픈 소스에서 바로 사용이 가능한 방법이며,

두 번째 방법은 2)WebRTC APM만 단독으로 있는 오픈소스 프로젝트를 활용하는 방법 입니다.

 

 

1) WebRTC 오픈 소스에서 바로 사용이 가능한 방법

 

WebRTC 오픈 소스는 링크에서 바로 확인이 가능합니다. WebRTC 프로젝트에는 플랫폼 별 빌드 방법에 대한 가이드가 자세히 나와있습니다. 소스 코드를 받고 가이드를 따라 필요한 소프트웨어들을 설치하고 빌드가 성공했다면, APM CLI를 사용할 수 있는 준비 끝입니다!

 

빌드 경로를 확인하면 산출물로 APM의 파일 모드 테스트 툴인 audioproc_f을 확인할 수 있습니다. audioproc_f를 활용한다면, APM에 WAV 파일을 입력하여 APM의 오디오 필터 효과가 적용된 결과를 얻을 수 있습니다. Default 옵션으로 APM 수행 결과 확인하기 위해서는 아래와 같이하면 됩니다.

 

$ ./audioproc_f -i INPUT.wav --all_default -o OUTPUT.wav

 

세부 옵션을 사용하면, 구체적인 테스트 환경을 시험하는 것도 가능합니다. 이번에는 Near-, Far-End 간의 Stream Delay를 30ms로 설정하고, Noise Suppressor를 켜보도록 하겠습니다. 여기서 Stream Delay란 하드웨어 및 시스템에 의한 지연을 의미합니다. 참고로 AEC의 성능을 높이기 위해서는 Near-, Far-End 간의 Stream Delay를 정확히 기술해야 하는 것이 중요하기 때문에 때문에 테스트 시에 유의해야할 파라미터 입니다.

 

./audioproc_f -i INPUT.wav --use_stream_delay 1 --stream_delay 30 --ns 1 -o OUTPUT.wav

 

 

2) WebRTC APM만 단독으로 있는 오픈소스 프로젝트를 활용하는 방법

 

첫 번째 방법으로도 충분한 테스트를 해볼 수 있을 겁니다. audioproc_f 소스 코드를 수정한다면 견고한 테스트 환경 구축할 수도 있겠죠. 하지만 WebRTC 프로젝트에는 오디오 이외의 불필요한 다른 멀티 미디어 소스 코드들(비디오, 데이터 네트워크 소스 코드, 오디오만 하더라도 ADM, ACM 등 다른 모듈 등..)도 함께 있어 불편한 단점이 있습니다. 그래서 필요한 부분(APM)만 눈에 보이고 좀 더 경량화된 테스트 환경을 구축할 수는 없을까 고민을 하게 되었는데요. 우리는 WebRTC의 APM 모듈만 떼어서 테스트를 구성하는 건 어떨까 고민하던 중 괜찮은 오픈 소스 프로젝트를 발견했습니다. 이 것이 바로 두 번째 방법입니다.

 

두 번째 방법에서 사용한 오픈 소스의 링크 입니다. 해당 프로젝트는 WebRTC의 APM만 분리해내어 Meson 빌드 시스템을 활용해서 빌드할 수 있는 프로젝트 입니다.

 

여기서 잠깐! Meson은 CMake 같은 다른 빌드 시스템 보다 빠르게 코드를 빌드할 수 있고, 직관적인 문법 덕분에 다루기 쉽다는 장점이 있는 차세대 C++ 빌드 시스템 입니다. 게다가 테스트 케이스를 다루는 방법도 정말 편리하고 테스트 구조를 쉽게 관리 할 수 있습니다. Meson에서 유닛 테스트를 작성하려면, 테스트 코드를 포함하는 테스트 실행 파일을 생성하고, 해당 파일에서 테스트 코드를 작성합니다. 그런 다음 test() 함수를 사용하여 테스트를 정의하고 Meson에 테스트를 실행하도록 지시합니다. 예를 들어, 다음과 같은 코드를 작성할 수 있습니다.

 

test('test_name', executable('test_executable', 'test_source.cpp'), timeout: 10)

 

이 코드는 test_name이라는 이름의 테스트를 정의합니다. 그리고 test_source.cpp 파일에서 빌드된 테스트 실행 파일 test_executable를 실행하여 테스트를 수행합니다. timeout 매개 변수는 테스트가 수행되는 시간을 초 단위로 지정합니다. 만약 지정된 시간 이내에 테스트가 완료되지 않으면 실패로 처리됩니다. 참고로 테스트 실행 파일에는 Arguments도 받을 수 있으니 테스트 마다 다른 값을 적용해서 다양한 케이스를 커버할 수 있습니다.

 

Meson 빌드 시스템의 쉬운 테스트 코드 작성 방법을 알아 보았습니다. 다음으로 GSEP-LD를 통합하기 위한 테스트를 구성해볼 차례 입니다. 아래 그림이 저희가 구성했던 테스트(실제로 테스트 해본 것보다는 간략화되어 있지만) 설계를 잘 보여줍니다.

 

 

 
GSEP-LD 통합 테스트 구성

 

 

먼저 테스트를 크게 2가지 그룹으로 나누었습니다. WebRTC에는 2가지 Stream Near-, Far-end Stream 2가지 존재하는 것, 알고 계시죠? 이를 각각 그룹(A)과 그룹(B)로 나누었습니다.

 

두 그룹의 큰 차이는 에코를 지워주는 AEC의 동작 유무입니다. (Near-end만 켜지는 그룹은 AEC가 off 상태, Near-, Far-end Stream 모두 사용할 때에는 AEC on 상태입니다.)

 

각 그룹에 입력되는 파일 구성도 차이가 있습니다. 그룹(A)의 경우에는 마이크를 통해 말하는 소리에 노이즈가 더해진 신호만 입력하면 됩니다. 하지만 그룹(B)에는 스피커에서 나오는 신호(=상대방이 말하는 신호)와 이 스피커에서 나오는 신호가 에코로 다시 들어가는 환경을 모사해주어 합니다. 이 역할을 하는 것이 echo_generator입니다. echo_generator로부터 나온 에코와 마이크를 통해 말하는 신호를 더해주면 그룹(B)의 입력 신호가 완성됩니다.

 

다음으로 GSEP-LD를 제어하기 위해서 통합 자리와 동작 여부를 제어했습니다. 통합 자리는 프로세싱의 맨 앞쪽(Pre-processing), 기존 노이즈 제거 필터의 자리, 그리고 맨 끝쪽(Post-processing)으로 제어하였습니다.

 

다른 Submodule과 사이드 이펙트도 볼 필요가 있겠죠? NS와의 사이드 이펙트를 살펴보도록 합시다. NS와의 Side-effect 검증을 위해서 끄거나 켜보고 얼마나 노이즈를 제거할지 Parameter 값을 설정하였습니다. 참고로 NS에서 얼마나 노이즈를 제거할지 Parameter 값은 Low ~ VeryHigh까지 설정이 가능한데, 너무 큰 값을 사용하면 음질에 왜곡이 심해지는 것을 확인할 수 있습니다.

 

끝으로 입력 파일의 소음을 타입별로 나누었습니다. 카페에서의 소음, 자동차 소음, 빗소리 등 다양한 소음의 종류를 테스트로 분류하였습니다. 자, 이 정도로만 해도 테스트의 가지수가 꽤 많습니다. (각 독립적인 가지수가 곱해지기 때문에…) 하지만 Meson 빌드 시스템의 테스트 기능을 활용한다면 for-loop 몇번으로 쉽게 만들 수 있습니다. 아래는 Meson 빌드 파일을pseudo code로 적어보았습니다.

 

 

 

이렇게 작성하면 테스트 코드의 완성입니다. 이제 Meson 명령어를 통해서 작성된 테스트 코드를 실행하면 우리가 구분한 테스트 가지 수 모두를 커버하며 출력 결과를 얻을 수 있습니다.

 

 

테스트가 잘 수행되어 출력 결과를 만드는 중
 
 
테스트가 잘 수행되었는지 지표로 체크
 
 

결론

 

WebRTC처럼 여러가지 기술들이 포함된 프로젝트에 제 3의 기술을 통합해보는 꽤 신경 써야 할 일이 많습니다. 통합 자리 선정을 위해서 전체적인 흐름을 이해해야 하고, 다양한 환경에서의 통합을 고려해야 합니다. 통합 위치, 사용 환경, 기존의 다른 기술들과의 Side-Effects등 말이죠. 위에서 언급된 내용은 당장 간단한 경우만 고려한 것입니다. 그럼에도, 노이즈 타입(5가지) x AEC On/Off(2가지) x NS 설정(5가지) x GSEP On/Off(2가지) = 100가지의 케이스!

 

이렇게 100가지의 케이스를 고민해야 합니다. 하지만 실제로는 노이즈 타입도 더 다양하게 테스트해봐야할 필요가 있으며, NS 이외의 Submodules 까지 고려를 하고, 플랫폼 별(Windows, MacOS, …) 까지 고려하면 테스트 가지수가 곱으로 많아지죠. 그리고 테스트를 위해서 GSEP 위치를 더 다양한 위치에 제어해보게 된다면 머리가 복잡해집니다. 😇

 

이번 글에서는 이러한 복잡한 가지수를 좀 더 쉽게, 그리고 경량화된 CLI 환경으로 테스트 해 본 경험을 소개해보았습니다. WebRTC의 APM만 분리해놓은 오픈 소스 프로젝트, Meson 빌드 시스템의 Test 기능 등을 활용하면 비교적 쉽게 환경을 구축할 수 있다는 것을 경험하였습니다. 앞으로 WebRTC에 여러분들이 붙여보고 싶은 오디오 필터가 있다면, 이 글이 조금이라도 테스트하는데 있어 도움이 되길 바라며 마치도록 하겠습니다. 읽어주셔서 감사합니다.

 

아참, WebRTC에 가우디오랩 만의 오디오 SDK를 통합하여 서비스를 만들고 싶으신 분! 언제든 환영합니다.

그리고 WebRTC의 오디오 파이프 라인에 대해 알려주셨으며, 그리고 WebRTC APM만 단독으로 있는 오픈소스 프로젝트를 활용하는 아이디어를 주신 쎄오에게도 땡큐!

 

 

pre-image
WebRTC에 Audio AI SDK 통합하기 (1) : WebRTC의 오디오 파이프라인 들여다보기

WebRTC에 Audio AI SDK 통합하기 (1) : WebRTC의 오디오 파이프라인 들여다보기 (Writer: Jack Noh)   WebRTC, 그게 궁금해요!   MDN 문서에서는 WebRTC(Web Real-Time Communication)를 아래와 같이 설명하고 있습니다. (참고로 MDN 문서는 웹 개발을 한다면 한번은 보게 되는, 사실상 표준 문서입니다.)   WebRTC(Web Real-Time Communication)는 웹 애플리케이션과 사이트가 중간자 없이 브라우저 간에 오디오나 영상 미디어를 포착하고 마음대로 스트림 할 뿐 아니라, 임의의 데이터도 교환할 수 있도록 하는 기술입니다. WebRTC를 구성하는 일련의 표준들은 플러그인이나 제 3자 소프트웨어 설치 없이 종단 간 데이터 공유와 화상 회의를 가능하게 합니다.   쉽게 말해 ‘인터넷만 연결되어 있다면 브라우저에서 별도의 소프트웨어의 설치 없이 실시간 통신을 가능하게 해주는 기술’이라고 할 수 있습니다. WebRTC를 활용한 대표적인 서비스로는 화상 회의 서비스인 Google Meet과 음성 통신 서비스인 Discord가 있죠. (실제로 Covid-19 확산기에 뜨거운 관심을 받았던 기술이기도 하고요!) WebRTC는 웹 표준이자 오픈 소스 프로젝트로, 링크를 통해 소스 코드를 확인하고 수정할 수도 있기도 합니다.     WebRTC의 Audio 파이프라인에 대해   WebRTC는 멀티 미디어 기술로서, 오디오, 비디오, 데이터 스트림 등 다양한 기술을 포함하고 있습니다. 그 중에서도 저는 이번 글을 통해 WebRTC의 오디오 기술과 관련된 이야기를 해보려 합니다.   WebRTC를 사용하는 화상 회의나 음성 통화 웹 어플리케이션(e.g. Google Meet)을 사용해본 적이 있다면, Audio 파이프라인이 어떻게 구성되는지 궁금해하실 겁니다. Audio 파이프라인은 2가지 Stream(흐름)으로 구분할 수 있습니다. 먼저 1)마이크 장치를 통해 입력된 음성 데이터가 상대방에게 전송되는 Stream, 그리고 동시에 2)상대방의 음성 데이터를 수신하여 스피커를 통해 출력되는 Stream입니다. 각각은 Near-end Stream(마이크 입력 신호를 상대방에게 전송)과 Far-end Stream(상대방으로 부터 수신 받은 오디오 데이터를 스피커로 출력)으로 불립니다. 각 Stream을 좀 더 자세히 살펴보면 아래와 같은 5가지 과정으로 정리할 수 있습니다.   1) Near-end Stream (마이크 입력 신호를 상대방에게 전송) 마이크 장치로부터 오디오 신호를 입력 받는다. (ADM, Audio Device Module) 입력 오디오 신호에 통화 품질을 높이기 위한 효과를 준다. (APM, Audio Processing Module) 함께 전송할 다른 오디오 신호(e.g. 파일 스트림)가 있다면 함께 Mixing 한다. (Audio Mixer) 오디오 신호를 Encoding 한다. (ACM, Audio Coding Module) RTP 패킷으로 변환후 UDP Transport로 전송한다. (Sending) 2) Far-end Stream(상대방으로 부터 수신 받은 오디오 데이터를 스피커로 출력) 연결된 상대방(N개의 Peer)으로 부터 오디오 데이터 RTP 패킷을 받는다. (Receiving) 각 RTP 패킷을 Decoding 한다. (ACM, Audio Coding Module) Decoding된 N개 스트림을 1개 스트림으로 Mixing 한다. (Audio Mixer) 출력 오디오 신호에 통화 품질을 높이기 위한 효과를 준다. (APM, Audio Processing Module) 스피커 장치로 오디오 신호를 출력 한다. (ADM, Audio Device Module)     각 과정을 담당하는 모듈의 이름은 위 설명에서 우측 (괄호)로 표시해두었는데요. 이처럼 WebRTC에서는 각 과정 별로 모듈화가 잘 되어 있습니다.   각 모듈에 대해 보다 더 자세히 살펴보면 이렇게 설명드릴 수 있는데요. ADM(Audio Device Module): 입/출력 하드웨어 영역과 접해 있으며 오디오 신호를 Capture/Render 할 수 있게 해줍니다. 플랫폼(Windows, MacOS, …) 별로 그에 맞는 API로 구현되어 있습니다. APM(Audio Processing Module): 통화 품질을 높이기 위한 오디오 신호처리 필터들의 모음입니다. 주로 단말(Client)에서 활용 됩니다. Audio Mixer: 여러 개의 오디오 스트림을 합쳐줍니다. ACM(Audio Coding Module): 전송/수신을 위해 오디오 인코딩/디코딩 합니다.   이를 그림으로 표현하면 아래와 같습니다.     WebRTC Audio 파이프라인과 모듈   설명드린 것처럼 WebRTC의 Audio 파이프라인은 모듈화되어 기능단위로 나누어져 있습니다.     WebRTC의 Audio 품질 개선 w/ Gaudio SDK   가우디오랩에는 GSA(Gaudio Spatial Audio), GSMO(Gaudio Sol Music One), LM1(음량 평준화 TTA 표준)등 훌륭하고 유용한 오디오 SDK들이 많습니다. 이러한 SDK를 탑재된 어플리케이션이나 서비스의 형태로 만들어 사용자에게 좋은 소리 경험을 전달하는 일은 정말 매력적인 일입니다.   (아시나요?) 가우디오랩에는 WebRTC에 찰떡궁합인 SDK가 존재합니다. 바로 AI 기반으로 노이즈 제거가 가능한 GSEP-LD 인데요! 심지어 적은 연산으로 실시간 동작이 가능합니다. (게다가 세계 최고 수준의 성능!)   우리는 화상 회의를 할 때 주변 잡음(노이즈)로 인한 불편함을 참 많이 느끼는데요. 이러한 노이즈를 제거하는 신호 처리 기반의 노이즈 제거 필터가 WebRTC에 포함되어 있습니다. (앞으로 말씀드리겠지만, WebRTC에는 노이즈 제거 필터 이외에도 통화 품질을 높이기 위한 필터들이 이미 존재한다는 사실!) 이 노이즈 제거 필터는 위에서 언급된 APM(Audio Processing Module) 모듈에 포함되어 있습니다.   여기서 기존 신호 처리 기반의 노이즈 제거 필터를 가우디오랩의 인공지능 기반의 노이즈 제거 필터로 교체한다면 효과가 얼마나 좋아질까요? 당장 기존 노이즈 제거 필터를 GSEP-LD로 교체해서 들어 보고 싶은 마음이 앞서지만.., 잠시만요! 이런 복잡하고 거대한 프로젝트에 필터를 통합(혹은 교체)하기 위해서는 마음만 앞서서는 안됩니다. 왜냐하면 마음만 앞서서 무턱대고 통합을 하다보면, 아래와 같은 의문점들이 점점 머리를 복잡하게 만들기 때문입니다.   GSEP-LD의 원본의 성능이 잘나오나요? → 원본의 성능이 얼마나 좋은지 확보해야 합니다. 기존 신호처리 기반의 필터들과 사이드 이펙트는 없을까요? → WebRTC의 다른 필터들을 제어하며 들어봐야 합니다. 최적의 통합 위치는 기존 노이즈 제거 필터의 위치와 같을까요? → 통합 위치를 바꾸어가면서 들어봐야 합니다. 다양한 사용자 환경에서 성능을 보장할 수 있을까요? → 다양한 실험 데이터와 플랫폼별 환경이 필요합니다.   마음만 앞서 본 게임으로 바로 들어간다면, 위와 같은 질문들에 휘둘리며 효과적인 통합과 점점 멀어지게 될 것 입니다. 그러지 않기 위해서는 먼저 ‘견고한 테스트 환경의 구축’이 필요합니다. 특히 많은 기술들이 얽혀있는 거대한 프로젝트일 수록, 그 중요성은 더욱 더 높아집니다.   하지만 견고한 테스트 환경을 구축하는 일은 쉽지 많은 않은 일인데요. 이번 글은 WebRTC의 오디오 기술에 대해 설명해드렸다면, 다음 글에서는 제가 WebRTC에서 견고한 테스트 환경을 비교적 간단히 구축해 본, WebRTC Audio 파이프라인에 GSEP-LD을 통합해 성능의 자신감을 높일 수 있었던 경험을 공유할게요!   ☛ 잠깐, 그 전에 GSEP-LD의 AI 최적화를 위해 Asher가 고군분투한 이야기 들어보실래요? 🙂          

2023.06.23
after-image
가사 싱크? AI가 직접 합니다: GTS PO가 직접 소개하는 GTS

가사 싱크? AI가 직접 합니다: GTS PO가 직접 소개하는 GTS (Writer: John Jo)     들어가며 : GTS 소개에 앞서 제 소개를 먼저 할게요.   안녕하세요! 가우디오랩에서 GTS의 PO를 담당하는 존이라고 합니다. 가우디오랩에서는 GTS(Gaudio Text Sync)라는 제품의 PO로, 퇴근 후에는 재즈 보컬리스트로 활동하고 있답니다. 뉴올리언스 마칭밴드인 SoWhat NOLA의 리더이자 보컬을 담당하고 있어요. (막간 홍보)      여러분은 ‘음악을 눈으로도 듣는다 👀’라는 말에 공감하시나요?   바로 노래 가사 이야기인데요. GTS는 요즘 스트리밍 서비스에서 빼놓을 수 없는 ‘실시간 가사 보기’ 기능에 직접 적용되는 제품으로, AI가 자동으로 가사와 음악의 싱크를 맞추는 기능을 제공합니다.   오늘 저는 여러분께 GTS에 대해 소개해 드리고, 저와 가우디오랩이 함께 낳고 기르는(?) 이 AI 제품이 세상을 어떻게 변화시키고 있는지 말씀드리고자 합니다.       ‘실시간 가사 보기’의 알려지지 않은 뒷 이야기   오늘 날 대부분의 뮤직스트리밍 서비스가 실시간 가사 서비스를 제공하고 있는데요.   <실시간 가사 서비스의 예시 화면 - 이렇게 말이죠!>   최근까지 뮤직 스트리밍에 인입되는 곡들의 가사와 멜로디의 싱크를 사람이 일일이 들어가며 손수 맞추고 있었다는 사실, 알고 계셨나요? (보통 ‘찍는다’고들 하죠)   사람이 직접 싱크 가사를 만들다 보니 필연적인 단점들이 생기는데요, 아마 우리가 흔히 겪어봤던 일일 겁니다.   일단 느립니다. 한 곡 싱크를 위해서는 한 곡 전체를 다 들어야하고 랩처럼 가사가 정말 빠르게 지나가거나 한국어가 아닌 다른 언어가 주 언어가 된다면, 처리 시간은 기하급수적으로 늘어날 수밖에 없죠. 퀄리티가 일정하지 않습니다. 위에서 말씀드린 속도와도 연관되는 이야기일텐데요, 싱크가 어려운 음원일수록 시간이 더 오래 걸리기 때문에 하루에 여러 곡을 처리해야하는 담당자들이 모든 곡을 완벽하게 처리하는 것은 불가능에 가깝겠죠. 음악 시장에는 하루에도 수 만곡 씩 곡들이 쏟아져 나옵니다. 음악 스트리밍 서비스들이 가사를 싱크하기 위해 인건비를 더 많이 지출해야하는 것은 당연한 일이죠. 게다가 관리 비용까지 생각한다면… 만만한 비용으로 할 수 있는 작업이 아닙니다. 아티스트의 문제도 해결합니다. 저도 앨범을 발매할 때 가사 싱크의 문제로 어려움을 겪은 적이 있어요. 재작년에 제 첫 앨범을 발매 했었는데, 해외 스트리밍 서비스(애플뮤직?)에서 실시간 가사 서비스를 제공해주지 않아 제가 직접 한땀 한땀 싱크 작업 서비스를 이용했던 것이 생각나네요. 반면, GTS가 도입되어 있는 국내 스트리밍 서비스에서는 싱크가 잘 맞아 흐뭇해했던 기억이 납니다.     이 문제를 한 큐에 해결하는 AI, GTS에 대해 조금 더 알려드릴게요.       <GTS 개념도>   GTS는 Gaudio Text Sync의 약어인데요, 쉽게 말하자면 [AI가 가사와 음원을 자동으로 동기화 해주는 솔루션] 입니다. 예를 들어, BTS의 신곡 “Take Two”의 mp3 파일과 “Take Two”의 가사가 적힌 txt 파일만 있으면 가사들의 타임라인을 자동으로 생성해주죠.   에이 그래도 시간이나 비용이 얼마나 단축되겠어? 라고 물으신다면!   GTS는 1곡에 5초면 충분하고 영어, 한국어, 중국어, 일본어까지도 커버합니다. 어떤 곡을 프로세싱하든, 사람보다 월등한 성능으로 정확하게, 그리고 훨씬 빠르게 타임라인을 만들어냅니다. 에미넴이나 아웃사이더처럼 빠른 곡들도 문제 없죠. 이와 유사한 문제를 겪고 있는 스트리밍 서비스라면, 바로 채택할 수밖에 없습니다. (그리고 그게 여러분의 비즈니스에 좋아요!) 싱크 결과물 뿐만 아니라 싱크가 얼마나 잘 되었는지, 각 가사의 라인마다 싱크가 잘못 생성이 되지는 않았는지를 담은 곡마다의 ‘싱크 결과 리포트’를 제공합니다. 서비스를 제공 받으시는 분들은 해당 리포트를 가지고 잘못된 가사나 싱크를 손쉽게 검토하고 수정할 수 있죠. (퇴근시간이 빨라져요!) 이제 한국 뮤직 스트리밍 서비스 대부분은 GTS를 통해 만들어 낸 실시간 가사를 고객들에게 제공하고 있습니다. 해외의 스트리밍 서비스들도 눈독을 들이고 있고, 계속 긴밀한 미팅을 진행 중에 있습니다. 한국은 잡았고, 해외로 갑니다! 부릉! 하지만 아직 놀라긴 일러요. 가사의 줄 별 타임라인을 만들어내는 것부터 시작한 GTS는 이제 어절 별 타임라인까지 찍어내기 때문이죠. 기술의 고도화를 통해 이제 어절 별을 넘어 노래방에서 볼 수 있는 글자 별 타임라인까지 생성하는 것을 로드맵으로 리서치팀, 개발팀과 함께 움직이고 있습니다.     백문이 불여일견, 한 번 비교 해봅시다.   한국의 음악 스트리밍 플랫폼인 G사와 NAVER VIBE의 가사 싱크를 함께 볼까요? 제가 좋아하는 Incognito라는 그룹의 Still a friend of mine 이라는 곡을 골라봤어요.     먼저 G사의 실시간 가사보기 화면인데요, 싱크가 거의 1줄 이나 차이나는 걸 보실 수 있죠. 다들 이런 경험 있으실거예요. 참 답답하고 불편하죠. 해당 가사를 눌렀을 때 딱 그 구간으로 이동해서 듣는 데도 어려움이 있고요.     그리고 아래는 GTS를 적용한 VIBE입니다. 싱크가 잘 맞아 음악을 즐기기에 훨씬 좋네요. (바이브의 전매특허, 원어민 급 자연스러운 번역 가사를 볼 수 있는 것은 덤!)       GTS는 세상을 이렇게도 바꾸고 있어요   이은교육: 청각 장애인들도 음악을 들을 수 있어요.   GTS는 청각 장애인용 음악 교육 서비스에도 쓰입니다. 어절 별 진동을 통해 청각 장애인에게도 음악을 향유할 수 있도록 하는 건데요. 이 어플리케이션의 런칭을 준비하고 있는 한국의 이은교육에서도 GTS가 활약하고 있습니다. GTS가 어절별 시작 점과 끝 점 타임라인을 도출하는 과정에 쓰여 청각 장애인들이 가사의 마디 마디를 구분할 수 있도록 돕습니다. 훌륭한 AI 기술을 통해 세상을 더 좋게 만든다는 가우디오랩의 미션을 실천 중이지요.     <이은교육과의 미팅>   콘샐러드: 인디 뮤지션도 쉽게 리릭 비디오(가사 비디오)를 만들 수 있어요! 콘샐러드에서는 인디 아티스트들의 신곡 홍보를 위해 리릭 비디오(Lyric Video, 아래 그림 참조)를 만들어 배포를 하고 있는데요. 이 리릭 비디오의 가사 싱크를 위해 GTS가 이용되고 있기도 합니다. 가우디오랩의 기술로 인디 뮤지션들의 홍보를 돕는 것이죠.     다시 한 번 가우디오랩의 미션인 ‘혁신적인 기술로 사람들에게 훌륭한 소리경험을 제공한다'를 실천 중인 사례라고 볼 수 있겠죠?   여기서 멈추지 않습니다. 무궁무진한 GTS의 세계…   텍스트와 음성의 싱크가 필요한 곳이면 전부 가능합니다. OTT나 영상의 폐쇄자막과 음성의 싱크가 필요할 때 오디오북에서 오디오와 텍스트의 싱크가 필요할 때 어학학습을 위해 오디오와 텍스트의 싱크가 필요할 때 그 외에도 GTS가 적용될 수 있는 곳은 생각보다 세상 곳곳에 많이 있으니, 언제든 저를 찾아주세요 🙂     끝 맺으며   제가 가우디오랩에 합류해서 제일 먼저 한 일은 바로 GTS의 상용화였습니다. 이제는 GTS가 한국 대부분의 뮤직스트리밍에서 쓰이는 제품이 되어 많은 유저들이 더욱 풍성하게 음악을 들을 수 있도록 기여하고 있으니 정말 뿌듯한 마음입니다.   제 다음 타겟은 한국 외의 모든 시장들입니다. 전 세계의 수많은 음악/OTT 등 스트리밍 서비스에 GTS가 적용될 수 있게 박차를 가할 예정입니다.   한국을 넘어 전 세계 유저들의 청취 경험을 개선하고 싶으신 분들, 어서 가우디오랩의 문을 두드리세요! 🙂          

2023.07.07