ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

vllm-omni 离线推理实战:基于 AURA Omni 管线的端到端语音-视频交互推理

vllm-omni 离线推理实战:基于 AURA Omni 管线的端到端语音-视频交互推理 vllm-omni 离线推理实战基于 AURA Omni 管线的端到端语音-视频交互推理【免费下载链接】vllm-omniA framework for efficient model inference with omni-modality models项目地址: https://gitcode.com/GitHub_Trending/vl/vllm-omni导读AURA Omni 是 vllm-omni 支持的一种原生多阶段 Omni 管线以「语音识别 → 视觉-语言理解 → 语音合成」的链路实现端到端的说话人交互推理。本文基于仓库中的离线推理示例 examples/offline_inference/aura_omni/README.md结合示例脚本、部署配置与阶段输入处理器源码完整讲解 AURA Omni 的架构组成、运行方式、全部命令行参数、Base / CustomVoice 两种 TTS 音色模式以及分阶段显存分配建议帮助你在本地一键复现并深度理解这条多阶段推理管线。AURA Omni 管线架构四个阶段一条语义依赖链AURA Omni 采用原生native的多阶段管线结构官方 README 给出的核心链路为Qwen3-ASR - AURA/Qwen3-VL - Qwen3-TTS Talker - Qwen3-TTS Code2Wav四个阶段各司其职Stage 0Qwen3-ASR消费输入的语音输出文本转写transcript。示例配置使用Qwen/Qwen3-ASR-1.7B负责把音频转换为可被下游理解的文字。Stage 1AURA / Qwen3-VL将 ASR 转写文本与原始请求中的视频帧video frames拼接进行视觉-语言联合理解输出回复文本或特殊标记|silent|表示无需回复的静默。Stage 2Qwen3-TTS Talker把 AURA 阶段生成的非静默回复以文本或 token id 形式转换为 TTS 说话人talker语义层。Stage 3Qwen3-TTS Code2Wav将 talker 产出的语音 code 解码为可播放的 WAV 音频。从源码层面看这条链路被注册为名为aura_omni的管线见 vllm_omni/config/pipeline_registry.pyaura_omni: AURA_OMNI_PIPELINE。部署配置文件 vllm_omni/deploy/aura_omni.yaml 中明确指出AURA has a semantic ASR - AURA - TTS dependency. Do not prewarm downstream stages before AURA text is converted into Qwen3-TTS metadata byaura2tts.也就是说这条管线存在强语义依赖下游阶段必须等待 AURA 阶段输出文本并完成到 Qwen3-TTS 元数据的转换之后才能预热启动因此配置中显式设置了async_chunk: false不做异步分块预取这是理解该管线调度行为的关键点。快速运行一条命令完成端到端推理仓库提供了开箱即用的脚本 examples/offline_inference/aura_omni/run_single_prompt.sh内容如下#!/usr/bin/env bash set -euo pipefail python end2end.py \ --model aurateam/AURA \ --deploy-config vllm_omni/deploy/aura_omni.yaml \ --modalities text,audio \ $在示例目录下直接执行cd examples/offline_inference/aura_omni bash run_single_prompt.sh脚本默认从仓库内置的媒体资产AudioAsset(mary_had_lamb)与VideoAsset(baby_reading)见 examples/offline_inference/aura_omni/end2end.py加载一段音频和视频以text,audio作为最终输出模态跑完整个 AURA Omni 四阶段管线并把生成的文本与音频写入输出目录默认output_aura_omni。使用本地媒体文件如果不使用内置资产可以通过--audio-path与--video-path指定本地媒体python end2end.py \ --audio-path /path/to/input.wav \ --video-path /path/to/video.mp4 \ --modalities text,audio其中--modalities用逗号分隔指定最终输出模态默认text,audio示例脚本会将该值写入每个 prompt 的modalities字段见 end2end.py。理解示例入口脚本请求构造与采样参数离线示例的入口是 end2end.py它完整展示了多阶段推理的请求构造方式值得逐段剖析。请求构造build_query请求 prompt 采用 Qwen 的 chat 模板格式以音频占位符|audio_start||audio_pad||audio_end|标注语音位置并附带任务指令prompt ( |im_start|user\n |audio_start||audio_pad||audio_end| Please transcribe this speech and use the video context to decide whether a reply is needed.|im_end|\n |im_start|assistant\n )同时通过multi_modal_data携带音频与视频帧通过additional_information透传 AURA 系统提示词与全部 TTS 相关参数task type、language、speaker、instruct、ref audio/text、x-vector-only、是否直传 token ids并设置limit_mm_per_prompt{audio: 1, video: 1}限制每个 prompt 的多模态输入数量见 end2end.py。每阶段采样参数build_sampling_params四个阶段使用完全不同的采样策略体现了「ASR 确定性、AURA 适度随机、TTS 解码器长输出」的设计见 end2end.py阶段采样参数要点设计意图Stage 0ASRtemperature0.0, top_p1.0, max_tokens256, detokenizeTrue转写需要确定性贪婪解码Stage 1AURAtemperature0.5, top_p1.0, max_tokens256, repetition_penalty1.0语言生成保留一定多样性Stage 2Talkertemperature0.9, top_k50, max_tokens4096, detokenizeFalse, repetition_penalty1.05, stop_token_ids[2150]语音语义码生成不反 tokenize遇到终止 id 2150 停止Stage 3Code2Wavtemperature0.0, max_tokens65536语音 codec 解码长输出、确定性注意sampling_params_list会按omni.num_stages截断见 end2end.py因此采样参数列表始终与运行时实际阶段数严格对应。结果落盘save_stage_output结果按final_output_type区分处理见 end2end.py文本输出写入{request_id}.txt音频输出从outputs[0].multimodal_output[audio]取出音频可能为列表需拼接展平采样率取自mm.get(sr, 24000)默认 24kHz用soundfile写入{request_id}.wav。深入管线内部asr2aura 与 aura2tts 阶段处理器AURA Omni 的阶段间数据流转由 vllm_omni/model_executor/stage_input_processors/aura_omni.py 实现这是理解整个管线语义的核心源码。asr2aura转写文本 视觉帧 → AURA promptasr2aura见 aura_omni.py负责将 ASR 输出转换为 AURA/Qwen3-VL 的输入从原始 prompt 中按request_id找回对应的additional_information读取aura_system_prompt缺省时使用模块级常量DEFAULT_AURA_SYSTEM_PROMPT提取 ASR 转写文本兼容cumulative_text、text、multimodal_output中的text/transcript/asr_text等字段见_extract_text从原始请求的multi_modal_data或deferred_multi_modal_data中取出视觉载荷仅保留image/video键并据此生成|vision_start||video_pad||vision_end|或 image 占位符_vision_placeholder最终拼装出system user视觉占位符 转写文本 assistant三段式 prompt_aura_prompt。系统提示词默认值为与示例脚本--aura-system-prompt默认值一致You are receiving a live video stream where the final frame is the present moment. Respond only when a response is needed. Otherwise output |silent|. Respond in Chinese.aura2ttsAURA 回复 → Qwen3-TTS Talker 请求aura2tts见 aura_omni.py把 AURA 文本输出转换成 Qwen3-TTS Talker 的OmniTokensPrompt静默过滤文本为空或等于|silent|模块常量SILENT_TEXT时直接跳过该请求不再进入 TTS 阶段Base 模式要求提供tts_ref_audio与tts_ref_text缺失时抛出ValueError并透传x_vector_only_mode参考音频的 ref_code 长度可通过_estimate_ref_code_len_from_ref_audio估算12Hz 模型下约每 1920 个 24kHz 采样对应一个 codec 帧即ceil(时长秒 * 12.5)CustomVoice 模式将tts_speaker规范化为「首字母大写、其余小写」_normalize_qwen3_tts_speaker如vivian→Vivian默认说话人为Viviantoken 直传当tts_pass_token_ids开启时通过_qwen3_tts_assistant_token_ids_from_aura把 AURA 的 assistant token ids去除|im_start|assistant\n前缀、截断到|im_end|、清理尾部特殊 token重新包装成 Qwen3-TTS 的 assistant 序列并放入PRECOMPUTED_TEXT_IDS_KEY否则走文本路线tts_info[text]prefill 长度估计_estimate_tts_prompt_len_from_token_ids按 Base / CustomVoice 与 streaming / non-streaming 的不同结构估算 Talker prefill 长度用于在无 tokenizer 的情况下生成prompt_token_ids[0] * prompt_len的占位 prompt。从源码结构可以看出aura2tts是这条管线的「语义枢纽」它决定了静默时如何短路、文本如何转语音、以及两个 TTS 子阶段如何衔接理解它即可理解 AURA Omni 整条链路的控制流。命令行参数全解end2end.py示例脚本通过FlexibleArgumentParser提供完整参数见 end2end.py核心参数如下参数默认值说明--modelaurateam/AURA顶层模型名/路径各阶段实际模型由部署配置覆盖--deploy-configvllm_omni/deploy/aura_omni.yamlAURA Omni 部署配置多阶段--audio-path, -aNone本地音频文件缺省用内置资产mary_had_lamb--video-path, -vNone本地视频文件缺省用内置资产baby_reading--num-frames16视频采样帧数--sampling-rate16000ASR 输入音频采样率Hz--num-prompts1重复执行的 prompt 数量批量压测--modalitiestext,audio逗号分隔的最终输出模态--output-diroutput_aura_omni生成文件输出目录文本与音频均写入此处--aura-system-prompt见上文默认值AURA 阶段系统提示词--tts-task-typeBase可选CustomVoiceQwen3-TTS 任务类型--tts-languageChineseQwen3-TTS 语言--tts-speakerVivianQwen3-TTS 说话人CustomVoice 模式--tts-instruct可选的 Qwen3-TTS 风格指令--tts-ref-audio内置clone_2.wav绝对路径Base 模式参考音频路径/URL--tts-ref-textDEFAULT_QWEN3_TTS_REF_TEXTBase 模式参考音频对应文本--tts-x-vector-only-modeFalseflag仅用说话人 embedding禁用 ICL ref_text 条件化--tts-pass-token-idsFalseflag将 AURA 生成的 assistant token ids 直传 Qwen3-TTS默认传文本--init-timeout2000整体初始化超时秒--stage-init-timeout2000每阶段初始化超时秒--log-statsFalse开启统计日志其中--tts-ref-audio的默认值由default_qwen3_tts_ref_audio_path()计算优先返回仓库内置资产tests/assets/qwen3_tts/clone_2.wav的绝对路径找不到时回退到常量默认路径见 aura_omni.py--tts-ref-text的默认文本为Okay. Yeah. I resent you. I love you. I respect you. But you know what? You blew it! And thanks to you.音色模式Base 声音克隆与 CustomVoice示例 README 明确指出Base 声音克隆voice clone模式是默认模式它使用 AURA 参考音频来克隆音色除非你用参数覆盖它。Base 模式默认python end2end.py \ --tts-task-type Base \ --tts-ref-audio /data/yrr/rein_test/shuhan.mp3 \ --tts-x-vector-only-mode通过--tts-ref-audio指定参考音频--tts-ref-text指定其对应文本TTS 将基于参考音频克隆音色并朗读 AURA 生成的回复--tts-x-vector-only-mode开启后仅使用说话人 embeddingx-vector禁用基于参考文本的 ICLin-context learning条件化推理更轻量从源码看Base 模式若缺少tts_ref_audio或tts_ref_text会直接抛错见 aura_omni.py因此自定义参考音频时必须同时配套参考文本。CustomVoice 模式CustomVoice 模式不使用参考音频而是按说话人名字进行音色定制。使用前必须把部署配置vllm_omni/deploy/aura_omni.yaml中的 Stage 2 与 Stage 3 指向一个 Qwen3-TTS CustomVoice 检查点python end2end.py \ --tts-task-type CustomVoice \ --tts-speaker Vivian在默认部署配置 vllm_omni/deploy/aura_omni.yaml 中Stage 2 与 Stage 3 的model默认即为Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice注释掉的Qwen/Qwen3-TTS-12Hz-1.7B-Base可供切换与--tts-task-type CustomVoice的用法相互印证。使用本地检查点若要使用本地检查点有两种方式直接编辑vllm_omni/deploy/aura_omni.yaml中各 stage 的model条目复制一份部署配置修改后通过--deploy-config传入python end2end.py \ --deploy-config /path/to/your_aura_omni.yaml \ --tts-task-type CustomVoice部署配置顶部注释同样说明--model可指向任意本地占位仓库因为每个 stage 会用自己的model覆盖见 aura_omni.yaml。部署配置解析与 GPU 显存分配建议aura_omni.yaml 四阶段配置完整部署配置位于 vllm_omni/deploy/aura_omni.yaml关键字段如下pipeline: aura_omni async_chunk: false connectors: connector_of_shared_memory: name: SharedMemoryConnector extra: codec_streaming: true connector_get_sleep_s: 0.01 connector_get_max_wait_first_chunk: 3000 connector_get_max_wait: 300 codec_chunk_frames: 25 codec_left_context_frames: 72 initial_codec_chunk_frames: 1 decode_cudagraph_capture_sizes: [25, 73, 97, 169, 325] stages: - stage_id: 0 # Qwen3-ASR-1.7B max_num_seqs: 8 gpu_memory_utilization: 0.1 max_model_len: 8192 max_num_batched_tokens: 4096 devices: 0 model: Qwen/Qwen3-ASR-1.7B default_sampling_params: temperature: 0.0 max_tokens: 256 - stage_id: 1 # aurateam/AURA max_num_seqs: 4 gpu_memory_utilization: 0.4 max_model_len: 262144 max_num_batched_tokens: 15360 devices: 0 model: aurateam/AURA default_sampling_params: temperature: 0.5 max_tokens: 256 - stage_id: 2 # Qwen3-TTS Talker gpu_memory_utilization: 0.2 max_num_batched_tokens: 512 max_model_len: 4096 output_connectors: to_stage_3: connector_of_shared_memory model: Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice subtalker_sampling_params: do_sample: true temperature: 0.9 top_k: 50 - stage_id: 3 # Qwen3-TTS Code2Wav gpu_memory_utilization: 0.2 max_num_batched_tokens: 65536 max_model_len: 65536 input_connectors: from_stage_2: connector_of_shared_memory model: Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice default_sampling_params: temperature: 0.0 max_tokens: 65536 platforms: npu: stages: - stage_id: 2 enforce_eager: true几个值得注意的实现细节阶段间通信Stage 2 通过output_connectors.to_stage_3指向共享内存连接器Stage 3 通过input_connectors.from_stage_2接收二者配对使用同一个connector_of_shared_memorycodec_streaming: true与分块参数codec_chunk_frames: 25、codec_left_context_frames: 72、initial_codec_chunk_frames: 1表明 Code2Wav 以流式分块方式消费语音 code。prefix caching 差异Stage 0/1 开启enable_prefix_caching而 Stage 2/3TTS 阶段关闭因为 TTS 输入以语音 code 为主前缀缓存收益有限。平台差异platforms.npu.stages中为 Stage 2 指定了enforce_eager: true说明在 NPU 平台上 Talker 阶段默认使用 eager 模式不做 CUDA Graph 捕获这是平台相关的优化开关。采样参数分层Stage 2 同时有default_sampling_params与subtalker_sampling_paramsdo_sample: true说明 Talker 阶段内部存在子说话人采样路径。GPU 显存分配建议README 建议按阶段分别设置gpu_memory_utilization起始推荐值如下阶段模型推荐gpu_memory_utilizationStage 0Qwen3-ASR0.10Stage 1AURAQwen3-VL0.4Stage 2Qwen3-TTS Talker0.20Stage 3Qwen3-TTS Code2Wav0.20这些值已经写入默认部署配置Stage 0/1/2/3 分别对应0.1 / 0.4 / 0.2 / 0.2。分配逻辑很直观AURA 视觉-语言阶段上下文最长max_model_len: 262144且语义理解最重因此获得最多显存ASR 与两个 TTS 阶段相对轻量各分配约 0.1~0.2。注意各阶段默认都部署在同一张 GPUdevices: 0上实际部署时应根据可用显存总量按比例调整避免 OOM。常见问题与调优要点静默输出当 AURA 判断无需回复时会输出|silent|aura2tts会跳过该请求因此最终输出目录中只有非静默请求的音频文件这是设计行为而非异常。Base 模式必须提供参考音频与参考文本否则aura2tts抛ValueError(AURA Base TTS requires tts_ref_audio and tts_ref_text.)。CustomVoice 模式务必切换检查点仅传--tts-task-type CustomVoice而 Stage 2/3 仍是 Base 检查点时无法生效需按上文方式编辑vllm_omni/deploy/aura_omni.yaml或使用--deploy-config传入修改后的配置。输出目录生成的文本与音频统一写入--output-dir默认output_aura_omni文本为{request_id}.txt音频为{request_id}.wav默认 24kHz 采样率。显存不足按阶段调低gpu_memory_utilization或把不同阶段分配到不同devices可结合部署配置的max_model_len/max_num_batched_tokens一起压缩显存占用。延伸阅读部署配置模板vllm_omni/deploy/aura_omni.yaml离线推理示例脚本examples/offline_inference/aura_omni/end2end.py阶段输入处理器核心控制流vllm_omni/model_executor/stage_input_processors/aura_omni.py管线注册表vllm_omni/config/pipeline_registry.py相关单元测试tests/model_executor/stage_input_processors/test_aura_omni.py 与 tests/model_executor/models/test_aura_qwen3_vl.py可用于验证asr2aura/aura2tts的行为与 AURA Qwen3-VL 模型的实现细节。【免费下载链接】vllm-omniA framework for efficient model inference with omni-modality models项目地址: https://gitcode.com/GitHub_Trending/vl/vllm-omni创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表