From 5d4b16e6e37fdde8578c17cab1165b9ad5effb9c Mon Sep 17 00:00:00 2001 From: Peiqi Yin <60515999+yinpeiqi@users.noreply.github.com> Date: Wed, 6 May 2026 20:00:20 -0700 Subject: [PATCH] [BugFix] Qwen2.5-Omni streaming code2wav input handling (#3396) Signed-off-by: yinpeiqi --- .../models/qwen2_5_omni/pipeline.py | 1 + .../models/qwen2_5_omni/qwen2_5_omni.py | 8 +++--- .../stage_input_processors/qwen2_5_omni.py | 25 +++++++++++++++++++ 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/vllm_omni/model_executor/models/qwen2_5_omni/pipeline.py b/vllm_omni/model_executor/models/qwen2_5_omni/pipeline.py index b44d08eb3..de0644803 100644 --- a/vllm_omni/model_executor/models/qwen2_5_omni/pipeline.py +++ b/vllm_omni/model_executor/models/qwen2_5_omni/pipeline.py @@ -51,6 +51,7 @@ QWEN2_5_OMNI_PIPELINE = PipelineConfig( final_output=True, final_output_type="audio", engine_output_type="audio", + custom_process_input_func=f"{_PROC}.talker2code2wav", sampling_constraints={"detokenize": True}, ), ), diff --git a/vllm_omni/model_executor/models/qwen2_5_omni/qwen2_5_omni.py b/vllm_omni/model_executor/models/qwen2_5_omni/qwen2_5_omni.py index cd4c1aa1c..ea9d9dcdd 100644 --- a/vllm_omni/model_executor/models/qwen2_5_omni/qwen2_5_omni.py +++ b/vllm_omni/model_executor/models/qwen2_5_omni/qwen2_5_omni.py @@ -351,10 +351,12 @@ class Qwen2_5OmniForConditionalGeneration( ) ) - code = code[:-1] if code[-1] == TALKER_CODEC_EOS_TOKEN_ID else code - code = code[1:] if code[0] == TALKER_CODEC_BOS_TOKEN_ID else code + if code.numel() and code[-1] == TALKER_CODEC_EOS_TOKEN_ID: + code = code[:-1] + if code.numel() and code[0] == TALKER_CODEC_BOS_TOKEN_ID: + code = code[1:] - audio_tensor = self.generate_audio(code, voice_type) + audio_tensor = self.generate_audio(code, voice_type) if code.numel() else torch.zeros(0, device=code.device) return OmniOutput(text_hidden_states=None, multimodal_outputs={"model_outputs": audio_tensor}) return OmniOutput( diff --git a/vllm_omni/model_executor/stage_input_processors/qwen2_5_omni.py b/vllm_omni/model_executor/stage_input_processors/qwen2_5_omni.py index c6f2de53a..a69ef5227 100644 --- a/vllm_omni/model_executor/stage_input_processors/qwen2_5_omni.py +++ b/vllm_omni/model_executor/stage_input_processors/qwen2_5_omni.py @@ -56,3 +56,28 @@ def thinker2talker( ) ) return talker_inputs + + +def talker2code2wav( + source_outputs, + _prompt: OmniTokensPrompt | TextPrompt = None, + _requires_multimodal_data: bool = False, +): + code2wav_inputs = [] + for talker_output in source_outputs: + output = talker_output.outputs[0] + token_ids = list(output.cumulative_token_ids) + if token_ids and token_ids[0] == TALKER_CODEC_START_TOKEN_ID: + token_ids = token_ids[1:] + if token_ids and token_ids[-1] == TALKER_CODEC_END_TOKEN_ID: + token_ids = token_ids[:-1] + if not token_ids: + continue + code2wav_inputs.append( + OmniTokensPrompt( + prompt_token_ids=token_ids, + multi_modal_data=None, + mm_processor_kwargs=None, + ) + ) + return code2wav_inputs