끼어들기 없이 말 끊지 않기: 프로덕션 음성 에이전트의 한국어 턴테이킹

한국어 대화는 맞장구로 굴러갑니다. 영어 기준으로 만든 침묵 감지는 그 맞장구를 '말이 끝났다'로 읽습니다. 저희가 무엇을 바꿨는지 적었습니다.

낮은 나무 탁자를 사이에 두고 마주 놓인 두 개의 방석과 찻잔 두 개, 사람은 없는 방.

음성 에이전트에서 가장 먼저 무너지는 것은 인식률이 아니라 대화의 리듬입니다. 상대가 아직 말하고 있는데 에이전트가 끼어들면, 그 통화는 그 시점부터 이미 실패한 것입니다.

영어 파이프라인을 그대로 가져오면 한국어에서 이 문제가 특히 두드러집니다. 한국어 대화는 듣는 사람이 계속 소리를 냅니다. "네", "음", "아 예" 같은 맞장구가 끊임없이 들어옵니다. 이것은 말을 넘겨받겠다는 신호가 아니라, 잘 듣고 있다는 신호입니다.

침묵만 보면 틀립니다

가장 단순한 턴테이킹 규칙은 "일정 시간 침묵하면 말이 끝난 것으로 본다"입니다. 이 규칙은 한국어에서 두 방향으로 모두 틀립니다.

맞장구가 들어오면 시스템은 상대가 말을 시작했다고 판단해 하던 말을 멈춥니다. 반대로 임계값을 넉넉하게 잡으면, 이번에는 상대가 말을 마쳤는데도 에이전트가 어색하게 기다립니다. 둘 다 통화를 망칩니다.

저희가 실제로 하는 일

파이프라인은 Silero 기반 음성 활동 감지를 0.2초 종료 기준으로 사용하되, 그 위에 맞장구 처리를 얹습니다. 짧고, 에너지가 낮고, 상대의 발화 흐름을 끊지 않는 신호는 턴 종료로 취급하지 않습니다. 끼어들기와 단순한 호응을 구분하는 것이 핵심입니다.

여기에 더해 한국어 텍스트 정규화가 같은 처리 경로 안에서 함께 돌아갑니다. 숫자, 단위, 날짜, 외래어 표기가 음성으로 나갈 때 어색해지지 않도록 스무 개의 프로세서가 스트림을 한 번 지나가는 동안 같이 실행됩니다.

지연 시간은 정직하게 다룹니다

말이 끊기지 않게 만드는 것과, 빨라 보이게 만드는 것은 다릅니다. 인사말은 세션 시작 시점에 미리 합성해 두고, 도구 호출이 약 0.8초를 넘기면 한국어 필러 음성이 그 사이를 메웁니다. 사용자는 무음을 듣지 않습니다.

통화별로 첫 오디오까지의 시간과 첫 바이트까지의 시간을 계측하지만, 이 수치를 벤치마크로 공개하지는 않습니다. 저희가 운영을 위해 보는 지표이지, 마케팅 숫자가 아닙니다.

남은 것

턴테이킹은 "해결했다"고 말할 수 있는 종류의 문제가 아닙니다. 말투, 지역, 통화 환경에 따라 계속 어긋납니다. 그래서 이 부분은 기능 플래그 뒤에 두고, 확신이 서지 않을 때는 기능을 낮추는 쪽을 기본값으로 둡니다. 통화를 끊는 것보다는 조금 덜 똑똑하게 구는 편이 낫습니다.

이 글은 작성 시점의 구현 상태를 설명합니다. 수치는 저장소에서 직접 센 값이며, 공개 벤치마크나 성능 보증이 아닙니다.