用一句语音驱动实时虚拟试衣Vision Agents Decart Lucy 换装语音智能体完整指南【免费下载链接】Vision-AgentsOpen Vision Agents by Stream. Build voice and vision agents quickly with any model or video provider. Uses Streams edge network for ultra-low latency.项目地址: https://gitcode.com/GitHub_Trending/vi/Vision-Agents在 Vision-Agents 框架里把 Decart 的 Lucy 实时模型接进一个语音智能体就能搭出一套实时虚拟试衣系统你对着摄像头说给我换一套超级英雄服装几帧之后画面里的人就穿上了对应造型助手还会用带情绪的嗓音把变化念出来。它不靠截图、不离线渲染而是边通话边逐帧重绘。下面拆开这套换装语音智能体是怎么拼出来的。五分钟跑起来这个示例在 plugins/decart/example/用 uv 管依赖。跑通它需要三件事装依赖、配钥匙、执行入口。前置条件Python 3.10 及以上示例与插件的pyproject.toml都声明了requires-python 3.10。六把 API 钥匙分别对应链路里的五个角色OPENAI_API_KEY意图理解选哪个 toolDECART_API_KEY视频实时重绘ELEVENLABS_API_KEY文本转语音DEEPGRAM_API_KEY语音转文本STREAM_API_KEYSTREAM_API_SECRET音视频低延迟传输底座装依赖cd plugins/decart/example uv sync它一次拉齐vision-agents加 openai / decart / elevenlabs / getstream / deepgram 五个插件包。若你要在自己的项目里单独用这个插件装法是uv add vision-agents[decart] # 或直接装插件包 uv add vision-agents-plugins-decart插件本身依赖官方 SDKdecart0.0.34,0.0.36底层走 WebSocket 和 Decart Realtime API 通信。配钥匙在 example 目录放一个.env把上面六行KEY值填进去。代码开头一句load_dotenv()会把它读进来。DECART_API_KEY也可以直接写进构造函数RestylingProcessor(api_key...)两种方式留其一即可。启动uv run decart_example.py run入口是Runner(AgentLauncher(create_agentcreate_agent, join_calljoin_call)).cli()。启动后它会建一路视频通话、在浏览器打开演示界面、把智能体拉进会里先念一句问候然后进入持续待命状态等你开口。一句话如何变成一身新衣服先看数据流再挑几个关键类下钻。一次换装请求经过的完整路径是拾音转文本你说的话由 Deepgram STT 变成文字。意图判断OpenAI GPT-5 读完对话决定该调change_costume预设服装还是change_outfit自由描述。原子换装选中的 tool 去调处理器的update_state(prompt..., image...)提示词和参考图一起下发给 Lucy。逐帧重绘lucy_2_rt模型把用户视频流重新装扮新帧经DecartVideoTrack发布回通话。播报收尾ElevenLabs TTS 用一句短话把换好了念出来。语音、意图、重绘、播报四步各司其职真正的魔法集中在处理器这一环。点状深潜一RestylingProcessor 与原子换装RestylingProcessor 属于VideoProcessorPublisher类型——既吃进用户的入向视频轨又把重绘后的轨发回通话。它提供两个对外方法是换装的全部出口await processor.update_state(promptA person wearing a superhero costume, imagehttps://.../superhero.png) # 提示词 参考图一次下发 await processor.update_prompt(a wizard robe) # 只改提示词update_state对应 JS SDK 的realtimeClient.set({ prompt, enhance, image })。这里的原子是关键提示词和参考图在同一次更新里同时生效输出视频不会出现换到一半的中间态。约束和行为如下——prompt和image至少给一个两者都空会抛ValueError(At least one of prompt or image must be provided)。enhance是否增强提示词不显式传时回落到实例的enhance属性默认True。更新成功后会同步记回initial_prompt/initial_image方便后续状态追踪。还没连上 Decart 时调用是 no-op只打一条 debug 日志不会崩。update_prompt只是update_state(prompt..., enhance...)的快捷方式没有额外逻辑。点状深潜二两个 tool 的分工预设走change_costume命不中再落change_outfit。前者查COSTUMES字典命中就原子换装没命中把可用列表回给 LLM后者看有没有参考图 URL——有就update_state没有就退化成纯提示词update_promptllm.register_function(descriptionPut the user in one of the pre-defined costumes.) async def change_costume(name: str) - str: costume COSTUMES.get(name.lower()) if costume is None: return fUnknown costume {name}. Available: {, .join(COSTUMES)}. await processor.update_state(promptcostume[prompt], imagecostume[image]) return fCostume changed to {name}. llm.register_function(descriptionChange the users outfit to a freeform description.) async def change_outfit(description: str, image_url: str) - str: if image_url: await processor.update_state(promptdescription, imageimage_url) else: await processor.update_prompt(description) return fOutfit changed: {description}COSTUMES就是预设库示例里预置了jacket和superhero两条每条含一个prompt和一张可选的image。image为None时只靠提示词驱动风格化。点状深潜三DecartVideoTrack 的帧管线重绘回来的帧不是直接推给通话的中间隔着一个DecartVideoTrack。它用VideoLatestNQueue(maxlen2)只留最新两帧进来的帧尺寸和配置不符时先resize_frame统一到设定的width/height默认 1280×720。recv()在 0.033 秒内没拿到新帧时会回退到一张深色占位帧RGB 30,30,40保证输出轨始终有帧可读、不卡死通话。连接触发点也很克制process_video每收到一路新视频轨就会保存它并触发与 Decart 的连接但用_connecting/_connected标志加asyncio.Lock挡重入避免重复建连。配置速查RestylingProcessor构造函数可调项一览参数默认值说明api_key读环境变量DECART_API_KEYDecart 钥匙两者皆无则抛ValueErrormodellucy_2_rtDecart 实时模型名initial_promptCyberpunk city初始风格提示词initial_imageNone初始参考图见下方支持格式enhanceTrue是否增强提示词mirrorTrue前置摄像头镜像模式width/height1280/720输出分辨率模型偏好值update_state和update_prompt另有一个可选enhance入参可在单次调用时临时覆盖实例默认值。参考图支持五种输入形式initial_image与update_state(image...)通用bytes原始字节、本地文件路径如./costumes/superhero.png、http(s) URL、data:URI、原始 base64 字符串。让第一帧就穿好衣服把参考图传给initial_image首次连接时它随ModelState一起发给 Decart用户一入会画面就已经是重绘后的造型不用等第一句指令。processor decart.RestylingProcessor( modellucy_2_rt, initial_promptA person wearing a superhero costume, initial_image./costumes/superhero.png, )增删预设直接改COSTUMES字典每条必须有promptimage可省。换音色改elevenlabs.TTS(voice_id...)里的voice_id即可。instructions里还要求每次变换后用一句短话口头播报并允许嵌入[sigh]、[excited]、[pause]、[rushed]、[tired]等音频标签增强表现力。排错与 FAQ如果update_state两个参数都传None会怎样抛ValueError错误信息直接点名至少要提供prompt或image之一。这是唯一会被主动抛出的参数校验。如果还没连上 Decart 就调update_state不报错、不建连是个 no-op只留一条 debug 日志。等连接建立后你再调才会真正生效所以别指望它替你预热。如果 WebSocket 断了会自动重连吗会。连接丢失分两条路兜底_processing_loop每秒自检一次发现断了就重连_on_error拿到错误后按_should_reconnect判定——WebSocket 关闭、或 SDK 错误信息里含connection/disconnect/timeout时触发重连。但认证类错误比如 invalid api key不重连重连也没用。如果 API key 填错会怎样DECART_API_KEY缺失且没传api_key时构造函数直接抛ValueErrorkey 存在但无效属于认证错误处理器不会陷入无意义的重连循环。如果用户要的服装不在预设列表里change_costume查不到会返回可用列表给 LLM由它转投change_outfit走自由换装链路不会中断。如果输出帧尺寸和配置不一致DecartVideoTrack自动resize_frame到设定分辨率不需要你手动对齐。仓库自带测试覆盖上述行为契约可作为排错时的参照test_decart_restyling.py连接触发、防重入、原子更新、no-op、参数校验、初始参考图传递、自动重连、错误分类和 test_decart_video_track.py尺寸、入队、缩放、占位帧回退。延伸方向只做动态风格切换如果不需要参考图丢掉image参数、全程只用update_prompt就能把这套换装智能体简化成一个纯文字驱动的实时风格滤镜。横向对照其他示例本例和仓库里的 golf coach、security camera 等示例共用同一套 Agent / Runner / 插件体系把processors换成别的处理器就能换成不同场景装配方式完全一致。换用实时 LLM示例用 GPT-5 做意图判断你也可以换成框架支持的 Realtime 模型把理解—决策—播报压进更短的往返延迟里。更多插件用法看 plugins/decart/ 的 README其余语音/视觉示例在 examples/ 下逐个可跑。【免费下载链接】Vision-AgentsOpen Vision Agents by Stream. Build voice and vision agents quickly with any model or video provider. Uses Streams edge network for ultra-low latency.项目地址: https://gitcode.com/GitHub_Trending/vi/Vision-Agents创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考