ARTICLE DETAIL

资讯详情

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

Step-Audio2 在线服务部署指南:vLLM-Omni 双阶段 TTS/ASR/S2ST 实践

Step-Audio2 在线服务部署指南:vLLM-Omni 双阶段 TTS/ASR/S2ST 实践 Step-Audio2 在线服务部署指南vLLM-Omni 双阶段 TTS/ASR/S2ST 实践【免费下载链接】vllm-omniA framework for efficient model inference with omni-modality models项目地址: https://gitcode.com/GitHub_Trending/vl/vllm-omni导读本指南以 vLLM-Omni 仓库中 examples/online_serving/step_audio2 目录为核心系统讲解如何通过 vLLM-Omni 的 OpenAI 兼容在线服务接口部署并调用 Step-Audio-2-mini 模型覆盖 TTS文本转语音、ASR语音转文本与 S2ST语音到语音翻译三种推理模式。你将掌握两阶段模型的部署拓扑Thinker → Token2Wav、Async Chunk 流式模式与顺序模式的性能差异以及/v1/audio/speech与/v1/chat/completions两种请求路径的完整用法。Step-Audio2 的模型结构与部署形态Step-Audio2 是一个典型的两阶段two-stage语音模型Stage 0Thinker / 思考器负责音频理解与生成输出「文本 音频 token」序列Stage 1Token2Wav把 Thinker 产出的音频 token 解码为 24kHz 的波形WAV。该拓扑在 vLLM-Omni 的 pipeline 定义中固化见 vllm_omni/model_executor/models/step_audio2/pipeline.pyStage 0 使用step_audio2_thinker模型阶段执行类型为LLM_AR自回归输出latent类型final_output_typetext采样约束为detokenize: TrueStage 1 使用token2wav模型阶段执行类型为LLM_GENERATION输入源为 Stage 0输出audio类型采样约束为detokenize: FalseStage 0 到 Stage 1 的数据桥接函数为thinker2token2wav顺序模式与thinker2token2wav_async_chunk异步分块模式实现于vllm_omni.model_executor.stage_input_processors.step_audio2。仓库为不同推理场景提供了三份可直接使用的部署配置配置文件拓扑适用场景vllm_omni/deploy/step_audio_2.yamlThinker → Token2Wav顺序完整双阶段推理TTS / S2STvllm_omni/deploy/step_audio_2_async_chunk.yamlThinker → Token2Wav异步分块低首包延迟的 TTS 场景vllm_omni/deploy/step_audio_2_asr.yaml仅 Thinker纯 ASR音频 → 文本安装与前置条件安装 vLLM-Omni 请参阅仓库根目录的 README.md按平台选择对应的依赖组合requirements/目录下提供 cuda、rocm、npu、xpu、cpu、musa 等不同后端的依赖清单。部署 Step-Audio-2-mini 还需要可访问 Hugging Face 或本地已下载的stepfun-ai/Step-Audio-2-mini权重启动时需携带--trust-remote-code模型包含自定义代码GPU 环境参考部署配置默认使用 2 张卡Thinker 走tensor_parallel_size2。启动服务Async Chunk 模式推荐TTS 首包延迟更低# Async chunk mode (recommended — lower first-packet latency for TTS) vllm serve stepfun-ai/Step-Audio-2-mini --omni --port 8092 \ --deploy-config vllm_omni/deploy/step_audio_2_async_chunk.yaml \ --trust-remote-code --enforce-eager顺序模式Sequentialvllm serve stepfun-ai/Step-Audio-2-mini --omni --port 8092 \ --deploy-config vllm_omni/deploy/step_audio_2.yaml \ --trust-remote-code --enforce-eager使用本地模型路径vllm serve /path/to/Step-Audio-2-mini --omni --port 8092 \ --trust-remote-code --enforce-eager不指定--deploy-config时vLLM-Omni 会根据模型架构自动识别 Step-Audio2 并选择默认拓扑显式指定配置文件则用于控制async_chunk开关、各阶段显存与采样参数。部署配置详解以 vllm_omni/deploy/step_audio_2_async_chunk.yaml 为例逐项说明关键字段# Step-Audio2 deploy: thinker - token2wav with async chunk streaming. async_chunk: true # 开启异步分块流式音频 token 边生成边送 Token2Wav trust_remote_code: true enable_prefix_caching: false stages: - stage_id: 0 # Thinker 阶段 devices: 0,1 # 使用 GPU 0 和 1 tensor_parallel_size: 2 max_num_seqs: 1 gpu_memory_utilization: 0.7 enforce_eager: true async_scheduling: false max_num_batched_tokens: 1024 default_sampling_params: temperature: 0.7 top_p: 0.9 top_k: -1 # -1 表示不启用 top_k 截断 max_tokens: 1024 seed: 42 repetition_penalty: 1.05 - stage_id: 1 # Token2Wav 阶段 devices: 1 max_num_seqs: 1 gpu_memory_utilization: 0.2 enforce_eager: true async_scheduling: false max_num_batched_tokens: 2048 hf_overrides: architectures: [StepAudio2Token2WavForConditionalGeneration] default_sampling_params: temperature: 0.0 # Token2Wav 使用贪心解码 top_p: 1.0 top_k: -1 max_tokens: 1 seed: 42顺序模式配置 vllm_omni/deploy/step_audio_2.yaml 与上述几乎一致仅async_chunk: false且 Thinker 的max_num_batched_tokens为 8192、Token2Wav 为 4096——顺序模式需要 Thinker 完整产出后一次性送入 Token2Wav因此批处理窗口更大。两份配置均体现了双阶段采样的关键设计Thinker 阶段使用带温度0.7、top_p0.9、重复惩罚1.05的采样以提升生成自然度Token2Wav 阶段使用温度 0.0、max_tokens: 1的贪心解码因为该阶段只负责把音频 token 逐帧解码为波形不需要随机性。纯 ASR 部署Thinker Only若只做音频转文本可部署 vllm_omni/deploy/step_audio_2_asr.yaml它通过pipeline: step_audio_2_asr显式选择 ASR pipeline仅保留 Stage 0 的 Thinker避免双阶段拓扑在音频到文本请求跳过 Token2Wav 时可能出现的死锁问题。CI 配置 vllm_omni/deploy/step_audio2_ci.yaml 同样选用该 ASR pipeline并额外设置了max_model_len: 1024、skip_mm_profiling: true以及hf_overrides.architectures: [StepAudio2ThinkerForConditionalGeneration]便于在较小显存环境如单卡 24GB运行。发送请求进入示例目录后即可运行客户端cd examples/online_serving/step_audio2方式一TTS 走/v1/audio/speech推荐该端点绕过 chat template直接触发 TTS 模式并支持 Async Chunk 流式以获得低首包延迟。# Python client python openai_speech_client.py --text 你好世界 # With custom system prompt python openai_speech_client.py --text Hello, how are you? \ --instructions You are a friendly assistant. # Save to specific file python openai_speech_client.py --text 你好世界 -o output.wav或直接使用 curlcurl -X POST http://localhost:8092/v1/audio/speech \ -H Content-Type: application/json \ -d {model:stepfun-ai/Step-Audio-2-mini,input:你好世界,voice:default} \ --output output.wavopenai_speech_client.py的完整参数见 examples/online_serving/step_audio2/openai_speech_client.py参数默认值说明--api-basehttp://localhost:8092API 基础地址--api-keyEMPTYAPI Key本地服务默认无需鉴权--model,-mstepfun-ai/Step-Audio-2-mini模型名或本地路径--text必填待合成的文本--voicedefault音色名--instructions无Thinker 阶段的系统提示词system prompt--response-formatwav输出格式可选wav/pcm--output,-otts_output.wav输出文件路径/v1/audio/speech的底层实现该端点在 vLLM-Omni 中通过 TTS Adapter 机制实现Step-Audio2 的适配器位于 vllm_omni/entrypoints/openai/tts_adapters/step_audio2.py。其build方法直接构造一段以tts_start结尾的聊天 prompt|im_start|system {system_prompt}|im_end| |im_start|user {request.input}|im_end| |im_start|assistant tts_start其中system_prompt取自请求的instructions字段缺省为You are a voice assistant. Read the text aloud.。assistant 回合刻意省略|im_end|让 Thinker 在tts_start之后继续生成音频 token——这与 chat completions 路径中的continue_final_message语义一致。Adapter 注册的stage_keys为{step_audio2_thinker}即 TTS 请求只会路由到 Thinker 阶段Token2Wav 阶段由 Thinker 的音频 token 输出自动驱动。注意说话人的音色由服务端环境变量STEP_AUDIO2_DEFAULT_PROMPT_WAV控制该变量登记于 vllm_omni/config/environment_variable_inventory.py客户端voice参数当前接受default。方式二Chat CompletionsASR / TTS / S2ST# Audio to Text (ASR) python openai_chat_completion_client.py --query-type audio_to_text # Audio to Audio (S2ST) python openai_chat_completion_client.py --query-type audio_to_audio --audio-path /path/to/input.wav客户端 openai_chat_completion_client.py 的参数参数说明--query-type,-q查询类型audio_to_text、text_to_audio、audio_to_audio--audio-path,-a输入音频路径本地文件或 URL缺省使用内置的 mary_had_lamb 测试音频--text,-t待合成的文本TTS 模式使用--prompt,-p自定义提示词/问题--model,-m模型名默认stepfun-ai/Step-Audio-2-mini--max-tokensThinker 阶段最大 token 数默认 1024--output-dir,-o音频输出目录默认output_online--api-baseAPI 地址默认http://localhost:8092/v1双阶段采样参数sampling_params_listChat Completions 路径的核心机制是sampling_params_list——按阶段顺序指定各自的采样参数客户端会将其作为extra_body发送thinker_sampling_params { temperature: 0.7, top_p: 0.9, top_k: -1, max_tokens: args.max_tokens, seed: SEED, detokenize: True, repetition_penalty: 1.1 if args.query_type ! audio_to_text else 1.05, } # ASR 模式下在 EOS 处停止 if args.query_type audio_to_text: thinker_sampling_params[stop_token_ids] [151645] token2wav_sampling_params { temperature: 0.0, top_p: 1.0, top_k: -1, max_tokens: 1, seed: SEED, detokenize: False, } sampling_params_list [thinker_sampling_params, token2wav_sampling_params]要点ASR 场景为 Thinker 设置stop_token_ids: [151645]让模型在文本转录完成后立即停止TTS / S2ST 场景需要额外设置continue_final_messageTrue与add_generation_promptFalse确保 assistant 回合中的tts_start不会被追加|im_end|Thinker 得以继续生成音频 token音频输入以 data URLbase64形式编码进audio_url支持本地文件自动按扩展名识别 wav/mp3/ogg/flac或 HTTP(S) 直链。Curl 方式Chat Completions# Audio to Text bash run_curl.sh audio_to_text # Text to Audio bash run_curl.sh text_to_audio # Audio to Audio bash run_curl.sh audio_to_audiorun_curl.sh 内置了与 Python 客户端一致的采样参数Thinker温度 0.7 / top_p 0.9 / repetition_penalty 1.05 或 1.1Token2Wav温度 0.0 /max_tokens: 1并用jq解析响应中的文本与 base64 音频数据。文本转语音时需在文本末尾追加tts_start标记以触发 TTS。三种查询类型1. Audio to TextASR语音转文本python openai_chat_completion_client.py \ --query-type audio_to_text \ --audio-path /path/to/speech.wav \ --prompt Transcribe this audio.Thinker 直接输出转录文本响应中不包含音频。系统提示词为You are a speech recognition assistant. Transcribe the audio accurately.。2. Text to AudioTTS文本转语音# Via speech endpoint (recommended, returns WAV directly) python openai_speech_client.py --text Hello, welcome to Step-Audio2. # Via chat completions python openai_chat_completion_client.py \ --query-type text_to_audio \ --text Hello, welcome to Step-Audio2.Chat Completions 路径会构造「user 文本消息 assistanttts_start消息」Thinker 在tts_start后生成音频 tokenToken2Wav 解码为波形。3. Audio to AudioS2ST语音到语音python openai_chat_completion_client.py \ --query-type audio_to_audio \ --audio-path /path/to/source.wav输入音频经过 Thinker 理解后生成文本转录与音频输出适用于语音复述、翻译或音色转换场景。输出说明文本输出打印到控制台choice.message.content音频输出保存为output_online/audio_0.wav24kHz WAV 格式来自choice.message.audio.data的 base64 解码若 TTS/S2ST 请求未收到音频客户端会打印No audio output received警告此时应检查服务端日志。API 格式Step-Audio2 使用 OpenAI 兼容的 chat completions API{ model: stepfun-ai/Step-Audio-2-mini, messages: [ { role: system, content: [{type: text, text: Transcribe the audio.}] }, { role: user, content: [ {type: audio_url, audio_url: {url: ...}}, {type: text, text: Please transcribe.} ] } ], sampling_params_list: [ {temperature: 0.7, max_tokens: 1024}, {temperature: 0.0, max_tokens: 1} ] }messages中的audio_url支持公网 URL 与data:base64 data URL 两种形式sampling_params_list按阶段顺序对应 Thinker 与 Token2Wav。性能对比Async Chunk vs Sequential通过/v1/audio/speech端点的基准测试4x RTX 3090、10 条提示、并发1数据来自示例目录 README模式Mean TTFPMean E2EMean RTFSequential顺序4316ms4316ms0.938Async Chunk异步分块1437ms4362ms0.949Async Chunk 通过把 Thinker 边生成边产出的音频 token分块流式送入 Token2Wav将首包延迟TTFP降低67%4316ms → 1437ms端到端耗时E2E基本持平两种模式的 RTF实时率Real-Time Factor均小于 1说明都能满足实时推理要求从 pipeline 定义看Async Chunk 的核心是 Stage 0 的async_chunk_process_next_stage_input_functhinker2token2wav_async_chunk它替代了顺序模式下 Stage 1 的sync_process_input_functhinker2token2wav使 Stage 1 无需等待 Thinker 全部输出即可开始解码。故障排查服务无响应# 检查服务是否存活 curl http://localhost:8092/v1/models并核对端口号是否与启动参数--port一致。FileNotFoundError: prompt_wav file not found确保{model_dir}/assets/default_female.wav文件存在或在启动服务时设置STEP_AUDIO2_DEFAULT_PROMPT_WAV环境变量指定说话人提示音频的路径。音频未生成TTS 场景优先使用/v1/audio/speech端点或openai_speech_client.py走 chat completions 的 TTS 时确保提示词以tts_start结尾或使用客户端自动追加机制检查服务端日志中的报错信息。显存不足Out of Memory在部署配置中降低gpu_memory_utilization默认 Thinker 0.7 / Token2Wav 0.2可按实际显存调整减小批大小max_num_seqs或max_num_batched_tokens。参考资源示例目录examples/online_serving/step_audio2客户端脚本、curl 脚本与本指南部署配置vllm_omni/deploy/step_audio_2.yaml、vllm_omni/deploy/step_audio_2_async_chunk.yaml、vllm_omni/deploy/step_audio_2_asr.yamlPipeline 拓扑定义vllm_omni/model_executor/models/step_audio2/pipeline.pyTTS Adapter 实现vllm_omni/entrypoints/openai/tts_adapters/step_audio2.py环境变量清单vllm_omni/config/environment_variable_inventory.py模型实现vllm_omni/model_executor/models/step_audio2/thinker、token2wav、constants 等【免费下载链接】vllm-omniA framework for efficient model inference with omni-modality models项目地址: https://gitcode.com/GitHub_Trending/vl/vllm-omni创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表