news 2026/9/17 23:24:48

vLLM-Omni 中 Ming-omni-tts 密集 0.5B 离线推理实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
vLLM-Omni 中 Ming-omni-tts 密集 0.5B 离线推理实战指南

vLLM-Omni 中 Ming-omni-tts 密集 0.5B 离线推理实战指南

【免费下载链接】vllm-omniA framework for efficient model inference with omni-modality models项目地址: https://gitcode.com/GitHub_Trending/vl/vllm-omni

本文以 vLLM-Omni 仓库内置的 Ming 密集 0.5B 离线推理示例为主线,系统讲解如何通过end2end.py驱动两阶段 TTS 流水线,覆盖 11 种内置用例(风格合成、零样本克隆、播客多说话人生成、BGM 音乐生成、文本转音频事件等)的完整配置与运行方式。读完本文,你将掌握 Ming-omni-tts 的提示词组装原理、ming_tts.yaml部署配置的每个字段含义、阻塞/异步流式两种执行路径的差异,以及如何产出 WAV 音频、统计日志与运行清单(manifest)。

示例概览:一条命令跑通端到端 Ming 语音合成

examples/offline_inference/text_to_speech/ming_tts/目录下的示例与仓库其余 TTS 示例(如 qwen3_tts、cosyvoice3)不同:它直接复用仓库内的 Ming prompt 组装辅助函数build_ming_dense_prompt),而不是示例自带的简化封装,因此请求结构与真实集成路径完全一致。该目录共包含三个文件:

文件用途
end2end.py驱动脚本:CLI 参数解析、用例加载、提示词构造、整体编排(约 150 行)
cases.yaml全部 11 个内置用例定义(prompt、text、instruction、参考音频标志、流程控制项)
runner.py引擎管理与音频输出(流式 + 阻塞两条路径)

从入口脚本可以看到整体执行链路:解析参数 → 用AutoTokenizer.from_pretrained加载分词器 →_build_prompt_payload组装提示词 →build_sampling_params构造两阶段采样参数 →run_generation分发到阻塞或流式路径 → 写 WAV 文件 → 可选写出 manifest JSON。

模型与两阶段流水线架构

Ming dense 0.5B(默认模型为inclusionAI/Ming-omni-tts-0.5B)在本示例中被组织为两阶段离线流水线

  • Stage 0:基于 Qwen2 的自回归(AR)生成,带 Ming prompt 格式与内联流程控制
  • Stage 1:音频 VAE 解码,输出单声道 44.1 kHz波形

config_ming_tts.py负责将检查点的 HuggingFace 配置字段(LLM、DiT、聚合器、AudioVAE、token id)适配为 vLLM-Omni 可用的扁平配置。从config_ming_tts.py 可以看到MingTTSConfig会读取llm_configditar_configaggregator_configaudio_tokenizer_config四个子配置,并根据 Stage-0 LLM 骨干家族自动判定变体:dense(Qwen2)或 moe(bailing_moe);model_type="dense"的 HuggingFace 兼容性保留在MingDenseConfig中。

关键架构常量(来自 constants.py):

常量含义
SAMPLE_RATE44100输出采样率(Hz)
AUDIO_FRAME_HOP882AudioVAE 编码帧 hop
LATENT_DIM64音频 latent 维度
PATCH_SIZE/VAE_PATCH_SIZE4 / 4AR patch 与 VAE patch 尺寸
HISTORY_PATCH_SIZE32历史 patch 窗口
SPEAKER_EMBEDDING_DIM192CampPlus 说话人嵌入维度
LLM_HIDDEN_SIZE896Stage-0 LLM 隐藏层宽度
DEFAULT_CFG/DEFAULT_SIGMA/DEFAULT_TEMPERATURE2.0 / 0.25 / 0.0FlowLoss 采样默认值

部署配置vllm_omni/deploy/ming_tts.yaml

vllm_omni/deploy/ming_tts.yaml 是示例唯一的部署配置文件,它选择 vLLM-Omni 流水线与阶段运行时拓扑(连接器、异步分块、内存限制、采样默认值),同时支持两种执行模式:阻塞 eagerasync_chunk: false语义下的阻塞路径)与异步分块 eager(默认async_chunk: true)。核心字段解读:

  • pipeline: ming_tts:HF config 报告model_type="dense"且无architectures,自动探测会失效,此键直接路由到正确的流水线注册项(见StageConfigFactory.create_from_model的 deploy-config 探测逻辑);
  • async_chunk: true:默认开启异步分块流式传输;
  • dtype: bfloat16:全流水线使用 bf16 精度;
  • connectors.connector_of_shared_memorySharedMemoryConnectorlatent_chunk_size: 25initial_latent_chunk_size: 4latent_left_context: 0,负责 Stage 0 → Stage 1 的 latent 分块搬运;
  • stages[0]max_num_seqs: 1gpu_memory_utilization: 0.45max_model_len: 8192devices: "0",默认采样temperature: 0.0 / top_p: 1.0 / top_k: -1 / max_tokens: 512 / detokenize: true
  • stages[1]gpu_memory_utilization: 0.25max_tokens: 1detokenize: false(纯解码不反 tokenize)。

环境准备与依赖

按平台要求安装 vLLM-Omni:

uv pip install -e .

Ming 离线示例不要求单独安装上游 Ming 包。参考音频用例复用仓库依赖完成音频加载、重采样与 CampPlus 说话人提取,在文档记录的 ROCm 环境中包括soundfiletorchaudioonnxruntime-rocm。测试环境的完整摘要见仓库配方 recipes/inclusionAI/Ming-omni-tts.md(其中记录了 1×AMD MI300X / ROCm 7.2 与 1×H100 / CUDA 13.0 两种已验证环境的软件版本、Docker 镜像与启动命令)。

11 种内置用例详解

cases.yaml覆盖了上游 dense 0.5B cookbook 中可干净映射到当前示例的全部面,每个用例由prompt(系统提示前缀)、text(生成文本)、instruction(Ming 指令,可为字符串或结构化 dict)、max_decode_steps(最大解码步数)以及若干流程控制字段组成。以下按零说话人与参考音频两类展开:

用例类型说明参考输入
style零说话人风格化语音(ASMR 耳语等创意风格)
ip零说话人IP 音色合成(如“灵小甄”)
bgm零说话人纯音乐生成(含 Genre/Mood/Instrument/Theme/Duration 描述)
tta零说话人文本转音频事件,带 FlowLoss 控制
emotion参考音频语音 + 情感控制1 个
basic参考音频语速/基频/音量控制1 个
dialect参考音频方言控制(如“广粤话”)1 个
zero_shot参考音频带显式转写的零样本克隆1 个音频 + 1 段转写
podcast参考音频多参考对话生成,自动提取说话人嵌入≥2 个
speech_bgm参考音频语音 + 背景音乐条件(BGM 含 Genre/Mood/Instrument/Theme/SNR)1 个
speech_sound参考音频语音 + 环境音条件(BGM.ENV,如 "Birds chirping")1 个

从 cases.yaml 可以看到各用例的具体指令设计,例如style用自由文本指令描述 ASMR 耳语风格,basic用结构化指令{"语速":"快速","基频":"中","音量":"中"}podcastprompt_text中通过speaker_1:/speaker_2:标签对齐多说话人转写。tta额外指定了cfg: 4.5sigma: 0.3temperature: 2.5三个 FlowLoss 采样控制项,会通过运行时控制字典透传。

指令组装与提示词构造原理

end2end.py中的_build_prompt_payload(见 end2end.py)会把用例字段、CLI 覆盖项、参考波形与说话人嵌入一起交给 prompt_assembly.py 的build_ming_dense_prompt处理:

  • 指令序列化create_instruction将 dict 指令填充到BASE_CAPTION_TEMPLATE(含 序号/说话人/方言/风格/语速/基频/音量/情感/BGM/IP 等槽位)后序列化为 JSON;
  • 时长感知的解码步数resolve_effective_runtime_controls会从text中解析Duration: Ns(正则Duration:\s*([0-9]+(?:\.[0-9]+)?)\s*s),并按samples_per_decode_step = AUDIO_FRAME_HOP × PATCH_SIZE × VAE_PATCH_SIZE估算min/max_decode_steps窗口(目标步数 ±3);
  • prompt token 序列build_dense_prompt_token_ids组装system/user轮次、说话人占位(speaker_N:+<|vision_start|><|vision_pad|><|vision_end|>)、指令(末尾接<|endoftext|>)、参考转写 token、<audio>起始符与<audioPatch>占位 latent token;
  • 说话人嵌入coerce_speaker_embeddings统一处理单个/多个 192 维向量;use_zero_spk_emb: true时(styleip)使用零嵌入走零说话人路径;
  • 运行时控制max_decode_steps/cfg/sigma/temperature等被打入additional_information张量,随请求一起传给 Stage-0。

快速开始:各用例运行命令

零说话人风格合成

python examples/offline_inference/text_to_speech/ming_tts/end2end.py \ --case style \ --deploy-config vllm_omni/deploy/ming_tts.yaml \ --enforce-eager

带转写的零样本克隆

python examples/offline_inference/text_to_speech/ming_tts/end2end.py \ --case zero_shot \ --ref-audio /path/to/10002287-00000094.wav \ --ref-text "在此奉劝大家别乱打美白针。" \ --deploy-config vllm_omni/deploy/ming_tts.yaml \ --enforce-eager

情感控制语音

python examples/offline_inference/text_to_speech/ming_tts/end2end.py \ --case emotion \ --ref-audio /path/to/emotion_prompt.wav \ --deploy-config vllm_omni/deploy/ming_tts.yaml \ --enforce-eager

播客多说话人生成

python examples/offline_inference/text_to_speech/ming_tts/end2end.py \ --case podcast \ --ref-audio-paths /path/to/CTS-CN-F2F-2019-11-11-423-012-A.wav /path/to/CTS-CN-F2F-2019-11-11-423-012-B.wav \ --deploy-config vllm_omni/deploy/ming_tts.yaml \ --enforce-eager

脚本会使用 Ming 模型的campplus.onnx自动为每段参考 WAV 提取一个 192 维说话人嵌入。若已有预计算的说话人嵌入,可用如下参数覆盖提取过程:

--speaker-embedding /path/to/podcast_speaker_embeddings.json

其中 JSON 是一个说话人嵌入列表,每位说话人对应一个 192 维向量。底层实现在 end2end.py:SpeakerEmbeddingExtractor(args.model, allow_download=True).extract_many(paths)在引擎构建前完成提取(此时尚未预取campplus.onnx)。

文本转音频事件(TTA)

python examples/offline_inference/text_to_speech/ming_tts/end2end.py \ --case tta \ --deploy-config vllm_omni/deploy/ming_tts.yaml \ --enforce-eager

异步分块流式输出

python examples/offline_inference/text_to_speech/ming_tts/end2end.py \ --case basic \ --ref-audio /path/to/10002287-00000095.wav \ --streaming \ --deploy-config vllm_omni/deploy/ming_tts.yaml \ --enforce-eager

--streaming使用AsyncOmni与异步分块部署配置,通过async for stage_output in engine.generate(...)增量消费音频块(见 runner.py),并统计首包延迟(TTFP)与块间平均间隔。注意:流式模式当前仅支持单进程单 prompt;--num-prompts > 1时请使用阻塞模式。

收集运行时统计与运行清单

python examples/offline_inference/text_to_speech/ming_tts/end2end.py \ --case style \ --deploy-config vllm_omni/deploy/ming_tts.yaml \ --enforce-eager \ --enable-stats \ --stats-log-file output_audio/ming_style_pipeline.log \ --metadata-json output_audio/ming_style_manifest.json

启用统计后,脚本可额外写出统计日志文件与 manifest JSON(含每个输出的元数据、阶段耗时、峰值内存;流式模式下还包含客户端延迟指标),manifest 的字段结构见 runner.py 的build_manifest

参考音频素材(Reference Fixtures)

上游 Ming cookbook 使用inclusionAI/Ming-omni-tts/data/wavs中的公开音频素材,各用例对应关系如下:

素材适用用例
10002287-00000094.wavzero_shot
10002287-00000095.wavbasic
emotion_prompt.wavemotion
yue_prompt.wavdialect
00000309-00000300.wavspeech_bgmspeech_sound
CTS-CN-F2F-2019-11-11-423-012-A.wav/...-B.wavpodcast

验证矩阵与实测输出

仓库面向自身的示例旨在覆盖本地 Ming 验证脚本使用的同一套 dense TTS 工作流,各用例在两种执行模式下的覆盖情况如下:

用例阻塞deploy/ming_tts.yaml异步分块deploy/ming_tts.yaml额外输入
style可选冒烟测试
ip可选冒烟测试
bgm可选冒烟测试
tta可选冒烟测试
emotion--ref-audio emotion_prompt.wav
basic--ref-audio 10002287-00000095.wav
dialect--ref-audio yue_prompt.wav
zero_shot--ref-audio 10002287-00000094.wav --ref-text ...
podcast两个--ref-audio-paths
speech_bgm--ref-audio 00000309-00000300.wav
speech_sound--ref-audio 00000309-00000300.wav

以下测量值来自早期的L4 CUDA 验证(非 ROCm 基准结果)。默认async_chunk模式在每个用例上都与阻塞模式保持了完全一致的输出帧数与 Stage-1 patch 数:

用例阻塞 frames / patches / sec异步分块 frames / patches / sec
style409248 / 29 / 9.28409248 / 29 / 9.28
ip183456 / 13 / 4.16183456 / 13 / 4.16
bgm1326528 / 94 / 30.081326528 / 94 / 30.08
tta465696 / 33 / 10.56465696 / 33 / 10.56
emotion324576 / 23 / 7.36324576 / 23 / 7.36
basic211680 / 15 / 4.80211680 / 15 / 4.80
dialect239904 / 17 / 5.44239904 / 17 / 5.44
zero_shot409248 / 29 / 9.28409248 / 29 / 9.28
podcast437472 / 31 / 9.92437472 / 31 / 9.92
speech_bgm296352 / 21 / 6.72296352 / 21 / 6.72
speech_sound352800 / 25 / 8.00352800 / 25 / 8.00

这些数字仅作为两条执行路径输出一致性的验证记录,不代表特定硬件的性能基准。此外,配方文档中记录了一次 ROCm 7.2 / MI300X 的离线冒烟运行:basic用例产出 44.1 kHz 单声道 WAV、时长 4.80 秒、RMS 0.1449、峰值绝对振幅 0.8621,首请求耗时 20.406 秒(实时因子 4.25),两个阶段的权重加载分别占用 1.31 GiB 与 1.47 GiB,全设备单秒最大内存采样 91.05 GiB(含预留 KV cache),AR 阶段选择了TRITON_ATTN

关键命令行参数

参数说明
--modelHuggingFace 仓库名或本地 Ming 检查点路径(默认inclusionAI/Ming-omni-tts-0.5B
--deploy-config部署配置 YAML,使用vllm_omni/deploy/ming_tts.yaml
--case内置演示用例(style为默认值)
--ref-audio单个参考 wav 路径(克隆类用例)
--ref-audio-paths多个参考 wav 路径(podcast使用)
--ref-text参考转写,zero_shot必需
--instructions自由格式 Ming 指令字符串
--instruction-json结构化 Ming 指令 JSON(如'{"方言":"广粤话"}'
--speaker-embedding包含 192 维说话人嵌入的 JSON 文件
--extract-speaker-embeddings强制从给定参考音频路径执行 CampPlus 说话人提取
--max-decode-steps覆盖ming_max_decode_steps
--num-prompts同一用例重复 N 次;N>1 时输出文件带索引
--streaming使用AsyncOmni与 async_chunk 传输
--enforce-eager推荐用于 Ming dense;非 eager 超出支持范围
--enable-stats/--log-stats启用 vLLM-Omni 每请求统计日志
--stats-log-file统计日志可选路径
--metadata-json运行清单 JSON 可选路径
--stage-init-timeout每阶段初始化超时(秒,默认 300)
--init-timeout总初始化超时(秒,默认 600)
--batch-timeout批处理超时(秒,默认 5)
--worker-backendmulti_processray
--ray-address使用--worker-backend ray时的 Ray 集群地址

其余可用参数(来自 end2end.py 的解析器)还包括--text(覆盖用例文本)、--prompt(覆盖系统提示前缀)、--output-dir(默认output_audio)、--output-name(自定义输出文件名)、--trust-remote-code--shm-threshold-bytes(默认 65536)等。

引擎侧参数语义

--stage-init-timeout/--init-timeout/--batch-timeout会经build_engine_kwargs(见 runner.py)传入Omni/AsyncOmni引擎构造;--log-stats开启时还会追加log_file。两阶段采样参数由build_sampling_params构造:Stage-0 为temperature=0.0max_tokens=max_decode_steps+1stop_token_ids=[TEXT_EOS_TOKEN_ID](即151669<text_eos>),Stage-1 为temperature=0.0max_tokens=1(对应 VAE 解码的单步输出)。注意end2end.pymain()中会设置VLLM_WORKER_MULTIPROC_METHOD=spawn

输出产物约定

  • 每次运行写一个单声道 44.1 kHz WAV文件;
  • 默认输出目录:output_audio/
  • 默认文件名:ming_<case>.wav
  • --num-prompts > 1时按ming_<case>_00000.wavming_<case>_00001.wav… 索引;
  • 音频写出时先 clamp 到 [-1, 1] 再量化到 16-bit PCM(见write_wav,runner.py);
  • 启用统计时还可写出:统计日志文件(如ming_style_pipeline.log)与 manifest JSON——后者包含每个输出的元数据(request_id、stage_id、stage 耗时、峰值内存、采样率/样本数/时长/最大振幅)、prompt 信息与说话人嵌入形状,以及流式模式下的客户端延迟指标。

使用注意事项

  • styleip是零说话人路径,不需要参考片段
  • emotionbasicdialectspeech_bgmspeech_sound各需一个参考片段
  • zero_shot需要同时提供--ref-audio--ref-text
  • podcast至少需要两个参考片段(通过--ref-audio-paths),并自动为每个参考片段提取一个说话人嵌入
  • --speaker-embedding既可包含单个 192 维向量,也可包含多个 192 维向量的列表;
  • 已验证运行均使用--enforce-eager
  • 早期 L4 验证中 Ming 音频 VAE 使用 SDPA 而非 FlashAttention2——后者是可用时的首选默认后端;
  • 流式模式(--streaming)每次进程调用仅支持一个 prompt,多 prompt 请使用阻塞模式。

如需在线服务形态(OpenAI 兼容/v1/audio/speechAPI)与 16.8B MoE 变体部署,可进一步参考 recipes/inclusionAI/Ming-omni-tts.md 与仓库内同名在线示例;若需深入模型实现,可查看 vllm_omni/model_executor/models/ming_tts/ 下的ming_tts.py(模型组装)、ming_tts_llm.py(Stage-0 AR LLM)、ming_tts_audio_vae.py(Stage-1 VAE 解码)与speaker_extractor.py(CampPlus 说话人嵌入)等模块。

【免费下载链接】vllm-omniA framework for efficient model inference with omni-modality models项目地址: https://gitcode.com/GitHub_Trending/vl/vllm-omni

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/17 23:22:51

电力系统同步相量计算:FFT、窗函数、HHT与小波变换的Matlab仿真对比

做电力系统同步相量计算算法选型时&#xff0c;很多人第一反应就是把FFT搬过来&#xff0c;跑通一次仿真就认为完事了。我在实际对比FFT、窗函数法、希尔伯特-黄变换、小波变换这四类方法时发现&#xff0c;真正决定结果质量的往往不是算法本身的数学公式&#xff0c;而是你如何…

作者头像 李华
网站建设 2026/9/17 23:22:25

AI Agent技能体系设计:从技能注册到编排的工程实践

Agent技能这个话题&#xff0c;最近半年热度一直没降过。我这边说的agent-skills&#xff0c;不算什么官方名词&#xff0c;就是我自己在做AI Agent落地时&#xff0c;围绕“技能”这件事沉淀下来的一套设计思路和工程实践。很多人把Agent理解成“大模型提示词”&#xff0c;真…

作者头像 李华
网站建设 2026/9/17 23:20:57

FLAC3D冻融边坡热力耦合模拟技术与工程实践

1. 冻融边坡数值模拟的工程背景与挑战冻融循环作用下的边坡稳定性分析是寒区工程中的经典难题。在季节性冻土区&#xff0c;每年冬夏交替时地表以下2-3米范围内的土体会经历反复的冻胀和融沉&#xff0c;这种周期性变化会导致&#xff1a;土体强度参数发生不可逆衰减&#xff0…

作者头像 李华
网站建设 2026/9/17 23:17:43

合理用药信息系统设计与实现:处方审核与规则引擎

简介&#xff1a;本资源为「合理用药信息系统设计与实现」本科毕业设计的中期答辩演示文稿&#xff0c;面向计算机与医疗信息化方向的毕业生及答辩准备者&#xff0c;可用于梳理课题逻辑、模拟答辩陈述或参考系统分析类PPT的结构编排。压缩包内含1个pptx文件&#xff0c;大小约…

作者头像 李华