[{"data":1,"prerenderedAt":379},["ShallowReactive",2],{"article:column:/column/llm-to-agent-learning/26":3},{"id":4,"title":5,"body":6,"description":371,"extension":372,"meta":373,"navigation":374,"path":375,"seo":376,"stem":377,"__hash__":378},"column/column/llm-to-agent-learning/26.md","26｜声音和视频：时间进入表示以后",{"type":7,"value":8,"toc":352},"minimark",[9,13,16,19,24,27,30,33,36,46,50,53,56,59,62,66,69,72,75,83,86,90,93,96,99,106,109,112,115,118,124,127,130,134,137,145,148,151,159,165,168,172,175,178,181,187,190,198,202,205,208,214,217,220,223,227,230,233,236,239,243,249,252,257,260,265,268,273,276,279,284,287,292,295,300,303,308,311,314,319,322,327,330,335,338,343,346,349],[10,11,12],"p",{},"你对语音助手说：“把会议改到三点……不，四点。”它在“三点”后抢着回答，直到你说完才发现听错了。另一套系统把每个字都认对，却在被打断后继续播放旧答案。问题不一定是语言模型不够聪明：它还得知道声音何时发生、你是否说完，以及哪些内容真的已经播放。",[10,14,15],{},"前两章把图像表示与图像生成分开。本章加入时间这条轴，沿着录音、识别、回答、播音和视频取帧追踪信息。先修只需第19章的生成，以及第24、25章的多模态表示。重点是理解时间怎样改变系统，不要求音频处理或编程基础。",[10,17,18],{},"先固定目标：听懂更正后的时间，尽早开始回应，并在被打断时让记录与用户实际听见的内容一致。录音质量、取样方案和等待规则都可以改变；模型权重暂时固定。这样才能区分“模型没理解”与“正确的信息尚未进入系统”这两类原因。",[20,21,23],"h2",{"id":22},"_1录音不是一串已经写好的字","1．录音不是一串已经写好的字",[10,25,26],{},"空气中的声音连续变化，数字录音会按固定间隔测量信号，得到一串数，这叫采样。采样率表示每秒记录多少次，单位赫兹，写作Hz；16 kHz就是每秒16000次。它描述时间取样密度，不是每秒说多少字，也不是音高本身。",[10,28,29],{},"每次记录还需要有限位数表示幅度。16-bit表示每个样本用16个二进制位，即2字节；它和第18章的量化共享“用有限档位近似数值”的思想，但这里量化的是录音信号，不能把它当成模型权重精度。声道数则表示同时记录几路声音，单声道是一条，立体声通常是两条。",[10,31,32],{},"做一笔教学账：2.4秒、16 kHz、单声道、每样本2字节的未压缩录音，共有16000×2.4＝38400个样本，原始数据是76800字节，即十进制76.8 kB。这里不含文件头。实际压缩音频的文件大小还取决于编码方式，不能直接套这条乘法。",[10,34,35],{},"模型未必逐个读取所有原始采样值。常见做法把相邻声音切成短窗，提取每个时间片中不同频率成分的强弱，组成频谱类表示。可以把它想成一张横轴时间、纵轴频率、颜色表示强弱的图。相邻窗可以重叠，让边界附近的声音不被硬切断；这些窗也不是天然的字词边界。",[10,37,38,39],{},"Whisper的公开实现会构造log-Mel频谱，再进行序列预测。Mel表示频率刻度的一种安排，log表示把很大的强弱差压缩到更易处理的尺度；此处无需计算它们。公开转写流程以滑动的30秒窗口处理音频，这说明“模型使用的处理窗”与“用户说一句话需要多久”可以不同。",[40,41,45],"a",{"href":42,"rel":43},"https://github.com/openai/whisper",[44],"nofollow","Whisper官方实现",[20,47,49],{"id":48},"_2识别和生成走向相反却不是简单倒放","2．识别和生成，走向相反却不是简单倒放",[10,51,52],{},"语音识别把声音变成文字，常简称ASR。它既要读取发音线索，也会利用前后文判断可能的词。如果环境嘈杂、多人重叠或出现陌生姓名，声学线索不完整，语言上的合理猜测就可能覆盖真正说出的内容。流畅的转写仍可能把“四号”写成“十号”。",[10,54,55],{},"文字转语音常简称TTS。输入不只决定词句，还需要安排停顿、时长、重音等，最终输出可播放的声音。有些系统先生成声学特征，再把特征转成波形；有些先预测压缩声音的离散代码。所谓音频token，可能是这类代码，不代表一个汉字或固定一个音节。",[10,57,58],{},"同一句“可以”能够说得肯定、犹豫或反问。只保留文字时，这些信息可能丢失。因此，把音频转成文字是一种有任务目的的信息压缩，不是无损复制。文本系统无法从一份没有标记语气的转写中，可靠恢复原始音调。",[10,60,61],{},"反过来，识别到笑声或迟疑也不等于知道人的真实心理。声音提供可观察信号，情绪判断仍是推断。对于时间、数量、姓名等高影响字段，应使用明确复述与确认，而不是根据“听起来像”就采取行动。",[20,63,65],{"id":64},"_3级联与端到端把边界放在不同地方","3．级联与端到端，把边界放在不同地方",[10,67,68],{},"一种语音助手先做ASR，得到文本；再由文字模型回答；最后TTS播出。这叫级联。每个阶段都有可检查的中间产物，也可以独立更换组件。例如，先确认识别结果究竟是“三点”还是“四点”，再检查回答是否遵循更正。",[10,70,71],{},"代价是错误会向后传。如果第一阶段丢掉了“不”，后面的模型可能非常认真地完成错误任务。即使文字没有错，只通过纯文本接口传递时，语速、重叠说话和语气也可能失去。增加标注可以保留部分信息，但仍需要明确接口能表达什么。",[10,73,74],{},"另一类是语音到语音的端到端交互：系统直接以音频为输入和输出，不强制把一份完整转写作为阶段之间唯一通道。这给利用语音线索和减少阶段等待提供了条件，但不意味着没有内部编码器、没有分块，也不保证每次都更快、更准确。",[10,76,77,78],{},"OpenAI现行语音架构说明把Realtime中的单模型语音交互与可逐阶段检查的级联流程分开介绍。这里用它说明公开的系统接口差别，不能据此猜测未公开层数、训练配方或所有内部音频表示。",[40,79,82],{"href":80,"rel":81},"https://developers.openai.com/api/docs/guides/voice-agents",[44],"OpenAI语音架构说明",[10,84,85],{},"选择时先问自己需要什么：会议归档可能很看重可校订的文字；自由对话更在乎自然接话；复杂业务可能希望关键步骤都有检查点。两条路线也能组合，不必把所有产品强行分进两个纯粹盒子。",[20,87,89],{"id":88},"_4延迟要从同一个起点量起","4．延迟要从同一个起点量起",[10,91,92],{},"“响应只花一秒”不够明确。是从用户开始说话，到系统给出完整答案？还是用户说完以后，到第一段可听见的声音？长录音即使处理得很快，录制本身仍需要时间；第一声很快，也不代表后面没有卡顿。",[10,94,95],{},"用完全构造的教学时序算一次。用户从0毫秒说到2400毫秒，1毫秒是千分之一秒。系统再等待300毫秒确认结束，花200毫秒完成识别，文字回答到可播出的第一小段需要500毫秒，合成这段声音需要250毫秒，最后传输与播放准备合计150毫秒。",[10,97,98],{},"于是第一声出现于2400＋300＋200＋500＋250＋150＝3800毫秒。以用户说完为起点，等待是1400毫秒；以开始说话为起点，则是3800毫秒。两个数字都可以正确，前提是把起止事件写清楚。这些数是用来拆账的教学设定，不是任何服务的速度实测。",[10,100,101],{},[102,103],"img",{"alt":104,"src":105},"26｜声音和视频：时间进入表示以后：图1","/collections-assets/llm-to-agent-learning/cfac8d0baa3701b3d63040e3c73502b62258e580d22869e6ab4018d889347695.png",[10,107,108],{},"图1｜串行教学时间轴从说完的2400毫秒开始，五段等待依次累计到3800毫秒，首声等待是1400毫秒。条长按实际教学数值绘制；首声不是整段回答完成。",[10,110,111],{},"流式处理让阶段在数据尚未齐全时就开始工作。识别可以边听边更新文字，生成可以先完成一小段，合成也能逐段送去播放。于是部分等待重叠，不能再把各阶段完整耗时简单相加。真正决定首声的是通往第一段可播放声音的那条依赖路径。",[10,113,114],{},"用两块输入走一遍：第一块声音到达后，识别器可以先给出暂定文字，生成器再形成第一段回答，合成器随后产生第一块可播音频。与此同时，输入端仍可能接收第二块声音；生成第二段也可以与播放第一段重叠。每条箭头必须满足“上游已有可用结果”，不能因为阶段名字不同就任意并行。",[10,116,117],{},"在带有更正的任务里，还要区别“能够开始计算”和“允许对外播放”。可以先算暂定回答并留在缓冲中，待话轮结束、关键时间确定后再放行。若第二块把三点改为四点，缓冲中的旧第一段也必须撤回。缓存省下的等待，可能因更正而变成废弃计算；流式路线并不保证每条输入都更快。",[10,119,120],{},[102,121],{"alt":122,"src":123},"26｜声音和视频：时间进入表示以后：图2","/collections-assets/llm-to-agent-learning/0b47fc3f80e919a555a6397b93b01259a2c24ba64d09544400439812b9c936dc.png",[10,125,126],{},"图2｜流式的两块输入与两段输出。箭头表示数据依赖；横向表示处理阶段，向下表示先后顺序；不按耗时比例。第一块可先处理，第二块仍在到达；暂定音频经过话轮与关键内容检查后才播放。",[10,128,129],{},"但“更早”有代价。听到“三点”就提前生成，后来出现“不，四点”，之前的暂定结果要被修正。文字流中的临时版本与最终版本应当区分，不能把每次增量当成新增的一句事实。越早承诺，就越需要处理撤回、覆盖和缓冲。",[20,131,133],{"id":132},"_5实时对话还要知道何时让出话轮","5．实时对话还要知道何时让出话轮",[10,135,136],{},"语音活动检测，简称VAD，用来判断什么时候有人开始或停止说话。根据静音间隔切分是常见办法：短一点的等待使回答更快，也更容易把思考停顿当成结束；长一点较少抢话，却可能让对话显得迟钝。背景音乐、咳嗽和远处说话还会制造误触发。",[10,138,139,140],{},"静音检测和理解句子是否说完不是同一件事。OpenAI的Realtime文档分别介绍基于静音的检测和结合语义判断完成度的检测。后者能够利用“然后……”“我想想”等线索，但仍涉及等待与抢话的取舍，并非读懂一个人的全部意图。",[40,141,144],{"href":142,"rel":143},"https://developers.openai.com/api/docs/guides/realtime-vad",[44],"Realtime话轮检测",[10,146,147],{},"再看打断。假设回答准备播6秒，3800毫秒开始播放，你在5000毫秒打断。此时真正听到的只有1200毫秒，而不是整段6秒。系统至少要分清三个进度：已经生成多少、已经发送多少、用户端已经播放多少。这些数可能不同。",[10,149,150],{},"如果只是停止扬声器，却把完整旧回答留在后续上下文，模型可能认为你已经听过尚未播出的后半段。如果只是停止新生成，设备缓冲里的旧声音仍可能继续播放。可靠处理需要取消相关生成、停止播放，并使会话记录与已播放范围协调。",[10,152,153,154],{},"Realtime官方文档明确区分连接方式：部分传输由服务端管理播放缓冲，另一些需要客户端报告播放进度并处理截断。这里的关键原理是“生成过”不等于“传达过”，而不是背接口名字。",[40,155,158],{"href":156,"rel":157},"https://developers.openai.com/api/docs/guides/realtime-conversations",[44],"Realtime打断与截断",[10,160,161],{},[102,162],{"alt":163,"src":164},"26｜声音和视频：时间进入表示以后：图3","/collections-assets/llm-to-agent-learning/14023ff6560c37a64bdc3531198b95e805af6952b48a19555aee3262e747e8c8.png",[10,166,167],{},"图3｜假定6秒音频已全部生成，3800毫秒开始播放，5000毫秒被打断，已听1.2秒、未听4.8秒。后续记录应与实际传达范围协调；图中不假设6秒都已发送。",[20,169,171],{"id":170},"_6视频多了一条必须保留的时间轴","6．视频多了一条必须保留的时间轴",[10,173,174],{},"一张图主要描述某个时刻；视频还要描述变化。同样是“门开着”，单帧无法确定门刚被打开，还是一直没有关。视频模型常会从原视频取若干帧或短片段，经过视觉编码，并保留顺序或时间信息。把它们当成无序相册，会丢失动作先后。",[10,176,177],{},"帧率用fps表示每秒多少帧。原视频30 fps，不意味着模型一定每秒处理30帧。为了控制输入长度，系统可能降低取帧密度或动态选择片段。音频采样率与视频帧率也不是一回事：前者测量声音信号，后者记录画面时刻，二者需要对齐时间而非对齐编号。",[10,179,180],{},"做一个6秒教学片段，考虑从0秒到不足6秒。原视频30 fps有180帧。若模型只看0、2、4秒三个时刻，正好发生在2.2—2.6秒的举手动作就可能完全缺席；把这些画面放大，也补不回从未取到的动作。若以每秒4帧取样，则24个时刻中包括2.25秒与2.50秒，有机会看见它。",[10,182,183],{},[102,184],{"alt":185,"src":186},"26｜声音和视频：时间进入表示以后：图4","/collections-assets/llm-to-agent-learning/19eec576e77cd874202cb36f4aa4c067cc1c9b2891b0cbba385c728e3555ea72.png",[10,188,189],{},"图4｜6秒视频按［0，6）计时，30 fps共有180帧。只取0、2、4秒会漏掉2.2—2.6秒举手；4 fps的24次取样中，2.25与2.50秒落在事件区间。图中取样点按时间准确定位。",[10,191,192,193],{},"时间间隔也不能被顺序代替。两个相邻抽取画面可能隔了0.25秒，也可能隔了20秒。如果不知道间隔，就很难判断动作速度。Qwen2.5-VL公开说明使用动态帧率训练，并让时间位置表示与绝对时间对齐；这是将实际时间带入表示的具体案例，不是所有视频模型的唯一做法。",[40,194,197],{"href":195,"rel":196},"https://qwenlm.github.io/blog/qwen2.5-vl/",[44],"Qwen2.5-VL官方视频说明",[20,199,201],{"id":200},"_7多模态对齐以及生成视频的额外难题","7．多模态对齐，以及生成视频的额外难题",[10,203,204],{},"“他说现在开始时，屏幕上出现了什么？”需要把语音中的时间段、转写中的句子与视频帧对应起来。如果字幕整体晚两秒，即使语音识别和物体识别分别正确，跨模态回答也可能配错。时间戳应有明确的起点、单位，并处理剪辑或暂停带来的偏移。",[10,206,207],{},"设同一段素材里，“开始”一词在1.0—1.4秒说出，灯在1.2秒亮起，2.0秒熄灭。如果字幕把这个词标到3.0—3.4秒，去读字幕起点对应的画面，就会看到灯灭着。识别出的词和灯的图像都没有错，错的是将两个时钟当成同一个。已知字幕整体晚2秒时，应从字幕时间减去2秒，再寻找原视频帧。",[10,209,210],{},[102,211],{"alt":212,"src":213},"26｜声音和视频：时间进入表示以后：图5","/collections-assets/llm-to-agent-learning/7a72116e38f34c9db2225588eb9d698893b34bfe324070ebabde18550ea88e25.png",[10,215,216],{},"图5｜同一素材的声音、灯状态与字幕。字幕晚2秒使“开始”从1.0—1.4秒被错放到3.0—3.4秒；减去已知偏移才能回到同一事件。校正时间不替代识别与理解。",[10,218,219],{},"看懂视频与生成视频也不能混为一谈。第25章的图像生成机制扩展到时间时，还要让相邻时刻的对象外观、位置和动作保持连贯。逐帧独立生成可能每张都漂亮，却在人脸、物件数量或运动上跳变。真实系统会采用不同的时空表示和生成路线，不能根据输出风格断言内部算法。",[10,221,222],{},"连贯同样不等于物理正确。画面可以很平滑，但接触关系、因果顺序和遮挡后的物体仍可能出错。因此，视频评测不能只选一帧看清晰度；需要检查跨帧身份、事件顺序和动作是否满足任务。",[20,224,226],{"id":225},"_8不用模型也能先检查自己的测量方法","8．不用模型，也能先检查自己的测量方法",[10,228,229],{},"拿纸画出“我要订周五……不，周六”这句话，分别在短停顿和真正结束处作标记。给两种话轮规则各走一次：遇到短静音就结束，或等待更长的停顿。记录抢话发生在哪里，以及等待增加了多少。这个练习检验规则理解，没有证明某模型实际会怎样反应。",[10,231,232],{},"再用几张卡片表示视频帧，在其中两张之间藏一张“关键动作”。让同伴只看隔张抽取的结果，询问是否能断言动作从未发生。你会看到，“没观察到”与“没有发生”需要不同证据。",[10,234,235],{},"以后若测试真实语音系统，应固定设备、网络与任务，分别记录关键字段识别、首声等待、打断后停止是否及时、未播内容有没有混入后续回答。测试视频系统，则记录取帧方案、时间定位误差和漏检事件。顺畅感是体验指标，不能替代这些可核对的结果。",[20,237,238],{"id":238},"本章练习",[240,241,242],"h3",{"id":242},"题目",[10,244,245],{},[246,247,248],"strong",{},"问题1｜算清首声等待",[10,250,251],{},"沿图1的串行教学设定，若仅把首段合成从250毫秒缩到150毫秒，其余阶段不变，第一声出现于何时？从说完算等待多少？这证明完整回答也快了100毫秒吗？",[10,253,254],{},[246,255,256],{},"问题2｜标出真正听见的范围",[10,258,259],{},"假定6秒回答全部生成，3800毫秒开始播放，5000毫秒打断。画一条6秒的音频条，标出已听和未听范围，并说明后续会话记录至少要处理什么。",[10,261,262],{},[246,263,264],{},"问题3｜找到取样盲区",[10,266,267],{},"6秒视频以［0，6）计时，事件在2.2—2.6秒。分别用0、2、4秒与每秒4帧取样，列出命中事件的时刻。2.4秒、16 kHz录音的38400个采样值为什么不是同一类计数？",[10,269,270],{},[246,271,272],{},"问题4｜校正跨模态时间",[10,274,275],{},"“开始”实际在1.0—1.4秒，字幕整体晚2秒，灯在1.2—2.0秒亮着。直接查看字幕起点3.0秒的画面会怎样？应怎样校正？",[240,277,278],{"id":278},"思考提示",[10,280,281],{},[246,282,283],{},"提示1｜对应问题1",[10,285,286],{},"固定说话结束点，只替换其中一段耗时；首声与最后一段播放结束不是同一个终点。",[10,288,289],{},[246,290,291],{},"提示2｜对应问题2",[10,293,294],{},"先把两个绝对时间相减，再在6秒条上分段；区分生成、发送与播放。",[10,296,297],{},[246,298,299],{},"提示3｜对应问题3",[10,301,302],{},"写出4 fps对应的四分之一秒网格，检查哪些点进入事件区间；再看音频计数的单位。",[10,304,305],{},[246,306,307],{},"提示4｜对应问题4",[10,309,310],{},"把字幕时钟转换回素材时钟，再比较词段与亮灯区间是否重叠。",[240,312,313],{"id":313},"参考答案与解析",[10,315,316],{},[246,317,318],{},"答案1｜对应问题1",[10,320,321],{},"第一声变为3700毫秒，从说完算为1300毫秒，均比原来少100毫秒。只能据此判断第一小段的就绪时刻；后续生成、合成与播放可能另有等待，未给出完整回答结束的证据。",[10,323,324],{},[246,325,326],{},"答案2｜对应问题2",[10,328,329],{},"已听为［0，1.2）秒，未听为［1.2，6）秒，分别是1.2秒和4.8秒。系统要停止相关生成与播放，并按已播放范围协调记录，避免把未听后半段当成已传达；是否已经发送到设备还需独立进度。",[10,331,332],{},[246,333,334],{},"答案3｜对应问题3",[10,336,337],{},"粗取样没有命中；4 fps在2.25、2.50秒命中。前者总计3帧，后者24帧。38400表示声音幅度的原始采样次数，不是视频帧，也不等于音频token；特征提取与编码会改变模型读取的单位。命中画面仍不证明识别正确。",[10,339,340],{},[246,341,342],{},"答案4｜对应问题4",[10,344,345],{},"3.0秒时灯已熄灭，直接配对会错过同时亮灯的证据。字幕时间减2秒还原到1.0—1.4秒，该词段与1.2—2.0秒亮灯区间有重叠；因此本例在说“开始”的后半段灯已亮。这个结论依赖偏移确为固定2秒。",[20,347,348],{"id":348},"下一章",[10,350,351],{},"同一个模型的行为不仅取决于参数，也取决于送进去什么信息、以什么顺序送入。下一章回到文字：为什么几条例子能改变回答方式，而结构化输出究竟能约束什么？",{"title":353,"searchDepth":354,"depth":354,"links":355},"",3,[356,358,359,360,361,362,363,364,365,370],{"id":22,"depth":357,"text":23},2,{"id":48,"depth":357,"text":49},{"id":64,"depth":357,"text":65},{"id":88,"depth":357,"text":89},{"id":132,"depth":357,"text":133},{"id":170,"depth":357,"text":171},{"id":200,"depth":357,"text":201},{"id":225,"depth":357,"text":226},{"id":238,"depth":357,"text":238,"children":366},[367,368,369],{"id":242,"depth":354,"text":242},{"id":278,"depth":354,"text":278},{"id":313,"depth":354,"text":313},{"id":348,"depth":357,"text":348},"从信息表示和学习出发，用可核算的例子与白板图逐步理解大模型、后训练、推理和Agent系统。","md",{},true,"/column/llm-to-agent-learning/26",{"title":5,"description":371},"column/llm-to-agent-learning/26","sovgzA2NxuFCL9pEJMhEIH96CobcnXaf_oTw592xKrQ",1791935828819]