DTMF란? 톤 주파수와 음성 AI에서의 활용

Rene, Kabir Goel 
DTMF란? 톤 주파수와 음성 AI에서의 활용

DTMF는 전화 키를 누를 때 나는 소리입니다. 각 키는 낮은 그룹에서 하나, 높은 그룹에서 하나, 두 개의 톤을 동시에 내고, 반대편 시스템이 이 조합을 숫자로 해석합니다. 이름 그대로 이중 톤 다중 주파수(dual-tone multi-frequency)입니다. Bell이 1963년 Touch-Tone이라는 이름으로 도입했고, 주파수는 지금도 ITU-T 권고 Q.23이 정의합니다.

60여 년이 지난 지금도 DTMF는 통화자가 계좌번호를 입력하고, 메뉴를 건너뛰고, 비밀번호를 누르는 방법이며, 소프트웨어가 다른 소프트웨어의 전화 메뉴를 탐색하는 방법입니다. 그리고 “어제까지는 숫자가 들어갔는데요”라는 문의의 단골 원인이기도 합니다. VoIP 통화에서는 톤이 세 가지 방식으로 전달될 수 있기 때문입니다. 이 가이드는 톤의 원리, 세 가지 전달 방식, 숫자가 사라지는 이유, 그리고 전화를 받거나 거는 쪽이 AI 음성 에이전트일 때 달라지는 점을 다룹니다. 전화 흐름을 맡은 엔지니어와 컨택센터 팀을 위해 썼습니다.

(Bad Bunny의 “DtMF”를 찾으셨나요? 『DeBÍ TiRAR MáS FOToS』에 실린 곡입니다. 페이지는 잘못 오셨지만, 명반입니다.)

DTMF 주파수

키패드는 4×4 격자입니다. 각 행에는 낮은 주파수가, 각 열에는 높은 주파수가 있고, 키를 누르면 해당 행과 열의 소리가 함께 울립니다.

1209 Hz1336 Hz1477 Hz1633 Hz
697 Hz123A
770 Hz456B
852 Hz789C
941 Hz*0#D

5를 누르면 770 Hz와 1336 Hz, #을 누르면 941 Hz와 1477 Hz가 울립니다. 네 번째 열의 AD는 군용·통신망 장비에서 쓰였고 일반 전화기에는 거의 없으니, 실제로 다룰 키는 09, *, #의 12개입니다.

톤을 하나가 아니라 두 개 쓰는 것이 영리한 부분입니다. 사람의 목소리나 음악이 이 조합 중 낮은 주파수 하나와 높은 주파수 하나에만 동시에 에너지를 모으는 경우는 드물어서, 디코더가 키 입력과 목소리를 구분할 수 있습니다. 표준은 두 톤의 길이와 음량 차이에도 제한을 두어, 누군가 회선에서 말하고 있어도 오탐지가 드뭅니다.

요즘 통화에서 DTMF가 전달되는 방식

구리선 유선전화에서 DTMF는 선을 타고 흐르는 소리 그 자체였습니다. IP 통화에는 세 가지 방식이 있고, 양쪽 끝이 그중 하나에 합의해야 합니다.

방식숫자가 전달되는 방법문제가 생기는 곳
대역 내 오디오톤이 다른 소리처럼 통화 오디오에 섞임압축 코덱과 패킷 손실이 톤을 왜곡해 숫자가 누락되거나 두 번 인식됨
RTP 이벤트 (RFC 4733 / 2833)RTP 스트림 안의 telephone-event 패킷이 숫자와 길이를 알림한쪽은 이벤트를 보내고 다른 쪽은 오디오만 들음
SIP INFO시그널링 경로의 SIP INFO 메시지가 오디오와 별도로 숫자를 전달INFO를 전달하지 않는 프록시와 통신사, 오디오와 어긋나는 타이밍

RFC 4733은 2006년에 RFC 2833을 대체했지만, PBX와 통신사 설정에는 여전히 “RFC 2833”이라고 적힌 경우가 많습니다. 같은 옵션입니다. 이 RFC는 존재 이유를 한 문장으로 설명합니다. 저비트레이트 음성 코덱은 “자동 인식에 충분할 만큼 정확하게 이 톤 신호를 재현한다고 보장할 수 없다”. 대부분의 통화가 쓰는 8 kHz G.711은 톤을 잘 전달하지만, G.729 같은 저비트레이트 코덱은 그렇지 못한 경우가 많습니다.

안전한 기본값은 RTP 이벤트입니다. 어떤 코덱에서도 깨지지 않고, 해석해야 할 소리가 아니라 정확한 숫자를 담으며, 대부분의 통신사와 플랫폼이 지원합니다. 예를 들어 LiveKit의 전화 스택은 DTMF를 telephone-event/8000 이벤트로 보냅니다.

DTMF 숫자가 사라지는 이유

VoIP 통화에서 키 입력이 실패할 때 원인은 대개 다음 중 하나입니다.

  • 방식 불일치. 통신사는 RFC 4733 이벤트를 보내는데 반대편 시스템은 대역 내 오디오만 해석하거나, 그 반대입니다. 통화의 양쪽 구간에서 SDP 오퍼와 앤서의 DTMF 모드를 확인하세요.
  • 압축된 오디오. 저비트레이트 코덱으로 트랜스코딩하는 구간이 대역 내 톤을 망가뜨립니다. 그 구간을 RTP 이벤트로 바꾸거나 G.711로 유지하세요.
  • 숫자 중복. 게이트웨이가 톤을 오디오와 이벤트 양쪽으로 보내고 수신 측이 둘 다 세면 “1234”가 “11223344”로 도착합니다.
  • 듣기만 하는 미디어 스트림. 일부 스트리밍 API는 특정 모드에서만 키 입력을 전달합니다. 예를 들어 Twilio Media Streams는 양방향 스트림에서만 dtmf 메시지를 보냅니다.
  • 타임아웃. 통화자가 숫자 사이에 잠시 멈추면 시스템이 일부만 입력된 값을 제출합니다. Twilio의 <Gather>는 기본적으로 5초를 기다리고 #을 누르면 제출합니다. 끝에 #을 누르라고 안내하고, 자릿수를 알면 지정하세요.

가장 빠른 테스트는 실제 통신사를 거치는 실제 전화입니다. 전화를 걸어 모든 키를 누르고, 같은 숫자가 반복되는 번호도 입력해 보세요. 브라우저 소프트폰과 SIP 테스트 클라이언트는 공중망의 휴대전화와 다른 방식으로 협상하는 경우가 많습니다.

DTMF와 AI 음성 에이전트

음성 에이전트가 “요금 문의는 1번을 누르세요” 같은 메뉴를 많이 대체하고 있지만, 키패드는 사라지지 않습니다. 에이전트는 DTMF를 두 방향으로 다룹니다. 통화자가 에이전트에게 키를 누르는 경우와, 에이전트가 다른 회사의 시스템에 키를 누르는 경우입니다.

통화자의 키 입력 받기

말하기보다 누르기를 좋아하는 사람도 있고, 말하는 것보다 누르는 게 쉬운 번호도 있습니다. 잡음 많은 회선에서 16자리 계좌번호를 소리 내어 읽는 것은 음성 인식 시험이지만, 같은 번호를 키패드로 누르면 모호함 없는 16번의 입력입니다. 좋은 에이전트는 메뉴 없이 같은 대화 안에서 둘 다 받아들입니다.

키 입력을 에이전트에서 잘 다루는 몇 가지 규칙이 있습니다.

  • 입력이 끝날 때까지 기다리기. 통화자는 회원번호를 한 번에 누릅니다. 에이전트가 첫 숫자 뒤에 대답하면 나머지 입력 위로 말하게 됩니다. Cartesia Managed Agents는 통화자가 멈출 때까지 숫자를 모은 뒤 하나의 키 입력 턴으로 모델에 전달하고, 말한 것이 아니라 누른 것임을 모델이 알 수 있도록 표시합니다.
  • 키 입력으로 끼어들 수 있게 하기. 말하는 도중에 누르기 시작한 통화자는 에이전트가 말을 멈추길 원합니다. Managed Agents에서는 키 입력이 말과 똑같이 에이전트의 응답을 끊습니다.
  • 민감한 정보는 모델에서 떨어뜨리기. 카드 번호나 비밀번호 전체를 에이전트로 받지 마세요. PCI 범위 안에 머무는 결제 회선으로 전환하고 토큰이나 결과만 돌려받으세요. 자세한 내용은 은행 가이드를 참고하세요.
  • 무엇을 누를지 말하기. “회원번호를 누르고 마지막에 #을 눌러 주세요”가 “회원번호를 알려 주세요”보다 잘 통합니다. 통화자가 두 방법 모두 쓸 수 있다는 걸 알게 되니까요.

Managed Agents에서는 Twilio를 통한 통화와 에이전트 WebSocket에서 키 입력이 에이전트에 전달됩니다. 자체 클라이언트를 WebSocket에 연결한다면 키 입력마다 dtmf_input 이벤트로 전달하세요.

{ "type": "dtmf_input", "digit": "5" }

유효한 숫자는 0~9, *, #입니다. SIP 트렁크를 포함한 그 밖의 전화 경로에서는 키 입력에 의존하는 흐름을 만들기 전에 테스트 통화로 에이전트가 키 입력을 받는지 확인하세요.

톤을 보내 다른 전화 메뉴 탐색하기

다른 방향은 에이전트가 키를 누르는 경우입니다. 보험사, 약국, 공급업체에 전화를 거는 아웃바운드 에이전트는 매 통화의 첫 1분을 상대방의 IVR에서 보냅니다. Cartesia로 의료 기관을 대신해 보험사 통화를 처리하는 SuperDial이 에이전트에 IVR 탐색 기능을 넣은 것도 이 때문입니다.

Managed Agents에서 send_dtmf 시스템 도구를 켜세요(Playground의 Tools 페이지에서는 Send keypad tones). 메뉴가 입력을 요구할 때 에이전트가 12#처럼 하나 이상의 톤을 보낼 수 있습니다.

{
	"config": {
		"system_tools": {
			"send_dtmf": {}
		}
	}
}

전화 메뉴는 인내심 있는 사람을 위해 만들어졌으니 에이전트에게 행동 방식을 알려 주세요.

  • 안내를 끝까지 듣고 누르기. 안내가 끝날 때까지 입력을 무시하는 메뉴가 많고, 원하는 선택지는 마지막에 있는 경우가 많습니다.
  • 알고 있는 경로는 프롬프트에 넣기. “Acme Health에서는 2, 4를 차례로 누른 뒤 의료 기관 NPI를 입력하고 #을 누른다.” 동적 변수로 통화마다 ID를 채울 수 있습니다.
  • 탐색 중에는 말하지 않기. 회선의 목소리는 톤이나 음성을 듣는 메뉴를 혼란스럽게 할 수 있습니다. 이 도구는 에이전트가 읽어 주지 않고 톤만 보냅니다.
  • 사람이 받을 때를 대비하기. 상담원이 전화를 받으면 에이전트는 메뉴 모드에서 대화로 전환해야 합니다. 그 전환을 프롬프트에 써 두세요.

전체가 제대로 작동하는지는 다른 전화 흐름과 같은 시나리오로 확인합니다. IVR 테스트 가이드에서 스크립트로 만든 키 입력 경로와 결과로 에이전트를 평가하는 방법을 다룹니다.

Cartesia의 역할

Cartesia는 음성 에이전트가 돌아가는 음성 모델을 만듭니다. 음성 합성용 Sonic과 음성 인식용 Ink입니다. Managed Agents는 이 모델들을 호스팅형 에이전트로 묶어 Cartesia 번호, Twilio, 또는 자체 SIP 트렁크로 오는 전화를 받으며, send_dtmf와 통화 전환이 내장되어 있습니다. 에이전트 통화 요금은 분당 0.06달러이고, playground에서 만들어 내 전화로 걸어 볼 수 있습니다.

고정된 키패드 메뉴만 필요하다면 Twilio 같은 CPaaS나 기존 PBX로 충분합니다. 에이전트가 제값을 하는 것은 통화자가 말하기와 누르기를 섞어 쓸 때, 또는 자사의 통화가 다른 회사의 메뉴를 통과해야 할 때입니다.

관련 가이드

자주 묻는 질문

DTMF란 무엇인가요?

DTMF는 dual-tone multi-frequency(이중 톤 다중 주파수)의 약자로, 전화 키를 누를 때 쓰는 신호 방식입니다. 각 키는 낮은 톤과 높은 톤을 동시에 내고, 반대편 시스템이 이 조합을 숫자로 해석합니다. Bell이 1963년 Touch-Tone이라는 이름으로 도입했고, 주파수는 ITU-T 권고 Q.23에 표준화되어 있습니다.

DTMF 톤 주파수는 어떻게 되나요?

키패드의 행은 697, 770, 852, 941 Hz, 열은 1209, 1336, 1477, 1633 Hz를 씁니다. 예를 들어 5를 누르면 770 Hz와 1336 Hz가 함께 울립니다. 1633 Hz 열은 A, B, C, D 키로, 대부분의 전화기에는 없습니다.

VoIP 통화에서 DTMF가 작동하지 않는 이유는 무엇인가요?

대개 양쪽 끝이 전달 방식에 합의하지 못했기 때문입니다. DTMF는 통화 오디오 속 소리, RTP 전화 이벤트(RFC 4733), SIP INFO 메시지 중 하나로 전달됩니다. 압축 코덱은 대역 내 톤을 왜곡하고, 한쪽은 이벤트를 보내는데 다른 쪽은 오디오만 듣고 있으면 숫자가 사라집니다. 양쪽이 같은 방식을 협상하는지 확인하고 RFC 4733 이벤트를 우선 사용하세요.

RFC 2833과 RFC 4733의 차이는 무엇인가요?

같은 것을 설명합니다. RFC 4733은 2006년에 RFC 2833을 대체했으며, DTMF 숫자를 RTP 오디오 스트림 안의 이름 있는 이벤트로 보내는 방법을 정의합니다. 장비와 통신사 설정에는 아직 "RFC 2833"으로 표시되는 경우가 많으니 두 이름을 같은 옵션으로 보면 됩니다.

AI 음성 에이전트가 DTMF 톤을 감지하고 보낼 수 있나요?

플랫폼이 지원하면 가능합니다. Cartesia Managed Agents에서는 send_dtmf 시스템 도구로 에이전트가 키를 눌러 다른 회사의 전화 메뉴를 탐색할 수 있으며, 0~9, *, # 톤을 지원합니다. Twilio 통화와 에이전트 WebSocket에서는 에이전트가 통화자의 키 입력도 읽고 응답합니다. 의존하기 전에 자사 통신 경로에서 수신 키 입력을 테스트하세요.