TT Lab
博客

한국어 English 日本語 中文

开始
博客

博客

实时语音对话,各组件直接测得的延迟:语音识别 0.2 秒,LLM 首个 Token 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-bit(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,078 MiB(该值包含模型以外的运行环境开销)
加载时间 权重下载完成后约 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-bit

针对学习者水平(CEFR A2),发送了“用一两句话回答并以一个简单的问题结束”的指令,以及用户说的“昨天在咖啡馆看了一本书”这一话语,分别使用四种语言进行了 5 次流式传输测试。 首字延迟指发送请求后到收到第一个字符的时间, 首句延迟指出现第一个标点符号的时间(即可开始语音合成的时间点)。

语言 首字延迟(秒,中位数 / 范围) 首句结束(秒) 回答 Token 生成速度 (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 个 token 的预算全耗费在了思考上。这是因为该模型在 llama.cpp 的对话模板中默认会优先进行思考,通过服务器选项(--reasoning-budget 0)和请求选项(chat_template_kwargs: {enable_thinking: false})将其关闭后恢复正常。 在语音对话中必须关闭思考模式。 如果保持开启,首个声音会延迟好几秒,并且如果 token 预算较短,甚至根本无法输出回答。

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 个 token 全用在了思考上 在服务器和请求两端关闭思考
回显错误率大于 1 错误地编写了将 22,050Hz 转换为 16,000Hz 的比例(8,000Hz),导致语音变成 2 倍速 将比例修正为 320/441。这是测试代码的bug,而不是工具的bug
库无法接收语言(Unknown prompt key: 'None') 通过文件路径调用时临时输入列表中没有语言字段的版本问题 附加了在临时列表中写入语言的绕过代码(权宜之计)

这里最大的教训是关于回显错误率的案例。 测量代码的 bug 可能会被误认为是模型的缺陷。 如果出现错误率超过 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秒)。学习者往往犹豫较多,短促的判断可能会切断说话,但公开资料中未找到专门探讨此现象的研究(未确认)。

语音终点判断时间应该是多少(朗读语音实测)

语音终点判断是指当用户沉默一定时间后即判定说话结束,因此如果该时间短于句子内部自然的停顿,说话就会在半途被截断;而如果太长,响应也会相应延迟。在真人朗读的FLEURS句子(每种语言60句,平均10~14秒)中,使用Silero VAD(6.2.3,阈值0.5,CPU单线程)查找语音段,并将一句话内相邻语音段之间的间隔计为“句内停顿”。脚本和原始数据位于 docs/experiments/2026-10-07-vad-turn-gaps/ 中,且在无GPU的情况下通过CPU单线程运行。

语言 句内停顿次数 停顿中位数 p90 最大值 停顿在300ms以上的句子 500ms以上 700ms以上 1,000ms以上
韩语 87 352ms 608ms 1,152ms 51.7% 28.3% 8.3% 1.7%
英语 75 288ms 608ms 928ms 40.0% 13.3% 6.7% 0.0%
日语 88 336ms 672ms 1,120ms 50.0% 21.7% 10.0% 1.7%
中文 102 288ms 544ms 1,536ms 48.3% 21.7% 8.3% 1.7%

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。

登录后即可点赞

评论

还没有评论。

登录后即可发表评论