ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

MiniCPM-o 4.5:实时能听能看能说的多模态模型

MiniCPM-o 4.5:实时能听能看能说的多模态模型 一、概述MiniCPM-o 4.5 是一个具有 9B 参数的开源模型能够同时看、听和说话。在真实世界视频上测试了它的全双工full-duplexOmni-Flow 流式能力。大多数多模态 AI 模型今天仍以轮替方式工作。你把视频输入给它们等待它们处理完然后得到一个回复。尽管这对传统聊天机器人来说效果不错但这并不反映人类自然与世界交互的方式。我们在说话的同时也在听。我们会在事情仍在发生时做出反应。MiniCPM-o 4.5 是一个旨在弥补这一差距的新开源模型。它仅有 90 亿参数就能持续观看实时视频、监听输入音频并同步发声回应——三者同时进行。在本文中将探讨该模型的工作原理、检查其架构、讨论我们的实验并强调其表现良好的方面以及当前的局限性。简单来说MiniCPM-o 4.5 就是一个「能听、能看、能说」的 AI 模型。它不像传统聊天机器人那样只能一问一答而是像真人一样一边看着实时画面一边听着周围的声音还能同步开口回应——三者同时进行互不耽误。这种「能听能看」的能力正是它区别于普通多模态模型的最大亮点。二、问题基于回合的 AI 的局限想象你和朋友一起看板球比赛。他们不会等到一轮结束才做出反应。他们会在实时高呼同时继续看下一个投球。传统多模态模型无法做到这一点原因有两个严重限制时间陈旧性Temporal staleness如果在模型仍在说话时屏幕上出现了新情况模型无法更新其正在进行的回应。无前瞻性No proactivity模型只有在被明确询问时才会回应。即使屏幕上发生了重要事件它也不会主动发声。要突破这些限制需要一种从根本上不同的交互设计。三、架构四个模块一个连通的流水线MiniCPM-o 4.5 并未为视觉、音频和文本运行各自独立的服务而是在 token 级别将所有组件直接连接为一个可端到端训练的系统。图 1MiniCPM-o 4.5 的四个模块通过共享的 token 级隐藏状态相连。为便于说明我们将架构分成四个功能性模块。论文将它们归为三类编码器、LLM 和语音解码器Vision EncoderSigLIP2-based ViT0.4B每一帧输入视频被切分为若干切片。每个切片被编码为 1024 个 token然后通过重采样器resampler模块压缩到仅 64 个 token。这是 16× 的 token 压缩比远高于大多数模型使用的大约 4×。它显著降低了实时流式处理的计算成本。Audio EncoderWhisper Medium0.3B输入音频以小的流式块处理每秒产生 50 个特征 token。通过一个 MLP projector 进一步压缩 5×结果是每秒将 10 个音频 token 传给语言模型。LLM BackboneQwen3-8B这是架构的核心推理组件。它接收合并的视觉和音频 token执行多模态推理并生成文本输出以及携带韵律和上下文信息以供语音使用的隐藏状态。Speech Decoders一个轻量级的基于 Llama 的语音 token 解码器~0.3B接收 LLM 的隐藏状态并将其转换为离散的语音 token。随后一个流式 flow-matching 解码器将这些 token 转换为实际的音频波形声音风格由系统提示中的参考音频片段控制从而实现开箱即用的语音克隆。编码器、Qwen3-8B 主干和语音 token 解码器通过共享的 token 级隐藏状态相连并联合训练。随后独立的流式 flow-matching 解码器将语音 token 转换为音频波形。四、Omni-Flow让全双工full-duplex可行MiniCPM-o 4.5 背后的关键框架称为 Omni-Flow。核心思想很简单不要在听和说之间交替而是将一切视频、音频和输出在同一共享时间线上对齐。图 2现有模型在感知和说话之间交替进行而 MiniCPM-o 4.5 可以同时完成二者。Omni-Flow 将时间线分为固定的 1 秒块。在每个时间块中模型会接收刚到达的新视频帧和音频决定是保持沉默还是发声基于刚看到和听到的内容生成输出是否发声的决定与决定说什么是分开的。模型首先预测一个“listen”或“speak”控制 token然后生成对应的内容。论文表明这种两步设计比将两种决定合并为一步更稳定。1 秒的块大小被发现是最佳折中。更短的块0.1s、0.2s会显著降低输出质量因为模型在每个窗口内没有足够的上下文来做出稳定的决定。五、TAIL保持语音同步Omni-Flow 本身无法解决一个更微妙的问题。文本生成非常快但将这些文本口语化需要实时播放。如果模型生成太多文本太快语音将开始落后于屏幕上实际发生的事情。图 3非交错和固定比例方法会让语音落后于实时场景TAIL 逐块调整以保持同步。为了解决这个问题论文提出了 Time-Aligned InterleavingTAIL。TAIL 不使用固定的文本 token 到语音 token 的比例而是追踪整个对话期间累计的播放延迟。如果语音开始落后于实时边界TAIL 会强制模型在当前时间块中生成更少的文本 token从而让音频赶上来。它还使用了一个小的前瞻窗口将时间块中最后几个词的语音 token 推迟到下一块。这为语音解码器提供了足够的未来上下文来正确处理发音例如 “the” 在 “the apple” 与 “the car” 中发音不同同时不让文本流远远领先于播放。这种同步是有代价的动态 TAIL 将英文 WER 从 2.38 提高到 3.93论文表 10用一定的准确率换取及时的播放。六、入门设置很简单——安装依赖、加载模型然后调用model.as_duplex()将其切换到全双工full-duplex流式模式。从那里你加载一个视频和一个参考语音片段设置一个描述模型应如何行为的系统提示并一次性按时间块喂入音/视频。模型每秒决定是否保持沉默或发声。完整的安装步骤、模型初始化代码和流式循环可在官方 Hugging Face 模型卡上找到。七、训练分阶段构建训练使用四个阶段来阻止各模态相互干扰Speech Pretraining视觉和语言主干保持完全冻结。只有新的音频模块被训练教会它们将输入语音映射到 LLM 的 token 空间而不破坏已有学习。Joint Pretraining全部解冻。模型现在在平衡的视觉、语音和文本数据混合上同时训练。保持数据比例在硬件 ranks 上固定可以防止任何一种模态主导其他模态。Supervised Fine-Tuning大规模的指令遵循数据优化真实世界行为。训练在随机化的分辨率和帧率下进行这使用户在推理时可以在视觉质量和计算之间进行权衡。Reinforcement Learning (GRPO)使用 GRPO 精炼推理和准确性。一个平滑的长度奖励会修剪不必要的冗长回答而不损害正确性。有趣的是作者报告称从静态图像通过 RLAIF-V 学到的幻觉hallucination减少也可以转移到流式视频场景中。八、基准结果所有基准数据均为作者报告本作者未独立复现。一个紧凑的 9B 模型在基准性能上具有竞争力。8.1 视觉-语言性能Instruct 模式该模型可在 Instruct 或 Thinking 模式下运行下表为 Instruct 模式这种模式更偏好直接回答。BenchmarkGemini 2.5 FlashInternVL 3.5 8BQwen3-VL 8BQwen3-Omni 30B-A3BMiniCPM-o 4.5 9BOpenCompass78.575.876.575.777.6MMBench EN v1.186.679.584.584.987.6MMBench CN v1.186.080.084.784.187.2MathVista75.378.477.275.980.1OCRBench864840896880876OmniDocBench (EN) ↓0.2140.3220.2550.2160.109OmniDocBench (CN) ↓0.2900.4160.3190.3630.162HallusionBench59.154.561.159.763.2Mantis-Eval72.870.574.278.379.7MUIRBench74.555.864.461.972.0技术报告中包含全部 20 项基准的完整表格。性能因任务而异在文档解析、MathVista 和多图像任务上表现强劲但在 MMMU 和 MMVet 上落后。8.2 仅视觉全双工基准结果BenchmarkLiveCC 8BStreamingVLM 8BMiniCPM-o 4.5 9BLiveSports-3K-CC41.545.654.4LiveSports-3K-CC 是一个无音频audio-free基准54.4 是作者报告的相对于 GPT-4o 的胜率win rate不是准确率百分比。它仅验证连续视觉流并不测试本文所述的同时音频输入/语音输出流水线。8.3 单张 NVIDIA RTX 4090 上的本地推理效率ModelDtypeThroughput (tokens/s)First-token LatencyMemory (GB)Qwen3-Omni-30B-A3BBF16OOMOOMOOMMiniCPM-o 4.5BF16154.30.5919Qwen3-Omni-30B-A3BINT4147.80.9820MiniCPM-o 4.5INT4212.30.5811这些数据来自 MiniCPM-o 4.5 技术报告表 11我们未独立复现。注意吞吐量和显存数据是在仅文本输入的条件下测得首 token 延迟使用 64 帧视频输入测量。实践要点在这个仅文本基准上MiniCPM-o 4.5 即使在量化后也能在 12 GB 以下运行而 Qwen3-Omni-30B-A3B 在 INT4 下仍需要 20 GB并且在单张 RTX 4090 上无法以 BF16 运行。对于全双工音视频流显存需求更高见下方常见问题。九、加载 MiniCPM-o 4.5在 GPU 上以 bfloat16 加载该模型并初始化视觉、音频和 TTS。相同实例在下面的所有实验中重复使用。LOCAL_PATH/path/to/your/MiniCPM-o-4_5/snapshot# your local model snapshot folderSAMPLE_RATE16000REF_AUDIO_PATHassets/audio1.wavmodelAutoModel.from_pretrained(LOCAL_PATH,trust_remote_codeTrue,local_files_onlyTrue,attn_implementationsdpa,torch_dtypetorch.bfloat16,init_visionTrue,init_audioTrue,init_ttsTrue,)model.eval().cuda()model.init_tts()ref_audio,_librosa.load(REF_AUDIO_PATH,srSAMPLE_RATE,monoTrue)十、实测我们的实验我们在多个场景中评估了模型以评估其在论文报告结果之外的表现。在运行任何实验之前先将源视频的音频剥离一次这样最终输出只包含模型自己的声音defstrip_video_audio(input_path,output_path):Remove original audio from video so output contains only AI voice.cmd[ffmpeg,-y,-i,input_path,-an,-c:v,copy,output_path]subprocess.run(cmd,checkTrue)# raises CalledProcessError if ffmpeg fails下面的每个测试首先都剥离源视频的音频以便输出仅包含模型生成的语音。10.1 辅助将问题注入到音频流中这些辅助函数手动构建音频块以便我们可以精确控制模型每秒听到的内容。def_inject_question(chunks,q_path,q_sec,total):Overlay a single questions audio onto the chunk list starting at q_sec, overwriting whatever real/background audio was there.qaudio,_librosa.load(q_path,srSAMPLE_RATE,monoTrue)q_chunk_countint(np.ceil(len(qaudio)/SAMPLE_RATE))foriinrange(q_chunk_count):target_chunkq_seciiftarget_chunktotal:breakoffseti*SAMPLE_RATE slice_qaudio[offset:offsetSAMPLE_RATE]iflen(slice_)SAMPLE_RATE:slice_np.pad(slice_,(0,SAMPLE_RATE-len(slice_)))chunks[target_chunk]slice_.astype(np.float32)defbuild_audio_chunks_qa(total,q1_path,q1_sec,q2_pathNone,q2_secNone,base_audio_segmentsNone):# fall back to narrator audio between questions, else silenceifbase_audio_segmentsisnotNoneandlen(base_audio_segments)total:chunks[(base_audio_segments[i].copy()ifbase_audio_segments[i]isnotNoneelsenp.zeros(SAMPLE_RATE,dtypenp.float32))foriinrange(total)]else:chunks[np.zeros(SAMPLE_RATE,dtypenp.float32)for_inrange(total)]_inject_question(chunks,q1_path,q1_sec,total)ifq2_pathisnotNoneandq2_secisnotNone:_inject_question(chunks,q2_path,q2_sec,total)returnchunks10.2 辅助共享流式循环所有实验重复使用相同的核心循环——每次测试仅更改 prompt 和音频块。defrun_mode(model,ref_audio,video_frames,stacked_frames,audio_segments,mode_name,video_for_output,output_path,system_prompt,max_new_speak_tokens_per_chunk20):Streams videoaudio chunk-by-chunk into the model and muxs its speech onto video_for_output.print(fRunning:{mode_name})model_duplexmodel.as_duplex()model_duplex.prepare(prefix_system_promptsystem_prompt,ref_audioref_audio,prompt_wav_pathREF_AUDIO_PATH)results_log,timed_output_audio[],[]forchunk_idxinrange(len(audio_segments)5):# 5 tail chunks to let model finish speakingaudio_chunkaudio_segments[chunk_idx]ifchunk_idxlen(audio_segments)elseNoneframevideo_frames[chunk_idx]ifchunk_idxlen(video_frames)elseNoneframe_list[frame]ifframeisnotNoneelse[]ifframeisnotNoneandstacked_framesandchunk_idxlen(stacked_frames)andstacked_frames[chunk_idx]isnotNone:frame_list.append(stacked_frames[chunk_idx])model_duplex.streaming_prefill(audio_waveformaudio_chunk,frame_listframe_list,max_slice_nums1,batch_vision_feedFalse)resultmodel_duplex.streaming_generate(prompt_wav_pathREF_AUDIO_PATH,max_new_speak_tokens_per_chunkmax_new_speak_tokens_per_chunk,decode_modesampling,)ifresult[audio_waveform]isnotNone:timed_output_audio.append((chunk_idx,result[audio_waveform]))results_log.append(result)print(f[{chunk_idx:03d}s] listening...ifresult[is_listen]elsef[{chunk_idx:03d}s] MODEL:{result[text]})# mux model-generated speech onto the silent videogenerate_duplex_video(video_pathvideo_for_output,output_video_pathoutput_path,results_logresults_log,timed_output_audiotimed_output_audio,output_sample_rate24000)print(fSaved -{output_path})10.3 现场体育解说我们在一个足球点球片段上测试了实时解说功能以观察模型是否能自主充当评论员持续叙述并对动作实时做出反应。VIDEO_PATHassets/football.mp4silent_video_pathinput_silent.mp4strip_video_audio(VIDEO_PATH,silent_video_path)video_frames,audio_segments,stacked_framesget_video_frame_audio_segments(VIDEO_PATH,stack_frames1,use_ffmpegTrue,adjust_audio_lengthTrue)total_chunkslen(video_frames)ifaudio_segmentsisNone:audio_segments[np.zeros(SAMPLE_RATE,dtypenp.float32)for_inrange(total_chunks)]run_mode(model,ref_audio,video_frames,stacked_frames,audio_segments,mode_nameLive Sports Commentary,video_for_outputsilent_video_path,output_pathfootball_commentary.mp4,system_promptYou are a sports commentator watching a live video feed. Speak when something actually happens that is worth commentating on - not every second. When you do speak, keep it to one short sentence. After commentating, go quiet and keep watching until the next notable moment. If nothing new is happening, stay silent.,max_new_speak_tokens_per_chunk30,)输出模型在常规比赛过程中保持沉默仅在值得注释的关键时刻发声符合系统提示中“仅在值得指出的事件发生时进行解说”的指示。minicpm-4-5-sports-commentary10.4 零售监控片段中的行为叙述接下来我们在一个展示手机柜台的零售监控片段上评估模型以判断其是否能超越简单叙述并实时从视觉线索中识别可疑行为模式。VIDEO_PATHassets/theft.mp4# ...same setup as Test 1 (strip_video_audio → get_video_frame_audio_segments)run_mode(model,ref_audio,video_frames,stacked_frames,audio_segments,mode_nameTheft Detection via Behavioral Narration,video_for_outputsilent_video_path,output_paththeft_detection.mp4,system_promptYou are watching a live surveillance feed of a phone display counter. The items on display are iPhones. Describe only what you clearly see happening right now, in one short sentence. Pay close attention to how items are handled - note if someone grabs items quickly or forcefully, handles multiple items in a hurry, or conceals an item in a pocket, bag, or clothing without paying. Use natural, direct language to describe exactly what the person is doing with their hands and where the item ends up. If a person repeatedly takes items and conceals them without paying, clearly state that the person appears to be stealing. If unsure of the exact action, describe it generally instead of guessing. Keep speaking continuously - dont wait for major changes.,max_new_speak_tokens_per_chunk30,)输出模型详细叙述了动作序列——描述有人接近展示柜、迅速拿起多部手机并将其藏匿于衣物中——并且在连续出现多次“拿起并藏匿”行为跨越多个柜台时正确升级为明确表述该人似乎在偷窃。minicpm-o-4-5-theft-detection10.5 烹饪解说 实时问答本实验评估模型是否能以与人相似的方式跟随烹饪视频在观看制作过程的同时监听解说并在不丢失上下文的情况下处理打断。测试 3A仅解说该运行将视频自身的解说音频喂给模型以观察其是否能同步跟随。VIDEO_PATH,REF_AUDIO_PATHassets/cooking.mp4,assets/audio1.wav# ...same setup as Test 1run_mode(model,ref_audio,video_frames,stacked_frames,audio_segments,mode_nameCooking Narration Only,video_for_outputsilent_video_path,output_pathcooking_narration.mp4,system_promptYou are a proactive, real-time commentator narrating a close-up food-preparation video. Describe exactly what is visible on screen at every moment -- the ingredients shown, their colors and textures, and any hand or utensil movement -- cutting, scooping, spreading, drizzling, plating -- as it happens. This video is mostly extreme close-up, slow, deliberate shots -- do NOT wait for big scene changes or obvious cooking techniques like chopping or stirring before speaking. A hand entering the frame, a spoon or knife touching the food, sauce being poured, or the camera holding on a plated dish is enough reason to narrate immediately. If nothing is moving for a moment, describe the appearance of the food in detail (color, texture, garnish, plating) instead of staying silent. Never wait for anything to be said first, and never leave long silent gaps -- always find something visible to comment on. Speak naturally, like a food stylist walking someone through a close-up recipe shot.,max_new_speak_tokens_per_chunk30,)输出模型能够同步地叙述其所见与所闻正确跟随视频的基本流程和旁白的指示。minicpm4-5-cooking-narration测试 3B解说 注入问题该运行在叙述过程中间注入一条额外的问题以观察模型是否能处理打断。注意问题为预先录制并在特定时间戳注入。# Same video_frames/audio_segments as 3A - just swap the audio chunks promptqa_chunksbuild_audio_chunks_qa(total_chunks,assets/q1.m4a,2,q2_pathassets/q2.m4a,q2_sec11,base_audio_segmentsaudio_segments,)run_mode(model,ref_audio,video_frames,stacked_frames,qa_chunks,mode_nameCooking Narration Injected Question,video_for_outputsilent_video_path,output_pathcooking_interruption_qa.mp4,system_promptYou are a precise video question-answering assistant. Watch the video and answer the users question directly based on the visual evidence. CRITICAL INSTRUCTIONS: 1. Provide ONLY the direct, factual answer to the question asked. 2. Use complete, full words (no abbreviations or short-hand). 3. Do NOT include any introductory phrases, explanations, conversational filler, or commentary about other steps in the video. 4. Output the answer and nothing else. 5. Answer after question completion. ,max_new_speak_tokens_per_chunk30,)问题时间戳问题模型回答2s“What fruit is being scooped into the bowl?” (q1.m4a)“Avocado.”11s“What is being toasted in the pan?” (q2.m4a)“Bread.”输出模型正确识别了被注入的问题并使用正在进行的视觉与音频上下文直接回答了问题。minicpm-o-4-5-cooking-qa10.6 语音克隆在此测试中我们使用了一个简单的提示并替换不同的参考语音片段以观察模型在实时语音生成时匹配每个参考的程度。VIDEO_PATHassets/vid.mp4REF_AUDIO_PATHassets/audio1.wavvideo_frames,audio_segments,stacked_framesget_video_frame_audio_segments(VIDEO_PATH,stack_frames1,use_ffmpegFalse,adjust_audio_lengthTrue)# set use_ffmpegFalse as this video has no audio rest same setup as Test 1ref_audio,_librosa.load(REF_AUDIO_PATH,srSAMPLE_RATE,monoTrue)run_mode(model,ref_audio,video_frames,stacked_frames,audio_segments,mode_nameVoice Cloning - Reference Voice 1,video_for_outputsilent_video_path,output_pathaudio1.mp4,system_promptYou are a proactive, real-time commentator. Continuously describe the scene as it happens.,max_new_speak_tokens_per_chunk20,)# repeat with REF_AUDIO_PATHassets/audio2.wav, output_pathaudio2_test.mp4使用的参考语音输出视频在非正式的听感评估中克隆的语音在短样本内与每个参考保持可识别的相似性流式过程中没有回退到默认声音我们未进行正式的相似度度量。minicpm-o-4-5-voice-cloningminicpm-o-4-5-voice-cloning注意上面剪辑中的字幕经过了重新同步、略微提前并做了轻度样式调整以提高可读性这只是展示时的视觉调整并未更改模型的实际输出。十一、 发现主动proactive与被动reactive模式均按设计工作。在解说模式体育、盗窃检测中模型无需提示即可持续发声。在问答模式中它大体保持沉默仅在被称及或发生显著事件时发声。行为叙述在模式清晰时会升级为判断性表述。在盗窃检测测试中模型不仅描述孤立动作它追踪跨多个柜台的模式快速抓取、反复藏匿且未付款并正确地从中性描述升级为明确表示该人似乎在偷窃。可以正确处理打断。当在烹饪测试中间注入问题时模型暂停、直接回答然后恢复正常跟踪视频。语音克隆稳定。克隆的语音在整个过程中保持与参考片段的音色一致没有回退到默认声音。叙述可靠但仍停留在表面。在同步的烹饪叙述测试中模型可靠地跟随视觉步骤和旁白音频但不会主动揭示跳过的细节例如配料用量或时间提示这与论文中指出的该第一版本的主动行为仍然有限一致。十二、总结MiniCPM-o 4.5 是朝着让 AI 更像真实对话伙伴而非聊天机器人的一个有意义的进步。Omni-Flow将视觉、音频与文本在同一共享时间线上对齐的想法概念简单但在实践中有效。作者指出在长时间会话中语音偶尔会发音错误或混合语言且主动行为尚属初级这对于第一版 full-duplex 交互规模的模型是可以预期的限制。但作为一个小型、开放且高效的模型能够在消费级硬件上同时看、听和说它对实时计算机视觉与多模态应用确实是一个切实可用的进展。模型权重、代码和 llama.cpp-omni 部署框架均为完全开源随时可试。十三、常见问题Q:MiniCPM-o 4.5 是否支持英语和中文以外的语言的全双工full-duplex流式A:实时语音交互官方仅支持英语和中文。视觉和文本理解覆盖 30 种语言但我们并未测试其他语言下的实时语音。Q:运行它最低需要什么 GPU/显存A:要求取决于框架PyTorch 演示需要约 28 GB而 llama.cpp-omni 的全双工模式可在 ≥12 GB 的 NVIDIA GPU 或具有 24 GB 统一内存的 M4 Max Mac 上运行。是量化而不是其他手段将显存需求压低。Q:可以对 MiniCPM-o 4.5 进行微调吗A:LLaMA-Factory 和 SWIFT 支持用于多模态领域适配的监督和 LoRA 微调但公开的操作流程并未复现用于主动全双工行为的完整时间对齐 Omni-Flow 流程。那种主动行为是在原始时间对齐训练期间学到的目前没有公开工具可复制这一点。Q:我可以更改或克隆模型的实时语音输出声音吗A:可以通过原生的零样本zero-shot语音克隆。在推理时将参考音频片段直接传入系统提示语音解码器会自动匹配其实时合成的风格和声音特征以模仿目标说话者。Q:模型如何精确决定何时说话或倾听A:它使用 Listen-SpeakLS控制机制。在每个 1 秒时间块的绝对开始模型生成一个单一的二元控制 token。这个 token 起到架构级的开关作用告诉系统要么保持静默并缓存环境音频要么开始流式输出语音 token。参考文献MiniCPM-o 4.5: Towards Real-Time Full-Duplex Omni-Modal Interaction. 2026. arXiv.org/abs/2604.27393MiniCPM-o 4.5 代码仓库。GitHub。github.com/OpenBMB/MiniCPM-VMiniCPM-o 4.5 模型权重。Hugging Face。huggingface.co/openbmb/MiniCPM-o-4_5MiniCPM-o 4.5 在线演示。minicpmo45.modelbest.cn/
返回列表