LabHub

한국어

시작하기
블로그

블로그

실시간 음성 대화, 부품별로 직접 잰 지연: 음성인식 0.2초, LLM 첫 토큰 0.07초, 음성합성은 길이의 절반

상태: 초안 (2026-10-06), 실측 글입니다. 아래 숫자는 필자가 직접 잰 값입니다. 한 턴의 첫 소리까지의 시간은 부품별 실측에서 계산한 추정이며 처음부터 끝까지 이어서 재지는 않았습니다. 대부분의 측정은 합성 음성과 한 가지 대화 프롬프트로 했으므로 실제 사용자 환경과 다를 수 있습니다. 4-3절은 사람이 읽은 음성(공개 음성 말뭉치)으로 음성인식을 다시 잰 값이고, 비원어민 영어도 포함합니다. 작성 규칙: 실측 데이터가 기본이고, 못 잰 것은 「미실측」으로 표시합니다.

1. 무엇을 왜 쟀는가

19편에서 오픈소스 후보를 조사했지만 값은 모두 문서 기준이었습니다. 외국어 말하기 연습에 「말로 주고받는」 기능을 넣으려면 다음 세 부품의 지연을 직접 알아야 합니다.

  1. 음성인식(ASR): 학습자의 말을 글자로 바꿉니다.
  2. 대화 LLM: 받아 적은 말에 답을 만듭니다.
  3. 음성합성(TTS): 답을 소리로 읽습니다.

세 부품을 모두 한국어, 일본어, 중국어, 영어로 쟀고, 오픈 모델 두 쌍(Qwen3-ASR 과 Nemotron 3.5 ASR, VoxCPM2 와 Magpie TTS)을 같은 입력으로 비교했습니다.

2. 환경과 방법

항목 값
서버 GPU 서버 두 대. 24GB급 소비자용 GPU(드라이버 570 계열)와 8GB급 노트북 GPU(드라이버 595 계열)
음성합성 VoxCPM2(24GB급 GPU), Magpie TTS Multilingual 357M(8GB급 GPU)
음성인식 Qwen3-ASR-1.7B 와 단어 시각 정렬기(24GB급 GPU), Nemotron 3.5 ASR Streaming 0.6B(8GB급 GPU)
대화 LLM Gemma 4 12B 구글 공식 QAT 4비트(GGUF 7.0GB), llama.cpp 서버(--parallel 2, 문맥 4096), 생각 모드 끔(24GB급 GPU)
방법 서버를 임시 컨테이너에 띄우고 문장 3종(짧음, 중간, 김) × 4개 언어를 3회씩(LLM 은 5회) 요청해 중앙값을 냄
안전장치 컨테이너 메모리 한도, 호스트 가용 메모리가 기준 아래로 내려가면 측정 중단

두 모델 쌍을 서로 다른 GPU 에서 쟀기 때문에 속도의 직접 비교는 신중해야 합니다(메모리 사용량과 정확도는 GPU 와 무관하게 비교할 수 있습니다). 음성합성은 서버가 알려 주는 합성 시간과 오디오 길이로 실시간 계수(합성 시간 ÷ 오디오 길이) 를 계산했고, 1 보다 작으면 재생보다 빨리 만든다는 뜻입니다.

3. 음성합성(TTS) 결과

3-1. VoxCPM2

따뜻한 상태(모델이 실려 있고 목소리가 이미 설계된 상태)에서 3회 중앙값입니다.

언어 글자 수 오디오(초) 합성 시간(초) 실시간 계수
영어 39 / 80 / 179 2.08 / 4.00 / 9.60 1.21 / 2.11 / 4.77 0.572 / 0.526 / 0.496
일본어 17 / 36 / 67 3.04 / 5.28 / 9.12 1.69 / 2.78 / 4.56 0.556 / 0.519 / 0.500
중국어 18 / 23 / 54 3.84 / 4.96 / 10.72 2.05 / 2.59 / 5.31 0.531 / 0.522 / 0.496
한국어 20 / 38 / 67 3.84 / 6.88 / 12.64 2.06 / 3.50 / 6.25 0.536 / 0.509 / 0.494

3-2. Magpie TTS Multilingual 357M

같은 문장으로 쟀습니다(8GB급 노트북 GPU, 3회 중앙값).

언어 합성 시간(초) 오디오(초) 실시간 계수 음성인식 되받기 글자 오류율
영어 1.23 / 2.10 / 4.59 2.69 / 4.55 / 9.33 0.458 / 0.462 / 0.495 0% / 0% / 0%
일본어 1.41 / 2.71 / 4.80 3.11 / 5.76 / 9.66 0.448 / 0.471 / 0.496 13% / 12% / 0%(표기 차이)
중국어 1.87 / 2.29 / 5.09 3.85 / 4.92 / 10.26 0.452 / 0.465 / 0.499 0% / 10% / 6%
한국어 0.27 / 0.37 / 0.99 0.51 / 0.65 / 2.18(비정상) 0.455~0.588 100%(결과 없음)

4. 음성인식(ASR) 결과

앞의 합성이 만든 12개 음성(2~13초)을 언어를 지정해 받아 적게 했습니다.

4-1. Qwen3-ASR-1.7B

언어 오디오(초) 추론 시간(초) 실시간 계수 글자 오류율
영어 2.1 / 3.8 / 9.6 0.16 / 0.26 / 0.52 0.054~0.077 0% / 0% / 0%
일본어 3.0 / 5.3 / 8.6 0.15 / 0.31 / 0.51 0.049~0.059 0% / 15% / 0%
중국어 3.8 / 4.8 / 10.7 0.16 / 0.25 / 0.49 0.042~0.052 0% / 0% / 0%
한국어 4.2 / 7.4 / 12.6 0.22 / 0.42 / 0.62 0.049~0.057 0% / 0% / 0%

4-2. Nemotron 3.5 ASR Streaming 0.6B

같은 12개 음성(8GB급 노트북 GPU, 언어를 로케일로 지정, 파일 전체를 한 번에 받아 적는 방식)입니다.

항목 값
추론 시간 파일당 0.23~0.30초(실시간 계수 0.023~0.112, 중앙값 0.050)
평균 글자 오류율 3.9% (Qwen3-ASR 은 일본어 표기 차이를 빼면 0%)
자동 감지 12개 모두 맞음(결과에 <ko-KR> 같은 언어 표지가 붙음)
GPU 메모리 모델 적재 후 약 5,078MiB(모델 외에 실행 환경 몫이 포함된 값)
적재 시간 가중치가 내려받아진 뒤 약 31초

4-3. 사람 음성으로 다시 잰 값: 원어민 읽기와 비원어민 영어

위 12개는 합성 음성이라 사람의 발음과 억양이 들어 있지 않습니다. 공개 음성 말뭉치로 Nemotron 3.5 ASR 을 다시 재었습니다. FLEURS(사람이 읽은 문장)에서 언어마다 30문장, speechocean762(중국어 화자가 읽은 영어에 발음 평가 점수가 붙은 말뭉치)에서 100문장이고, 파일 전체를 한 번에 받아 적는 방식, 기본 청크 1,120ms, 8GB급 노트북 GPU 입니다.

데이터 지표 평균 중앙값 빈 결과 중앙 추론 시간
FLEURS 한국어 글자 오류율 5.8% 3.6% 0 0.296초
FLEURS 일본어 글자 오류율 14.7% 14.7% 0 0.296초
FLEURS 중국어 글자 오류율 18.2% 14.6% 0 0.305초
FLEURS 영어 단어 오류율 10.0% 5.7% 0 0.291초
speechocean762 비원어민 영어 단어 오류율 38.8% 25.0% 12/100 0.248초

비원어민 영어를 발음 평가 총점(0~10)으로 나누면 오류율이 크게 갈렸습니다.

총점 구간 문장 수 단어 오류율(평균) 중앙값
6 미만 15 80.4% 100.0%
6 이상 8 미만 31 54.0% 60.0%
8 이상 54 18.4% 11.8%
청크 한국어 CER 영어 WER 비원어민 영어 WER (빈 결과)
1,120ms 5.8% 10.0% 38.8% (12)
560ms 5.9% 10.5% 39.7% (7)
320ms 5.6% 12.6% 42.1% (9)
160ms 6.2% 13.3% 44.8% (10)
80ms 6.1% 13.5% 44.7% (8)

영어와 비원어민 영어는 1,120ms 에서 80ms 로 줄이면 오류율이 3~6%p 늘었습니다. 한국어는 5.6~6.2% 로 차이가 거의 없었고, 모델 카드의 한국어 값(7.12~7.70%)도 평평합니다. 빈 결과는 1,120ms 에서만 나오지 않았고(비원어민 영어는 오히려 1,120ms 에서 12개로 가장 많음), 위 합성 표본의 1,120ms 이상 현상은 재현되지 않았습니다.

5. 대화 LLM 결과: Gemma 4 12B 4비트

학습자 수준(CEFR A2)에 맞춰 「한두 문장으로 답하고 쉬운 질문 하나로 끝내라」는 지시와 「어제 카페에서 책을 읽었다」는 사용자 발화를 네 언어로 보내고, 언어마다 5회 스트리밍으로 받았습니다. 첫 토큰은 요청을 보낸 뒤 첫 글자가 올 때까지, 첫 문장은 첫 문장 부호가 나올 때까지(음성합성을 시작할 수 있는 시점)입니다.

언어 첫 토큰(초, 중앙값 / 범위) 첫 문장 끝(초) 답변 토큰 생성 속도(tok/s)
영어 0.074 / 0.068~0.080 0.203 21 85.7
일본어 0.074 / 0.067~0.119 0.100 23 85.6
중국어 0.067 / 0.054~0.127 0.129 13 84.2
한국어 0.076 / 0.074~0.129 0.160 27 85.6

생각 모드가 응답을 통째로 비웠습니다. 처음 측정에서 20회 모두 답이 비어 있었습니다. 원응답을 보니 content 는 빈 문자열이고 reasoning_content 에 Role: Friendly conversation partner for a Japanese learner... Constraint 1: ... 같은 영어 분석이 쌓이다가, 80토큰 예산이 생각만으로 끝난 것이었습니다. 이 모델이 llama.cpp 의 대화 템플릿에서 기본으로 생각부터 하기 때문이며, 서버 옵션(--reasoning-budget 0)과 요청 옵션(chat_template_kwargs: {enable_thinking: false})으로 끄자 정상이 되었습니다. 음성 대화에서는 생각 모드를 반드시 꺼야 합니다. 켜 두면 첫 소리가 몇 초씩 늦어지고, 예산이 짧으면 답이 아예 나오지 않습니다.

6. 측정에서 발견한 문제

6-1. 일본어: 소리는 맞는데 표기가 달라 점수가 깎인다

일본어 중간 문장에서 오류율 15% 가 나왔는데, 소리를 틀린 것이 아니었습니다.

문장
원문 私はたいてい七時に起きて**、簡単な朝ご飯を食べて、**地下鉄で会社に行きます。
인식 私は大抵7時に起きて簡単な朝ご飯を食べて地下鉄で会社に行きます。

たいてい 대 大抵, 七 대 7, 쉼표 유무는 같은 말의 다른 표기입니다. 발음 연습 서비스가 인식 결과를 목표 문장과 문자 유사도로 견주면, 학습자가 완벽하게 말해도 이런 표기 차이로 점수가 깎일 수 있습니다. 중국어의 숫자(七 대 7)도 같은 문제가 예상됩니다. 고치는 방법은 비교 전에 숫자와 표기를 정규화하거나, 글자가 아니라 발음(읽기) 기준으로 비교하는 것입니다.

6-2. 배포된 서버가 최신 코드보다 낡을 수 있다

한 환경에서 중국어 합성이 404 Not Found 로 실패했습니다. 서버 코드의 중국어 목소리 프리셋이 새 코드에는 있지만 배포된 이미지에는 없었기 때문입니다. 새 기능이 동작하지 않을 때는 코드가 아니라 배포된 이미지의 버전을 먼저 확인해야 합니다.

6-3. GPU 서버마다 드라이버 버전이 다르면 이미지가 안 뜬다

CUDA 13 용으로 빌드된 vLLM 이미지가 드라이버 570 계열(CUDA 12.8 까지)에서 Error 804: forward compatibility was attempted on non supported HW 로 기동하지 못했습니다. 같은 이미지가 드라이버 595 계열에서는 돌아갑니다. CUDA 13.x 는 드라이버 580 이상을 요구합니다. 여러 서버를 함께 쓸 때는 드라이버 버전을 서버마다 확인하고 이미지의 CUDA 버전과 맞추어야 합니다. 이 글의 LLM 측정은 CUDA 12 용 이미지(llama.cpp)로 구성했습니다.

6-4. 측정 도구에서 부딪힌 함정

증상 원인 해결
측정 스크립트가 실행되지 않고 서버만 떠 있음 kubectl run --overrides 가 명령줄의 --command 를 덮어씀 서버는 기본 명령에 맡기고 측정 코드는 kubectl exec 로 실행
합성 시간이 nan 응답 헤더 이름이 소문자인데 대소문자를 구분해 읽음 헤더 키를 소문자로 정규화
컨테이너가 OOMKilled 모델을 적재하는 순간의 최대 메모리가 한도보다 큼 한도를 올림. 한도가 컨테이너 안에서만 작동해 서버는 영향 없음
컨테이너가 Pending 노드의 메모리 요청 합이 이미 높아 요청 6Gi 인 컨테이너 둘이 함께 못 뜸 측정을 순서대로 실행
kubectl run -i 가 1분 만에 포기 이미지를 받는 시간이 기본 대기(1분)를 넘음 --pod-running-timeout 을 늘림
LLM 응답이 전부 비어 있음 생각 모드가 기본으로 켜져 80토큰을 생각에 다 씀 서버와 요청 양쪽에서 생각을 끔
되받기 오류율이 1 보다 큼 22,050Hz 를 16,000Hz 로 바꾸는 비율을 잘못 써서(8,000Hz) 음성이 2배속이 됨 비율을 320/441 로 수정. 도구가 아니라 시험 코드의 버그였음
라이브러리가 언어를 받지 못함(Unknown prompt key: 'None') 파일 경로로 부르면 임시 입력 목록에 언어 필드가 없는 버전 문제 임시 목록에 언어를 써 넣는 우회 코드를 덧씌움(임시 방편)

여기서 가장 큰 교훈은 되받기 오류율의 사례입니다. 측정 코드의 버그가 모델의 결함처럼 보일 수 있습니다. 오류율이 1 을 넘는 값이 나오면 모델이 아니라 입력(표본 추출 비율, 길이, 언어 지정)을 먼저 의심해야 합니다.

7. 한 턴의 지연은 얼마인가

사용자가 말을 마친 시점부터 첫 소리가 나기까지는 이런 합입니다.

(말 끝 판단) + ASR + LLM 첫 문장 + TTS 첫 문장 + 전송

부품별 실측을 문장 길이로 이어 붙인 계산한 추정입니다(처음부터 끝까지 이어서 재지는 않았습니다). LLM 의 첫 문장은 위 측정에서 실제로 나온 문장이고, TTS 시간은 3-1 의 식(합성 ≈ 0.475 × 오디오 길이 + 0.23초)에 그 문장의 읽는 길이를 넣었습니다.

언어 ASR(3~7초 발화) LLM 첫 문장 끝 첫 문장 예 TTS(계산) 합계
일본어 0.15~0.3 0.10 いいですね!(약 1.1초 분량) 약 0.75 약 1.0~1.2초
중국어 0.16~0.25 0.13 听起来很舒服!(약 1.5초) 약 0.94 약 1.2~1.3초
한국어 0.22~0.4 0.16 와, 정말 좋았겠네요!(약 2.1초) 약 1.2 약 1.6~1.8초
영어 0.16~0.26 0.20 That sounds like a very relaxing way…!(약 3.2초) 약 1.75 약 2.1~2.2초

이 표에는 말 끝 판단(VAD)과 네트워크 전송이 들어 있지 않습니다. 말 끝을 0.3~0.5초에 판단한다고 가정하면 그만큼 더해집니다(가정값, 미실측). 공개된 값의 범위는 NVIDIA 블루프린트 권고 200~500ms, Pipecat 기본 0.2초, LiveKit 0.5초(스트리밍 턴 감지기 0.3초), OpenAI 예시 500ms 이므로 가정은 이 범위 안에 있습니다. 같은 문서의 목표 지연(발화 종료부터 응답 시작)은 600~1,500ms 이고, 대형 GPU 와 스트리밍 TTS 를 쓴 블루프린트의 서버 종단 지연은 0.86~0.93초(벤더 수치)입니다. 이 글의 한국어 합계에 말 끝 판단을 더한 약 1.9~2.3초가 더 큰 것은 이 글의 TTS 가 스트리밍이 아니기 때문으로 읽힙니다(공개 사례의 TTS 첫 소리까지는 0.07~0.37초). 학습자는 머뭇거림이 많아 짧은 판단이 말을 자를 수 있는데, 이를 다룬 연구는 열 수 있는 자료에서 찾지 못했습니다(미확인).

8. 면접에서 나올 만한 질문

확인하지 못한 것

참고 자료

확인한 버전과 날짜

2026-10-06 기준. voxcpm 2.0.3, Qwen3-ASR-1.7B, Qwen3-ForcedAligner-0.6B, Nemotron 3.5 ASR Streaming 0.6B, Magpie TTS Multilingual 357M, NeMo 3.0.0, Gemma 4 12B QAT q4_0, llama.cpp b11429.

로그인하면 좋아요를 누를 수 있습니다

댓글

아직 댓글이 없습니다.

로그인하면 댓글을 쓸 수 있습니다