VXML: 음성 IVR 대화 흐름을 선언형으로 설계하기
W3C VoiceXML의 폼 기반 대화 모델과 오류 처리, SRGS·SSML·MRCP 연계 구조를 정리하고 컨택센터 셀프서비스 구축과 NLP 음성봇과의 트레이드오프를 설명한다.
2026-08-13 · 최초 발행 2025-12-03
전화를 걸어 잔액을 확인하거나 결제를 진행할 때 사용자가 듣는 안내 멘트와, 그 입력을 처리하는 로직은 어디에 정의돼 있을까. VXML(Voice eXtensible Markup Language)은 음성 IVR(Interactive Voice Response) 애플리케이션을 선언적으로 기술하는 W3C 표준 기반 마크업 언어다. 텔레포니 게이트웨이, 음성 브라우저, ASR/TTS 엔진과 연계해 음성 안내, 입력 수집, 오류 처리, 상태 관리를 정의하며, 기업 컨택센터의 셀프서비스 자동화와 통화 처리 비용 절감의 핵심 기술로 쓰인다.
VXML이 정의하는 것
VXML은 음성 대화 흐름, 프롬프트, 입력 수집(음성/DTMF), 이벤트 처리(noinput/nomatch/error) 등을 XML로 기술하는 표준 언어다. 통화 제어(CCXML/SIP)와 대화 로직(VXML)을 분리해 설계하는 것이 핵심 개념으로, 게이트웨이는 세션·호 제어를 맡고 VXML은 대화 상태 관리와 사용자 상호작용 정의를 맡는다. 관련 표준으로는 인식 규칙을 정의하는 SRGS(Grammars), 음성 합성을 제어하는 SSML, ASR/TTS 자원에 접근하는 MRCP, 애플리케이션 서버와 동적 문서를 로딩하는 HTTP가 연계된다.
대화를 어떻게 모델링하는가
대화 상태 모델과 폼 기반 흐름은 form, field, block 단위로 상태 전이를 정의한다. 입력 수집과 프롬프트 재생을 일관되게 모델링하고, filled, help, noinput, nomatch 같은 이벤트 훅으로 상태 전이를 명시적으로 기술해 동작을 예측 가능하게 만든다.
음성·DTMF 하이브리드 입력은 ASR와 DTMF를 동시에 지원하는 구조다. 바지인(barge-in) 설정으로 사용자 경험을 높이고, SRGS 인라인·외부 참조를 지원해 도메인 용어 사전과 우선순위(semantic tag)를 적용할 수 있다.
프롬프트·합성 제어와 멀티모달 확장성은 SSML로 발화 속도·억양·발음 사전을 제어하고 TTS와 사전 녹음 프롬프트를 혼합 운용한다. 오디오 캐시·스트리밍을 지원해 네트워크 지연을 줄이는 preload 전략도 쓸 수 있다.
견고한 오류·예외 처리 메커니즘은 noinput/nomatch 재시도 정책과 글로벌 error 핸들러를 제공해 회복 가능한 실패와 회복 불가능한 실패를 나눠 처리한다. 타임아웃, ASR 거부, 리소스 오류에는 폴백 시나리오를 정의해 에이전트 전환이나 DTMF 폴백으로 이어간다.
운영·분석을 위한 로깅과 동적 문서는 HTTP 파라미터, 세션 변수, 플랫폼 변수를 로깅해 콜 아이디 기반 상관관계 분석을 가능하게 한다. 애플리케이션 서버가 VXML을 동적으로 생성하면 라우팅·개인화·A/B 테스트도 적용할 수 있다.
아키텍처 구성
텔레포니 게이트웨이/CCXML이 호 수립·라우팅·세션 생성을 맡고, 음성 브라우저(VXML Interpreter)가 VXML 문서를 로딩해 프롬프트·입력·이벤트를 실행한다. ASR/TTS(MRCP)는 음성 인식·합성 자원을 제공하며 사전·언어 모델을 관리하고, 애플리케이션 서버는 동적 VXML을 제공하며 비즈니스 로직과 고객 데이터 연동을 담당한다.
구현 절차
설계 단계에서는 사용자 시나리오와 대화 상태 다이어그램, 재시도·타임아웃 정책을 정의하고 SRGS/DTMF 키맵과 SSML 스타일 가이드를 세운다. 개발·통합 단계에서는 VXML 2.1 문서를 개발하고 외부 그라마 파일을 분리하며 글로벌 에러 핸들러를 구성하고, MRCP로 ASR/TTS를 연동해 사전·언어 모델을 튜닝한다. 시험·운영 단계에서는 대화 유닛 테스트와 콜 에뮬레이션으로 로깅·메트릭을 검증하고, 부하 테스트와 오디오 캐싱 검증, 실패 시 폴백 라우팅을 점검한다.
VXML 예시: 잔액조회·결제 라우팅 IVR
표준은 W3C VoiceXML 2.1, SRGS 1.0, SSML 1.0이고, Cisco CVP·Avaya Experience Portal·Genesys Voice Platform 같은 VXML 호환 음성 브라우저와 MRCPv2 엔진(Nuance, Google MRCP 게이트웨이 등), 한국어 언어팩 설치를 전제로 한다.
<?xml version="1.0" encoding="UTF-8"?>
<vxml version="2.1" xml:lang="ko-KR">
<var name="retry" expr="0"/>
<catch event="error">
<prompt>시스템 오류 발생. 상담원으로 연결 진행.</prompt>
<transfer dest="sip:agent@contact-center.example.com" bridge="true"/>
</catch>
<form id="main">
<block>
<prompt bargein="true">
<audio src="http://media.example.com/welcome_ko.wav"/>
또는 <say-as interpret-as="characters">SSML</say-as> 안내 사용 가능.
</prompt>
</block>
<field name="intent">
<grammar mode="voice" xml:lang="ko-KR" version="1.0" root="root" tag-format="semantics/1.0" type="application/srgs+xml">
<rule id="root" scope="public">
<one-of>
<item> 잔액 <tag>out='balance';</tag> </item>
<item> 결제 <tag>out='payment';</tag> </item>
<item> 상담원 <tag>out='agent';</tag> </item>
</one-of>
</rule>
</grammar>
<grammar mode="dtmf" type="application/grammar+voicexml">
1=balance | 2=payment | 0=agent
</grammar>
<prompt timeout="6s">원하시는 업무 말씀 또는 번호 입력. 1번 잔액, 2번 결제, 0번 상담원 연결.</prompt>
<noinput>
<assign name="retry" expr="retry+1"/>
<prompt>입력이 감지되지 않음. 다시 말씀 또는 번호 입력.</prompt>
<reprompt/>
</noinput>
<nomatch>
<assign name="retry" expr="retry+1"/>
<prompt>인식 결과가 확실하지 않음. 다시 말씀 또는 번호 입력.</prompt>
<reprompt/>
</nomatch>
<filled>
<if cond="intent == 'balance'">
<goto next="#balance"/>
<elseif cond="intent == 'payment'"/>
<goto next="#payment"/>
<elseif cond="intent == 'agent'"/>
<transfer dest="sip:agent@contact-center.example.com" bridge="true"/>
<else/>
<prompt>처리 불가 요청. 상담원 연결 진행.</prompt>
<transfer dest="sip:agent@contact-center.example.com" bridge="true"/>
</if>
</filled>
</field>
<block cond="retry >= 2">
<prompt>여러 차례 시도 실패. 상담원 연결 진행.</prompt>
<transfer dest="sip:agent@contact-center.example.com" bridge="true"/>
</block>
</form>
<form id="balance">
<block>
<prompt>보유 잔액은 35만 2천 원. 추가 안내 필요 시 상담원 연결 가능.</prompt>
<disconnect/>
</block>
</form>
<form id="payment">
<block>
<prompt>카드 결제를 진행하려면 1번, 종료하려면 별표 키 입력.</prompt>
<disconnect/>
</block>
</form>
</vxml>
실제로 쓰이는 곳
컨택센터 셀프서비스에서는 조회·변경 업무를 자동화해 잔액·청구·배송·예약 확인을 처리한다. 간단한 업무는 완결률이 높고 대기 시간도 줄어든다.
금융·공공 본인확인 및 안내에서는 낭독 고지, 약관 동의, OTP·ARS 인증을 구성하고 고지 이력을 추적해 재고지를 자동화한다.
장애·이벤트 공지에서는 대규모 콜 폭주 시 사전 안내와 콜 스티어링을 구성하고, 웹·앱·카카오톡 같은 채널 분산을 유도하는 메시지를 제공한다.
이런 도입은 수치로도 드러난다. 상담원 처리 건수를 1030% 대체하고 콜당 비용을 2040% 절감할 수 있으며, 평균 대기 시간은 15~35% 단축되고 응답 지연은 300ms 이하로 유지할 수 있다. 이벤트성 폭주 트래픽에는 자동 확장과 캐시 전략으로 대응한다.
모범사례와 트레이드오프
설계에서는 바지인을 활성화하고 짧은 문장과 선명한 프롬프트를 쓰며 재시도는 2회 이내로 정책을 구성한다. 성능 면에서는 오디오를 사전 캐싱하고 HTTP 타임아웃을 짧게 잡으며 ASR 음향·언어 모델을 튜닝한다. 보안에서는 통화 녹취·로그의 민감정보를 마스킹하고 MRCP/SIP-TLS를 적용하며 키 관리와 데이터 보존 정책을 준수한다.
트레이드오프는 두 축에서 나타난다. 규칙 기반의 일관성과 유연성 사이에서, VXML+SRGS 기반은 결정론적 동작이라는 장점이 있지만 자유 발화 처리에는 한계가 있다. 개발 속도와 유지보수 사이에서는, 명시적 상태 모델이 디버깅을 쉽게 하지만 시나리오가 늘어나면 문서 분할·재사용 설계가 필요해진다.
VXML 기반 IVR vs NLP 기반 음성봇
| 구분 | 성능(지연) | 확장성 | 일관성 | 안정성 | 운영 편의 |
|---|---|---|---|---|---|
| VXML 기반 IVR | 낮은 지연, 예측 가능 응답 | 세션 수평 확장 용이 | 높은 결정론적 일관성 | 성숙한 플랫폼 안정성 | 오디오/그라마 자산 관리 필요 |
| NLP 기반 음성봇 | 의도 해석 비용으로 지연 증가 가능 | 모델/서빙 인프라 확장 필요 | 발화 다양성에 따른 변동성 | 모델/데이터 품질 의존도 큼 | 발화 로그/학습 파이프라인 요구 |
규칙 기반의 결정론적 흐름에서는 높은 완결률을 달성할 수 있고, 복잡한 자유 발화는 NLP와의 하이브리드 구성이 적합하다.