OpenAI의 WebRTC 문제점
WebRTC 전문가가 OpenAI가 음성 AI에 WebRTC를 사용하는 것을 강하게 비판하는 글입니다. WebRTC는 낮은 지연 시간을 위해 오디오 패킷을 과도하게 드롭하고 버퍼링이 불가능하여, 비용이 많이 드는 LLM 프롬프트가 손상될 수 있습니다. 특히 TTS가 실시간보다 빠르게 생성됨에도 불구하고 불필요한 대기 시간을 추가하고 네트워크 변동에 취약해지는 구조적 모순을 지적합니다.
2026년 5월 6일 게시됨
OpenAI의 WebRTC 문제
며칠 전 OpenAI가 기술 블로그 글을 올렸습니다. 이 블로그 글은 내가 감당할 수 있는 수준 이상으로 나를 자극했고, 나의 두툼한 손가락이 키보드를 두드리도록 강력히 충동질했습니다.
여러분은 OpenAI를 본받아서는 안 됩니다. 나는 여러분이 음성 AI에 WebRTC를 사용해서는 안 된다고 생각합니다. WebRTC가 바로 문제입니다.
나에 대하여 약 6년 전, 나는 Twitch에서 WebRTC SFU를 작성했습니다. 원래 우리는 OpenAI와 똑같이 Pion(Go 언어 기반)을 사용했지만, 벤치마크 결과 너무 느린 것으로 나타나 포크(Fork)를 떴습니다. 결국 나는 모든 프로토콜을 다시 작성했는데, 당연히 그렇게 할 수밖에 없었으니까요!
딱 1년 전, 나는 Discord에 있었고 WebRTC SFU를 Rust로 다시 작성했습니다. 당연히 그렇게 할 수밖에 없었죠! 여러분은 아마 이런 패턴을 눈치채셨을 겁니다.
재미 있는 사실: WebRTC는 2000년대 초반으로 거슬러 올라가는 약 45개의 RFC(비표준 규격)로 구성되어 있습니다. 그리고 기술적으로는 아직 초안인 사실상의 표준(예: TWCC, REMB)들도 있습니다. 이 모든 것을 직접 구현해야 할 때는 결코 재미있는 사실이 아닙니다. 저를 공인된 WebRTC 전문가로 생각하셔도 됩니다. 그렇기 때문에 저는 두 번 다시 WebRTC를 사용하고 싶지 않습니다.
제품 적합성 생각이 식기 전에 뜨거운 논쟁거리부터 먼저 꺼내면서 살짝 치트를 쓰겠습니다. 걱정 마세요, OpenAI 블로그 글과 로드 밸런싱에 대한 이야기로 바로 돌아갈 테니까요.
WebRTC는 음성 AI에 적합하지 않습니다. 하지만 이는 직관에 반하는 것 같네요? WebRTC는 화상 회의용이고, 그건 말하는 것이 포함되어 있잖아요? 그리고 로봇도 말할 수 있죠?
WebRTC는 너무 공격적입니다. 내가 휴대폰에서 OpenAI 앱을 켜고 스칼렛 요한슨 목소리의 AI에게 안녕이라고 인사한 뒤 이렇게 말한다고 가정해 봅시다. "세차장까지 걸어가야 할까요, 운전해서 가야 할까요?"
WebRTC는 열악한 네트워크 환경에서 대기 시간(Latency)을 낮게 유지하기 위해 나의 프롬프트를 열화시키고 드롭하도록 설계되어 있습니다. 이게 무슨 소리냐고요.
WebRTC는 대기 시간을 낮추기 위해 오디오 패킷을 공격적으로 버립니다. 화상 회의 중 끊기는 소리를 들어본 적이 있나요? 그게 바로 WebRTC가 만든 결과물입니다. 화상 회의는 빠른 주고받기에 의존하므로, 오디오를 기다리기 위해 멈추는 것은 용납되지 않는다는 게 그 이유입니다.
...하지만 사용자 입장에서는, 느리고 비용이 많이 드는 내 프롬프트가 정확하게 처리되기 위해 200ms를 더 기다리는 편이 훨씬 나을 것입니다. 결국, 막대한 비용을 지불하며 바다를 끓이는(엄청난 연산을 수행하는) 중인데, 쓰레기 같은 프롬프트는 쓰레기 같은 응답을 의미하니까요. LLM이 원래 반응 속도가 엄청 빠른 것도 아닙니다. 하지만 나는 기다릴 수 조차 없습니다.
브라우저 내에서 WebRTC 오디오 패킷을 재전송하는 것은 불가능에 가깝습니다. 우리가 Discord에서 시도해봤으니까요. 이 구현은 실시간 대기 시간을 유지하도록 하드 코딩되어 있습니다.
맞습니다. 음성 AI 에이전트는 결국 대기 시간을 대화 가능한 수준으로 줄일 것입니다. 하지만 대기 시간을 줄이는 데는 트레이드오프가 있습니다. 나는 고의로 오디오 프롬프트를 열화시키는 것이 언제든 가치가 있을지조차 확신하지 못합니다.
TTS는 실시간보다 빠릅니다. 사용자가 마이크에 말하면, 그 소리는 OpenAI의 수십억 대 서버 중 한 곳으로 전송되고, GPU가 텍스트 음성 변환(TTS)을 통해 사용자에게 말을 겁니다. 멋지네요.
8초짜리 오디오를 생성하는 데 2초의 GPU 시간이 걸린다고 가정해 봅시다. 이상적인 세계에서는 오디오가 생성되는 대로(2초에 걸쳐) 스트리밍하고, 클라이언트는 이를 재생(8초에 걸쳐)하기 시작할 것입니다. 그렇게 하면 네트워크에 문제가 생겨도 일부 오디오가 로컬에 버퍼링되어 있기 때문에 사용자는 네트워크 장애를 전혀 눈치채지 못할 것입니다.
하지만 아니죠, WebRTC에는 버퍼링이 없으며 도착 시간에 맞춰 렌더링합니다. 진심으로요, 타임스탬프는 그저 참고 사항일 뿐입니다. 여기에 비디오까지 들어가면 더욱 짜증납니다.
이를 보상하기 위해 OpenAI는 패킷이 렌더링되어야 하는 정확한 시간에 도착하도록 만들어야 합니다. 오디오 패킷을 보내기 전에 매번 대기 시간(Sleep)을 추가해야만 하죠. 하지만 네트워크 정체가 발생하면, 이런, 해당 오디오 패킷을 잃어버렸고 재전송은 영영 불가능해집니다.
OpenAI는 말 그대로 인위적인 대기 시간을 도입한 다음, "대기 시간을 낮게 유지"하기 위해 공격적으로 패킷을 드롭하고 있습니다. 이는 버퍼링을 하는 대신 YouTube 동영상을 화면 공유하는 것과 같습니다. 품질은 저하될 수밖에 없죠.
재미 있는 사실: WebRTC는 실제로 대기 시간을 추가합니다. 많지는 않지만 WebRTC는 20ms에서 200ms(오디오의 경우) 사이로 크기가 조절될 수 있는 동적 지터 버퍼(Jitter Buffer)를 가지고 있습니다. 이는 네트워크 지터를 완화하기 위한 것이지만, 실시간보다 빠르게 전송한다면 이런 것은 전혀 필요 없습니다.
포트, 포트, 포트 자, 이제 OpenAI 기사의 기술적인 핵심에 대해 이야기해 봅시다. 우리는 더 이상 배 위에 있지 않습니다.