你对语音助手说:“把会议改到三点……不,四点。”它在“三点”后抢着回答,直到你说完才发现听错了。另一套系统把每个字都认对,却在被打断后继续播放旧答案。问题不一定是语言模型不够聪明:它还得知道声音何时发生、你是否说完,以及哪些内容真的已经播放。
前两章把图像表示与图像生成分开。本章加入时间这条轴,沿着录音、识别、回答、播音和视频取帧追踪信息。先修只需第19章的生成,以及第24、25章的多模态表示。重点是理解时间怎样改变系统,不要求音频处理或编程基础。
先固定目标:听懂更正后的时间,尽早开始回应,并在被打断时让记录与用户实际听见的内容一致。录音质量、取样方案和等待规则都可以改变;模型权重暂时固定。这样才能区分“模型没理解”与“正确的信息尚未进入系统”这两类原因。
1.录音不是一串已经写好的字
空气中的声音连续变化,数字录音会按固定间隔测量信号,得到一串数,这叫采样。采样率表示每秒记录多少次,单位赫兹,写作Hz;16 kHz就是每秒16000次。它描述时间取样密度,不是每秒说多少字,也不是音高本身。
每次记录还需要有限位数表示幅度。16-bit表示每个样本用16个二进制位,即2字节;它和第18章的量化共享“用有限档位近似数值”的思想,但这里量化的是录音信号,不能把它当成模型权重精度。声道数则表示同时记录几路声音,单声道是一条,立体声通常是两条。
做一笔教学账:2.4秒、16 kHz、单声道、每样本2字节的未压缩录音,共有16000×2.4=38400个样本,原始数据是76800字节,即十进制76.8 kB。这里不含文件头。实际压缩音频的文件大小还取决于编码方式,不能直接套这条乘法。
模型未必逐个读取所有原始采样值。常见做法把相邻声音切成短窗,提取每个时间片中不同频率成分的强弱,组成频谱类表示。可以把它想成一张横轴时间、纵轴频率、颜色表示强弱的图。相邻窗可以重叠,让边界附近的声音不被硬切断;这些窗也不是天然的字词边界。
Whisper的公开实现会构造log-Mel频谱,再进行序列预测。Mel表示频率刻度的一种安排,log表示把很大的强弱差压缩到更易处理的尺度;此处无需计算它们。公开转写流程以滑动的30秒窗口处理音频,这说明“模型使用的处理窗”与“用户说一句话需要多久”可以不同。Whisper官方实现
2.识别和生成,走向相反却不是简单倒放
语音识别把声音变成文字,常简称ASR。它既要读取发音线索,也会利用前后文判断可能的词。如果环境嘈杂、多人重叠或出现陌生姓名,声学线索不完整,语言上的合理猜测就可能覆盖真正说出的内容。流畅的转写仍可能把“四号”写成“十号”。
文字转语音常简称TTS。输入不只决定词句,还需要安排停顿、时长、重音等,最终输出可播放的声音。有些系统先生成声学特征,再把特征转成波形;有些先预测压缩声音的离散代码。所谓音频token,可能是这类代码,不代表一个汉字或固定一个音节。
同一句“可以”能够说得肯定、犹豫或反问。只保留文字时,这些信息可能丢失。因此,把音频转成文字是一种有任务目的的信息压缩,不是无损复制。文本系统无法从一份没有标记语气的转写中,可靠恢复原始音调。
反过来,识别到笑声或迟疑也不等于知道人的真实心理。声音提供可观察信号,情绪判断仍是推断。对于时间、数量、姓名等高影响字段,应使用明确复述与确认,而不是根据“听起来像”就采取行动。
3.级联与端到端,把边界放在不同地方
一种语音助手先做ASR,得到文本;再由文字模型回答;最后TTS播出。这叫级联。每个阶段都有可检查的中间产物,也可以独立更换组件。例如,先确认识别结果究竟是“三点”还是“四点”,再检查回答是否遵循更正。
代价是错误会向后传。如果第一阶段丢掉了“不”,后面的模型可能非常认真地完成错误任务。即使文字没有错,只通过纯文本接口传递时,语速、重叠说话和语气也可能失去。增加标注可以保留部分信息,但仍需要明确接口能表达什么。
另一类是语音到语音的端到端交互:系统直接以音频为输入和输出,不强制把一份完整转写作为阶段之间唯一通道。这给利用语音线索和减少阶段等待提供了条件,但不意味着没有内部编码器、没有分块,也不保证每次都更快、更准确。
OpenAI现行语音架构说明把Realtime中的单模型语音交互与可逐阶段检查的级联流程分开介绍。这里用它说明公开的系统接口差别,不能据此猜测未公开层数、训练配方或所有内部音频表示。OpenAI语音架构说明
选择时先问自己需要什么:会议归档可能很看重可校订的文字;自由对话更在乎自然接话;复杂业务可能希望关键步骤都有检查点。两条路线也能组合,不必把所有产品强行分进两个纯粹盒子。
4.延迟要从同一个起点量起
“响应只花一秒”不够明确。是从用户开始说话,到系统给出完整答案?还是用户说完以后,到第一段可听见的声音?长录音即使处理得很快,录制本身仍需要时间;第一声很快,也不代表后面没有卡顿。
用完全构造的教学时序算一次。用户从0毫秒说到2400毫秒,1毫秒是千分之一秒。系统再等待300毫秒确认结束,花200毫秒完成识别,文字回答到可播出的第一小段需要500毫秒,合成这段声音需要250毫秒,最后传输与播放准备合计150毫秒。
于是第一声出现于2400+300+200+500+250+150=3800毫秒。以用户说完为起点,等待是1400毫秒;以开始说话为起点,则是3800毫秒。两个数字都可以正确,前提是把起止事件写清楚。这些数是用来拆账的教学设定,不是任何服务的速度实测。

图1|串行教学时间轴从说完的2400毫秒开始,五段等待依次累计到3800毫秒,首声等待是1400毫秒。条长按实际教学数值绘制;首声不是整段回答完成。
流式处理让阶段在数据尚未齐全时就开始工作。识别可以边听边更新文字,生成可以先完成一小段,合成也能逐段送去播放。于是部分等待重叠,不能再把各阶段完整耗时简单相加。真正决定首声的是通往第一段可播放声音的那条依赖路径。
用两块输入走一遍:第一块声音到达后,识别器可以先给出暂定文字,生成器再形成第一段回答,合成器随后产生第一块可播音频。与此同时,输入端仍可能接收第二块声音;生成第二段也可以与播放第一段重叠。每条箭头必须满足“上游已有可用结果”,不能因为阶段名字不同就任意并行。
在带有更正的任务里,还要区别“能够开始计算”和“允许对外播放”。可以先算暂定回答并留在缓冲中,待话轮结束、关键时间确定后再放行。若第二块把三点改为四点,缓冲中的旧第一段也必须撤回。缓存省下的等待,可能因更正而变成废弃计算;流式路线并不保证每条输入都更快。

图2|流式的两块输入与两段输出。箭头表示数据依赖;横向表示处理阶段,向下表示先后顺序;不按耗时比例。第一块可先处理,第二块仍在到达;暂定音频经过话轮与关键内容检查后才播放。
但“更早”有代价。听到“三点”就提前生成,后来出现“不,四点”,之前的暂定结果要被修正。文字流中的临时版本与最终版本应当区分,不能把每次增量当成新增的一句事实。越早承诺,就越需要处理撤回、覆盖和缓冲。
5.实时对话还要知道何时让出话轮
语音活动检测,简称VAD,用来判断什么时候有人开始或停止说话。根据静音间隔切分是常见办法:短一点的等待使回答更快,也更容易把思考停顿当成结束;长一点较少抢话,却可能让对话显得迟钝。背景音乐、咳嗽和远处说话还会制造误触发。
静音检测和理解句子是否说完不是同一件事。OpenAI的Realtime文档分别介绍基于静音的检测和结合语义判断完成度的检测。后者能够利用“然后……”“我想想”等线索,但仍涉及等待与抢话的取舍,并非读懂一个人的全部意图。Realtime话轮检测
再看打断。假设回答准备播6秒,3800毫秒开始播放,你在5000毫秒打断。此时真正听到的只有1200毫秒,而不是整段6秒。系统至少要分清三个进度:已经生成多少、已经发送多少、用户端已经播放多少。这些数可能不同。
如果只是停止扬声器,却把完整旧回答留在后续上下文,模型可能认为你已经听过尚未播出的后半段。如果只是停止新生成,设备缓冲里的旧声音仍可能继续播放。可靠处理需要取消相关生成、停止播放,并使会话记录与已播放范围协调。
Realtime官方文档明确区分连接方式:部分传输由服务端管理播放缓冲,另一些需要客户端报告播放进度并处理截断。这里的关键原理是“生成过”不等于“传达过”,而不是背接口名字。Realtime打断与截断

图3|假定6秒音频已全部生成,3800毫秒开始播放,5000毫秒被打断,已听1.2秒、未听4.8秒。后续记录应与实际传达范围协调;图中不假设6秒都已发送。
6.视频多了一条必须保留的时间轴
一张图主要描述某个时刻;视频还要描述变化。同样是“门开着”,单帧无法确定门刚被打开,还是一直没有关。视频模型常会从原视频取若干帧或短片段,经过视觉编码,并保留顺序或时间信息。把它们当成无序相册,会丢失动作先后。
帧率用fps表示每秒多少帧。原视频30 fps,不意味着模型一定每秒处理30帧。为了控制输入长度,系统可能降低取帧密度或动态选择片段。音频采样率与视频帧率也不是一回事:前者测量声音信号,后者记录画面时刻,二者需要对齐时间而非对齐编号。
做一个6秒教学片段,考虑从0秒到不足6秒。原视频30 fps有180帧。若模型只看0、2、4秒三个时刻,正好发生在2.2—2.6秒的举手动作就可能完全缺席;把这些画面放大,也补不回从未取到的动作。若以每秒4帧取样,则24个时刻中包括2.25秒与2.50秒,有机会看见它。

图4|6秒视频按[0,6)计时,30 fps共有180帧。只取0、2、4秒会漏掉2.2—2.6秒举手;4 fps的24次取样中,2.25与2.50秒落在事件区间。图中取样点按时间准确定位。
时间间隔也不能被顺序代替。两个相邻抽取画面可能隔了0.25秒,也可能隔了20秒。如果不知道间隔,就很难判断动作速度。Qwen2.5-VL公开说明使用动态帧率训练,并让时间位置表示与绝对时间对齐;这是将实际时间带入表示的具体案例,不是所有视频模型的唯一做法。Qwen2.5-VL官方视频说明
7.多模态对齐,以及生成视频的额外难题
“他说现在开始时,屏幕上出现了什么?”需要把语音中的时间段、转写中的句子与视频帧对应起来。如果字幕整体晚两秒,即使语音识别和物体识别分别正确,跨模态回答也可能配错。时间戳应有明确的起点、单位,并处理剪辑或暂停带来的偏移。
设同一段素材里,“开始”一词在1.0—1.4秒说出,灯在1.2秒亮起,2.0秒熄灭。如果字幕把这个词标到3.0—3.4秒,去读字幕起点对应的画面,就会看到灯灭着。识别出的词和灯的图像都没有错,错的是将两个时钟当成同一个。已知字幕整体晚2秒时,应从字幕时间减去2秒,再寻找原视频帧。

图5|同一素材的声音、灯状态与字幕。字幕晚2秒使“开始”从1.0—1.4秒被错放到3.0—3.4秒;减去已知偏移才能回到同一事件。校正时间不替代识别与理解。
看懂视频与生成视频也不能混为一谈。第25章的图像生成机制扩展到时间时,还要让相邻时刻的对象外观、位置和动作保持连贯。逐帧独立生成可能每张都漂亮,却在人脸、物件数量或运动上跳变。真实系统会采用不同的时空表示和生成路线,不能根据输出风格断言内部算法。
连贯同样不等于物理正确。画面可以很平滑,但接触关系、因果顺序和遮挡后的物体仍可能出错。因此,视频评测不能只选一帧看清晰度;需要检查跨帧身份、事件顺序和动作是否满足任务。
8.不用模型,也能先检查自己的测量方法
拿纸画出“我要订周五……不,周六”这句话,分别在短停顿和真正结束处作标记。给两种话轮规则各走一次:遇到短静音就结束,或等待更长的停顿。记录抢话发生在哪里,以及等待增加了多少。这个练习检验规则理解,没有证明某模型实际会怎样反应。
再用几张卡片表示视频帧,在其中两张之间藏一张“关键动作”。让同伴只看隔张抽取的结果,询问是否能断言动作从未发生。你会看到,“没观察到”与“没有发生”需要不同证据。
以后若测试真实语音系统,应固定设备、网络与任务,分别记录关键字段识别、首声等待、打断后停止是否及时、未播内容有没有混入后续回答。测试视频系统,则记录取帧方案、时间定位误差和漏检事件。顺畅感是体验指标,不能替代这些可核对的结果。
本章练习
题目
问题1|算清首声等待
沿图1的串行教学设定,若仅把首段合成从250毫秒缩到150毫秒,其余阶段不变,第一声出现于何时?从说完算等待多少?这证明完整回答也快了100毫秒吗?
问题2|标出真正听见的范围
假定6秒回答全部生成,3800毫秒开始播放,5000毫秒打断。画一条6秒的音频条,标出已听和未听范围,并说明后续会话记录至少要处理什么。
问题3|找到取样盲区
6秒视频以[0,6)计时,事件在2.2—2.6秒。分别用0、2、4秒与每秒4帧取样,列出命中事件的时刻。2.4秒、16 kHz录音的38400个采样值为什么不是同一类计数?
问题4|校正跨模态时间
“开始”实际在1.0—1.4秒,字幕整体晚2秒,灯在1.2—2.0秒亮着。直接查看字幕起点3.0秒的画面会怎样?应怎样校正?
思考提示
提示1|对应问题1
固定说话结束点,只替换其中一段耗时;首声与最后一段播放结束不是同一个终点。
提示2|对应问题2
先把两个绝对时间相减,再在6秒条上分段;区分生成、发送与播放。
提示3|对应问题3
写出4 fps对应的四分之一秒网格,检查哪些点进入事件区间;再看音频计数的单位。
提示4|对应问题4
把字幕时钟转换回素材时钟,再比较词段与亮灯区间是否重叠。
参考答案与解析
答案1|对应问题1
第一声变为3700毫秒,从说完算为1300毫秒,均比原来少100毫秒。只能据此判断第一小段的就绪时刻;后续生成、合成与播放可能另有等待,未给出完整回答结束的证据。
答案2|对应问题2
已听为[0,1.2)秒,未听为[1.2,6)秒,分别是1.2秒和4.8秒。系统要停止相关生成与播放,并按已播放范围协调记录,避免把未听后半段当成已传达;是否已经发送到设备还需独立进度。
答案3|对应问题3
粗取样没有命中;4 fps在2.25、2.50秒命中。前者总计3帧,后者24帧。38400表示声音幅度的原始采样次数,不是视频帧,也不等于音频token;特征提取与编码会改变模型读取的单位。命中画面仍不证明识别正确。
答案4|对应问题4
3.0秒时灯已熄灭,直接配对会错过同时亮灯的证据。字幕时间减2秒还原到1.0—1.4秒,该词段与1.2—2.0秒亮灯区间有重叠;因此本例在说“开始”的后半段灯已亮。这个结论依赖偏移确为固定2秒。
下一章
同一个模型的行为不仅取决于参数,也取决于送进去什么信息、以什么顺序送入。下一章回到文字:为什么几条例子能改变回答方式,而结构化输出究竟能约束什么?