logo
홈블로그소개
4,687

Built with Next.js, Bun, Tailwind CSS and Shadcn/UI

·개인정보처리방침
AIPythonTypescript

Voxtral 3: 음성 에이전트의 발화 종료와 도구 실행을 안전하게 연결하기

Toma
2026년 10월 21일
약 11분
목차
🎙️ Voxtral 3: 음성 에이전트의 발화 종료와 도구 실행을 안전하게 연결하기
🧩 무엇이 새로워졌나: 모델 하나가 아니라 역할별 파이프라인
🔀 먼저 녹음 처리와 대화를 구분하기
⚙️ 한 번의 요청은 어떻게 처리되나
⏳ 전사 지연과 전체 응답 시간은 다르다
🛑 가장 중요한 경계: 잠깐 쉰 것과 말을 끝낸 것
🚦 이벤트별로 허용할 일을 나누기
🧵 turn.end가 와도 마지막 단어가 남아 있을 수 있다
🛠️ 실무 적용: 사내 서비스 데스크를 만든다면
🌐 브라우저와 전화는 같은 도구 구성이 아니다
🔎 확인된 사례: 예약 시나리오는 공식 데모다
⚠️ 도입 전에 확인할 제약
🧑‍🤝‍🧑 화자 분리와 turn detection은 동시 설정할 수 없다
🔄 Voxtral 2에서 모델 이름만 바꾸면 끝나지 않는다
🧪 문서 확인과 실행 검증을 구분하기
✅ 정리
Sources
이전 포스트DeepSeek Search·Fetch API: 에이전트의 검색과 근거 읽기를 분리하는 방법

목차

🎙️ Voxtral 3: 음성 에이전트의 발화 종료와 도구 실행을 안전하게 연결하기
🧩 무엇이 새로워졌나: 모델 하나가 아니라 역할별 파이프라인
🔀 먼저 녹음 처리와 대화를 구분하기
⚙️ 한 번의 요청은 어떻게 처리되나
⏳ 전사 지연과 전체 응답 시간은 다르다
🛑 가장 중요한 경계: 잠깐 쉰 것과 말을 끝낸 것
🚦 이벤트별로 허용할 일을 나누기
🧵 turn.end가 와도 마지막 단어가 남아 있을 수 있다
🛠️ 실무 적용: 사내 서비스 데스크를 만든다면
🌐 브라우저와 전화는 같은 도구 구성이 아니다
🔎 확인된 사례: 예약 시나리오는 공식 데모다
⚠️ 도입 전에 확인할 제약
🧑‍🤝‍🧑 화자 분리와 turn detection은 동시 설정할 수 없다
🔄 Voxtral 2에서 모델 이름만 바꾸면 끝나지 않는다
🧪 문서 확인과 실행 검증을 구분하기
✅ 정리
Sources

🎙️ Voxtral 3: 음성 에이전트의 발화 종료와 도구 실행을 안전하게 연결하기

음성으로 답하는 챗봇과 업무를 처리하는 음성 에이전트는 다릅니다. Voxtral 3는 speech-to-text·text-to-speech 모델군과 Voice Agents SDK를 함께 제공하며, 듣기·추론·도구 호출·말하기를 하나의 실시간 파이프라인으로 연결합니다.[1]

이 글은 웹 서비스와 사내 업무 도구에 음성 인터페이스를 붙이려는 개발자를 위한 개념·설계 가이드입니다. 모델 카드의 표시일은 2026-10-20이며, 아래 내용은 2026-10-21에 확인한 Voxtral 3 문서를 기준으로 합니다.[2]

💡 💡 핵심은 더 빨리 말하는 것이 아니라, 사용자의 말이 끝났는지 판단하고 완성된 요청에만 변경 작업을 연결하는 것입니다. 공식 문서는 turn.eager_end에서 되돌릴 수 있는 준비만 하고, 변경 작업은 turn.end를 기다리라고 안내합니다.[5]

🧩 무엇이 새로워졌나: 모델 하나가 아니라 역할별 파이프라인

Voxtral 3의 음성 에이전트는 모든 일을 하나의 음성 모델에 맡기는 구조가 아닙니다. 공식 발표는 실시간 전사 모델이 듣기와 발화 종료 감지를, Mistral Small 같은 범용 LLM이 추론과 도구 호출을, 음성 합성 모델이 응답 발화를 담당한다고 설명합니다.[1]

SDK는 LiveKit 기반의 실시간 오디오 전송과 Python·TypeScript 바인딩을 제공합니다.[4] 애플리케이션 개발자는 에이전트가 알아야 할 정보, 호출 가능한 도구, 대화 종료 후 처리를 구성합니다.[4]

🔀 먼저 녹음 처리와 대화를 구분하기

  • 이미 끝난 회의·통화의 전사: 녹음 파일을 보내는 offline 모드가 출발점입니다.[3]
  • 말하는 중 자막 표시: realtime transcription으로 오디오를 보내고 텍스트 이벤트를 받습니다.[3]
  • 말을 듣고 답하거나 업무 실행: realtime 전사·LLM·음성 출력을 연결하는 voice agent를 사용합니다.[3]

설계 의견: 회의록 생성이 목적이라면 처음부터 양방향 음성 에이전트를 만들 필요는 없습니다. 녹음 파일 전사와 기존 요약 워크플로우를 연결하는 편이 더 단순합니다.

⚙️ 한 번의 요청은 어떻게 처리되나

SDK 문서의 기본 경로에서는 애플리케이션이 오디오를 수집·재생하고, 모델은 Mistral에서 실행됩니다.[4] 역할을 나누면 다음과 같습니다.[4]

  1. 입력·전사: 마이크나 통화의 음성을 텍스트로 바꾸고 사용자의 발화 종료를 감지합니다.[4]
  2. 추론·도구 호출: LLM이 대화를 읽고, 필요한 조회나 동작을 도구로 요청합니다.[4]
  3. 응답·재생: 음성 합성 단계가 답변을 읽고 애플리케이션이 재생합니다.[4]

서버 측 도구는 Mistral 측에서, 클라이언트 측 도구는 개발자의 애플리케이션 함수로 실행된다는 구분도 있습니다.[4]

💡 ⚠️ 클라이언트에서 실행한다는 말은 모델까지 로컬에서 돈다는 뜻이 아닙니다. 기본 SDK 경로의 모델 실행 위치와 자체 인프라 배포는 구분해야 합니다.[4] 공식 발표는 전체 스택의 on-premises·private cloud 배포를 별도 문의 경로로 안내합니다.[1]

⏳ 전사 지연과 전체 응답 시간은 다르다

Realtime 3 모델 카드는 설정 가능한 전사 latency를 80~2,400ms로 설명합니다.[2] 이는 전사 단계의 설정 범위이지, LLM 추론과 도구 실행, 음성 재생까지 끝나는 시간의 보장은 아닙니다. SDK 문서도 각 단계가 사용자 대기 시간에 더해진다고 설명합니다.[4]

공식 발표의 “각 turn이 1초 미만”이라는 설명은 제공자 측 제품 주장으로 읽어야 합니다.[1] 이 글에서는 API 호출이나 지연 측정을 하지 않았으므로 실제 서비스의 응답 시간으로 인용하지 않습니다.

🛑 가장 중요한 경계: 잠깐 쉰 것과 말을 끝낸 것

Turn detection은 단순히 텍스트가 도착했는지가 아니라, 사용자가 발화를 시작하고 끝냈는지를 애플리케이션에 알려주는 기능입니다.[5] 문서는 의미상 발화가 진행 중일 확률을 모델이 추정하고, 서버가 임계값과 비교해 상태를 바꾼다고 설명합니다.[5]

🚦 이벤트별로 허용할 일을 나누기

  • turn.start: 사용자가 말하기 시작한 상태입니다.[5]
  • turn.eager_end: 발화를 끝냈을 가능성이 있어 응답 준비처럼 버릴 수 있는 작업을 시작할 수 있습니다.[5]
  • turn.resume: 사용자가 말을 이어가므로 앞선 eager end를 취소하고 준비 작업을 폐기합니다.[5]
  • turn.end: 발화가 종료된 상태이며, 요청을 처리하는 기준 이벤트입니다.[5]

공식 문서는 메시지 전송이나 데이터 변경 도구처럼 되돌릴 수 없는 작업을 turn.eager_end에 연결하지 말라고 경고합니다.[5]

🧵 turn.end가 와도 마지막 단어가 남아 있을 수 있다

더 주의할 점은 발화 종료 이벤트와 전사 텍스트의 완성 시점이 다르다는 사실입니다. turn.end 이후에도 마지막 단어가 transcription.text.delta 이벤트로 도착할 수 있습니다.[5]

직접 WebSocket 파이프라인을 구현한다면 문서의 처리 순서를 따라야 합니다.[5]

  1. turn.end 이후에도 현재 turn의 텍스트 delta를 계속 모읍니다.[5]
  2. 이벤트 이후 설정된 streaming delay가 지났거나 다음 turn.start가 오면 해당 turn의 텍스트를 닫습니다.[5]
  3. 완성된 텍스트로 요청을 처리하고, 미리 준비한 응답이 있다면 뒤늦게 도착한 단어가 의도를 바꾸지 않았는지 확인합니다.[5]

💡 💡 발화 종료 감지 → 텍스트 완성 확인 → 업무 승인 확인을 서로 다른 단계로 두는 것이 이 글의 설계 제안입니다. 발화 종료는 사용자의 권한이나 업무 변경 승인을 대신하지 않습니다.

🛠️ 실무 적용: 사내 서비스 데스크를 만든다면

다음은 실제 고객 사례가 아니라 설계 제안입니다. 사용자가 “출장 신청을 취소해 줘… 아니, 지난주 것은 두고 다음 주 것만”이라고 말하는 상황을 가정합니다.

  • 발화 도중에는 입력 내용을 보여주고, eager end에서는 조회나 응답 초안처럼 폐기 가능한 작업만 준비합니다.
  • 발화와 텍스트가 모두 완성되면 취소 대상의 날짜·신청 ID를 정리합니다.
  • 서버가 로그인 사용자와 대상 신청의 소유권을 검증한 뒤 취소 내용을 다시 확인받습니다.
  • 확인된 대상에만 변경 API를 호출하고, API 성공 여부를 확인한 다음 완료를 말합니다.

이 제안은 공식 문서가 구분하는 eager end·resume·end와 마지막 텍스트 도착 순서를 업무 처리 경계에 적용한 것입니다.[5] 중복 요청 방지, 권한 검사, 감사 로그는 모델의 발화 판단과 별도로 설계하는 것을 권합니다.

🌐 브라우저와 전화는 같은 도구 구성이 아니다

웹 앱에서는 서버가 세션을 생성해 API key가 브라우저에 도달하지 않도록 하고, 브라우저는 반환된 연결 자격정보로 접속하는 구조를 문서가 안내합니다.[4]

전화 경로에는 다른 제약이 있습니다. 출시 시 SIP telephony는 enterprise 고객 대상이며, 전화 세션에서는 client-side tool이 실패하므로 필요한 작업을 server-side tool로 제공해야 합니다.[4]

도입 의견: 처음에는 웹에서 읽기 전용 조회 하나를 검증하고, 쓰기 도구와 전화 연동은 별도 단계로 확장하는 편이 안전합니다. 녹음·보관 정책과 음성 데이터 처리 위치도 기능 시연과 분리해 검토해야 합니다.

🔎 확인된 사례: 예약 시나리오는 공식 데모다

공식 발표 페이지에는 사용자가 프랑스어 진료 의뢰서를 바탕으로 예약을 요청하는 데모가 있습니다.[1] 사용자는 참조번호를 말하다가 수정하고, 에이전트는 get_referral로 내용을 확인한 뒤 예약 가능한 시간을 설명하고 예약 여부를 묻습니다.[1]

이후 페이지에는 사용자의 동의, book_appointment 호출과 confirmed 결과가 제시됩니다.[1] 이는 발표 페이지에 표시된 공식 데모 흐름을 확인한 것이며, 실제 병원 도입 사례나 운영 성공률을 확인한 것은 아닙니다.

해석: 이 데모에서 실무적으로 볼 부분은 유창한 발화뿐 아니라, 정정된 식별자를 사용하고 변경 전에 사용자에게 확인하는 업무 흐름입니다. 다만 데모 하나로 오류 복구나 권한 검증의 완성도를 판단할 수는 없습니다.

⚠️ 도입 전에 확인할 제약

🧑‍🤝‍🧑 화자 분리와 turn detection은 동시 설정할 수 없다

Voxtral 3 문서는 realtime diarization과 turn detection을 각각 지원하지만, 같은 realtime session에서 두 기능을 함께 설정하면 오류가 발생한다고 명시합니다.[3][5]

설계 의견: 누가 말했는지 구분하는 회의 분석과 언제 응답할지 판단하는 대화형 에이전트를 하나의 설정으로 묶지 마세요. 두 요구가 모두 필요하면 별도 처리 경로의 비용과 동기화 문제부터 검토하는 편이 낫습니다.

🔄 Voxtral 2에서 모델 이름만 바꾸면 끝나지 않는다

  • Voxtral 3 전사는 word timestamp를 제공하지 않습니다. migration 문서는 timestamp_granularities에 word를 요청하면 400 오류가 나므로 segment 단위를 사용하라고 안내합니다.[6]
  • realtime session 설정은 첫 audio chunk 이전에 보내야 하며, 오디오 전송이 시작된 뒤에는 설정 변경이 거부됩니다.[5][6]
  • 전사와 audio-in-chat은 다른 경로입니다. 확인한 STT 문서는 녹음에 관한 요약·번역 질문용 audio-in-chat에 출시 시 voxtral-small-latest인 Voxtral 2를 사용하라고 안내합니다.[3]

따라서 “Voxtral 3 출시”를 기존 오디오 API 전체가 같은 기능과 동작으로 교체됐다는 뜻으로 받아들이면 안 됩니다.

🧪 문서 확인과 실행 검증을 구분하기

Realtime 3 모델 카드는 확인 시점에 Public Preview로 표시되어 있습니다.[2] 또한 migration 문서는 일부 TTS style instructions를 출시 시 제공하지 않는 기능으로 표시합니다.[6] 발표에 소개된 기능은 사용할 API와 출시 단계의 기술 문서에서 다시 확인해야 합니다.

💡 🔍 검증 범위: Mistral 공식 발표·모델 카드·기술 문서 6개를 읽고 대조했습니다. 모두 같은 제공자 자료이므로 독립적인 성능 검증은 아닙니다. SDK 설치, 모델 호출, 오디오 청취 평가, benchmark 재현은 수행하지 않았습니다.

✅ 정리

Voxtral 3를 도입할 때 먼저 결정할 것은 전사만 필요한지, 실제 대화와 업무 실행까지 필요한지입니다.[3] 대화형 경로를 선택했다면 eager end와 최종 end를 구분하고, 종료 이벤트 뒤에 오는 마지막 텍스트까지 처리해야 합니다.[5]

이 글의 권장 순서: 읽기 전용 기능으로 시작하고, 완성된 요청·사용자 확인·서버 권한 검증이 갖춰진 뒤 쓰기 작업을 연결하세요. 모델이 말을 빨리 끝내는 것보다 시스템이 잘못된 요청을 실행하지 않는 것이 우선입니다.

Sources

[1] https://mistral.ai/news/voxtral-3 — Voxtral 3: Voice Agent SDK & Speech Models in 50+ Languages

[2] https://docs.mistral.ai/models/voxtral-mini-transcribe-realtime-3-0 — Voxtral Mini Transcribe Realtime 3 — Mistral Docs

[3] https://docs.mistral.ai/studio/audio/speech-to-text/overview — Speech to Text — Mistral Docs

[4] https://docs.mistral.ai/studio/audio/voice-agents/overview — Voice agents — Mistral Docs

[5] https://docs.mistral.ai/studio/audio/speech-to-text/turn-detection — Turn detection — Mistral Docs

[6] https://docs.mistral.ai/studio/audio/migrate-from-voxtral-2 — Migrate from Voxtral 2 — Mistral Docs