TT Lab
Blog

한국어 English 日本語 中文

Get started
Blog

Blog

Real-time voice conversation, measured latency by component: ASR 0.2s, LLM first token 0.07s, TTS half the length

Status: Draft (2026-10-06), empirical measurement post. The numbers below are measured directly by the author. The time up to the first sound of a turn is an estimated calculationbased on component-wise measurements and was not measured continuously from start to finish. Most measurements were conducted using synthesized speech and a single conversational prompt, so they may differ from actual user environments. Section 4-3 provides re-measured ASR values using human-read speech (public speech corpora), including non-native English. Writing rule: Empirical data is the baseline, and unmeasured items are marked as "Unmeasured".

Table of Contents

1. What Was Measured and Why

Part 19investigated open-source candidates, but all values were based on documentation. To integrate a "verbal back-and-forth" feature into foreign language speaking practice, we need to directly measure the latency of the following three components:

  1. Automatic Speech Recognition (ASR): Converts the learner's speech into text.
  2. Conversational LLM: Generates a response to the transcribed text.
  3. Text-to-Speech (TTS): Reads the response aloud.

All three components were measured in Korean, Japanese, Chinese, and English, comparing two pairs of open models (Qwen3-ASR and Nemotron 3.5 ASR, VoxCPM2 and Magpie TTS) using the same inputs.

2. Environment and Methodology

Category Value
Server Two GPU servers. A 24GB-class consumer GPU (570-series driver) and an 8GB-class laptop GPU (595-series driver)
TTS VoxCPM2 (24GB-class GPU), Magpie TTS Multilingual 357M (8GB-class GPU)
ASR Qwen3-ASR-1.7B with a word-level timestamp aligner (24GB-class GPU), Nemotron 3.5 ASR Streaming 0.6B (8GB-class GPU)
Conversational LLM Gemma 4 12B Google Official QAT 4-bit (GGUF 7.0GB), llama.cpp server (--parallel 2, context 4096), thinking mode disabled (24GB-class GPU)
Method Spin up servers in temporary containers and request 3 sentence types (short, medium, long) × 4 languages, 3 times each (5 times for LLM), taking the median
Safeguards Abort measurements if container memory limits or available host memory drop below threshold

Because the two model pairs were measured on different GPUs , direct speed comparisons should be approached with caution (memory usage and accuracy can be compared regardless of the GPU). For TTS, the real-time factor (synthesis time ÷ audio duration) was calculated using the synthesis time and audio duration reported by the server; a value less than 1 indicates generation faster than playback.

3. Text-to-Speech (TTS) Results

3-1. VoxCPM2

Median of 3 runs in a warm state (model loaded, voice profile already configured).

Language Character Count Audio (s) Synthesis Time (s) Real-Time Factor
English 39 / 80 / 179 2.08 / 4.00 / 9.60 1.21 / 2.11 / 4.77 0.572 / 0.526 / 0.496
Japanese 17 / 36 / 67 3.04 / 5.28 / 9.12 1.69 / 2.78 / 4.56 0.556 / 0.519 / 0.500
Chinese 18 / 23 / 54 3.84 / 4.96 / 10.72 2.05 / 2.59 / 5.31 0.531 / 0.522 / 0.496
Korean 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

Tested with the same sentences (8GB-class laptop GPU, median of 3 runs).

Language Synthesis Time (s) Audio (s) Real-Time Factor ASR Transduction Character Error Rate
English 1.23 / 2.10 / 4.59 2.69 / 4.55 / 9.33 0.458 / 0.462 / 0.495 0% / 0% / 0%
Japanese 1.41 / 2.71 / 4.80 3.11 / 5.76 / 9.66 0.448 / 0.471 / 0.496 13% / 12% / 0% (Notation differences)
Chinese 1.87 / 2.29 / 5.09 3.85 / 4.92 / 10.26 0.452 / 0.465 / 0.499 0% / 10% / 6%
Korean 0.27 / 0.37 / 0.99 0.51 / 0.65 / 2.18 (Abnormal) 0.455~0.588 100% (No output)

4. Automatic Speech Recognition (ASR) Results

The 12 audio files (2 to 13 seconds) generated by the previous TTS step were transcribed with specified language targets.

4-1. Qwen3-ASR-1.7B

Language Audio (s) Inference Time (s) Real-Time Factor Character Error Rate
English 2.1 / 3.8 / 9.6 0.16 / 0.26 / 0.52 0.054~0.077 0% / 0% / 0%
Japanese 3.0 / 5.3 / 8.6 0.15 / 0.31 / 0.51 0.049~0.059 0% / 15% / 0%
Chinese 3.8 / 4.8 / 10.7 0.16 / 0.25 / 0.49 0.042~0.052 0% / 0% / 0%
Korean 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

Tested on the same 12 audio files (8GB-class laptop GPU, language specified via locale, transcribing entire files at once).

Category Value
Inference Time 0.23 to 0.30 seconds per file (real-time factor 0.023 to 0.112, median 0.050)
Average Character Error Rate 3.9% (Qwen3-ASR achieved 0% excluding Japanese notation differences)
Auto Detection All 12 correct (results tagged with language markers like <ko-KR> )
GPU Memory Approx. 5,078 MiB after model loading (includes runtime environment overhead alongside the model)
Loading Time Approx. 31 seconds after weights are downloaded

4-3. Re-measured Values with Human Speech: Native Reading and Non-Native English

The 12 items above are synthesized voices and thus do not contain human pronunciation and intonation. Nemotron 3.5 ASR was re-evaluated using public speech corpora: 30 sentences per language from FLEURS (human-read sentences) and 100 sentences from speechocean762 (a corpus of English read by Chinese speakers with pronunciation evaluation scores). The setup used full-file transcription at once, a default chunk size of 1,120ms, and an 8GB laptop GPU.

Data Metric Average Median Empty Result Median Inference Time
FLEURS Korean Character Error Rate 5.8% 3.6% 0 0.296s
FLEURS Japanese Character Error Rate 14.7% 14.7% 0 0.296s
FLEURS Chinese Character Error Rate 18.2% 14.6% 0 0.305s
FLEURS English Word Error Rate 10.0% 5.7% 0 0.291s
speechocean762 Non-Native English Word Error Rate 38.8% 25.0% 12/100 0.248s

When non-native English was broken down by total pronunciation score (0-10), the error rates varied significantly.

Total Score Range Number of Sentences Word Error Rate (Average) Median
Below 6 15 80.4% 100.0%
6 or above and below 8 31 54.0% 60.0%
8 or above 54 18.4% 11.8%
Chunk Korean CER English WER Non-Native English WER (Empty Result)
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)

For English and non-native English, reducing the chunk size from 1,120ms to 80ms increased the error rate by 3-6 percentage points. For Korean, it remained flat at 5.6-6.2% with virtually no difference, and the model card's Korean values (7.12-7.70%) are also flat. Empty results did not occur only at 1,120ms (for non-native English, they were actually most frequent at 1,120ms with 12 occurrences), and the 1,120ms-and-above phenomenon seen in the synthetic sample above was not reproduced.

5. Conversational LLM Results: Gemma 4 12B 4-bit

Tailored to the learner's level (CEFR A2), we sent the instruction "Answer in one or two sentences and end with a simple question" along with the user utterance "I read a book at a cafe yesterday" in four languages, receiving 5 streaming responses per language. Time to first tokenis measured from sending the request until the first character arrives, and first sentenceuntil the first punctuation mark appears (the point where speech synthesis can begin).

Language First Token (sec, median / range) End of First Sentence (sec) Response Tokens Generation Speed (tok/s)
English 0.074 / 0.068~0.080 0.203 21 85.7
Japanese 0.074 / 0.067~0.119 0.100 23 85.6
Chinese 0.067 / 0.054~0.127 0.129 13 84.2
Korean 0.076 / 0.074~0.129 0.160 27 85.6

The thinking mode resulted in completely empty responses. In the initial measurements, all 20 responses were empty. Looking at the raw responses, content was an empty string, and reasoning_content accumulated English analysis such as Role: Friendly conversation partner for a Japanese learner... Constraint 1: ... , meaning the 80-token budget was entirely consumed by thinking. This happens because the model defaults to thinking first in llama.cpp's chat template, and turning it off via server options (--reasoning-budget 0) and request options (chat_template_kwargs: {enable_thinking: false}) resolved the issue. Thinking mode must be disabled in voice conversations. Leaving it enabled delays the first sound by several seconds, and if the budget is short, no response is produced at all.

6. Issues Discovered During Measurement

6-1. Japanese: Correct Pronunciation But Different Orthography Results in Point Deductions

The error rate for middle Japanese sentences was 15%, but the pronunciation was not wrong.

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

たいてい vs 大抵, 七 vs 7, and the presence or absence of commas represent different spellings of the same expression. If a pronunciation practice service compares recognition results with the target sentence using character similarity, learners may lose points due to such spelling differences even if they speak perfectly. Chinese numbers (七 vs 7) is expected to have the same issue. The way to fix it is to normalize numbers and notations before comparison, or to compare based on pronunciation (reading) rather than characters.

6-2. The deployed server may be older than the latest code

Chinese synthesis in one environment failed with 404 Not Found . This was because the Chinese voice preset in the server code existed in the new code but not in the deployed image. When a new feature does not work, you must check the version of the deployed imagerather than the code first.

6-3. If GPU servers have different driver versions, images will not spin up

A vLLM image built for CUDA 13 failed to start on the driver 570 series (up to CUDA 12.8) with Error 804: forward compatibility was attempted on non supported HW . The same image runs fine on the driver 595 series. CUDA 13.x requires driver 580 or higher. When using multiple servers together, you must check the driver version on each server and match it with the CUDA version of the image . The LLM measurements in this article were configured with an image for CUDA 12 (llama.cpp).

6-4. Pitfalls encountered in the measurement tools

Symptoms Causes Resolution
The measurement script is not running and only the server is up kubectl run --overrides overwrites the --command of the command line Leave the server to the default commands and run the measurement code with kubectl exec executed
Synthesis time is nan The response header name is lowercase, but it was read in a case-sensitive manner Normalize header keys to lowercase
The maximum memory at the moment the container loads the OOMKilled model exceeds the limit Raised the limit. The limit only applies inside the container, so the server is unaffected.
The container Pending The sum of node memory requests is already high, so two containers with a 6Gi request cannot start together. Execute measurements sequentially.
kubectl run -i gives up after 1 minute. Image pull time exceeds the default timeout (1 minute). --pod-running-timeout Increased.
LLM responses are completely empty. Thinking mode is enabled by default, consuming all 80 tokens on thinking. Disabled thinking on both the server and request sides.
Word error rate is greater than 1. The resampling ratio from 22,050Hz to 16,000Hz was implemented incorrectly (8,000Hz), causing the audio to play at 2x speed. Fixed the ratio to 320/441. It was a bug in the test code, not the tool.
The library does not accept the language(Unknown prompt key: 'None') A version issue where calling by file path lacks the language field in the temporary input list Added a workaround to write the language into the temporary list (temporary fix)

The biggest lesson here is the case of the word error rate. A bug in the measurement code can make it look like a flaw in the model. If you get a value where the error rate exceeds 1, you should suspect the inputs (sampling rate, length, language specification) first rather than the model.

7. What is the turn latency?

The time from when the user finishes speaking until the first sound plays is the sum of the following:

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

A calculated estimatestitched together from component measurements by sentence length (we did not measure continuously from start to finish). The first sentence of the LLM is an actual sentence from the measurements above, and the TTS time was calculated by plugging the reading length of that sentence into the formula from section 3-1 (synthesis ≈ 0.475 × audio length + 0.23 seconds).

Language ASR (3–7 second utterance) End of LLM First Sentence First Sentence Example TTS (Calculation) Total
Japanese 0.15~0.3 0.10 いいですね!(approx. 1.1s length) approx. 0.75 approx. 1.0~1.2s
Chinese 0.16~0.25 0.13 听起来很舒服!(approx. 1.5s) approx. 0.94 approx. 1.2~1.3s
Korean 0.22~0.4 0.16 와, 정말 좋았겠네요!(approx. 2.1s) approx. 1.2 approx. 1.6~1.8s
English 0.16~0.26 0.20 That sounds like a very relaxing way…!(approx. 3.2s) approx. 1.75 approx. 2.1~2.2s

This table does not include Voice Activity Detection (VAD) and network transmission. Assuming end-of-speech detection takes 0.3 to 0.5 seconds, that much is added accordingly. How much this assumed value incurs in the cost of cutting off mid-speech was measured right below using human-read sentences. The range of publicly available values is 200–500ms recommended by NVIDIA Blueprint, 0.2s default for Pipecat, 0.5s for LiveKit (0.3s for streaming turn detector), and 500ms for OpenAI examples, so the assumption falls within this range. The target latency in the same document (from the end of speech to the start of response) is 600–1,500ms, and the server-end latency of the blueprint using large GPUs and streaming TTS is 0.86–0.93s (vendor figures). The fact that the Korean total in this article plus VAD, which is about 1.9–2.3s, is larger is interpreted as being because the TTS in this article is not streaming (time to the first sound of TTS in public cases is 0.07–0.37s). Learners often hesitate, so short judgments might cut off their speech; research addressing this was not found in accessible materials (unconfirmed).

What Should the End-of-Speech Detection Time Be? (Read-Speech Measurements)

End-of-speech detection assumes that speech has ended if the user is silent for a certain period of time. If that duration is shorter than natural pauses within a sentence, speech is cut off mid-sentence, and if it is too long, the response is delayed by that amount. In FLEURS sentences read by humans (60 per language, average 10–14 seconds), speech segments were found using Silero VAD (6.2.3, threshold 0.5, single CPU thread), and the intervals between adjacent speech segments within a single sentence were counted as "in-sentence pauses." The script and raw data are at docs/experiments/2026-10-07-vad-turn-gaps/ , and were run on a single CPU thread without a GPU.

Language Number of In-Sentence Pauses Median Pause p90 Max Sentences with Pause >= 300ms >= 500ms >= 700ms >= 1,000ms
Korean 87 352ms 608ms 1,152ms 51.7% 28.3% 8.3% 1.7%
English 75 288ms 608ms 928ms 40.0% 13.3% 6.7% 0.0%
Japanese 88 336ms 672ms 1,120ms 50.0% 21.7% 10.0% 1.7%
Chinese 102 288ms 544ms 1,536ms 48.3% 21.7% 8.3% 1.7%

8. Potential Interview Questions

Things That Were Not Verified

References

Verified Versions and Dates

As of 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.

Sign in to like

Comments

No comments yet.

Sign in to leave a comment