From 72a02b492a6957acc4659fde09be85c00ad0f90b Mon Sep 17 00:00:00 2001 From: Zhenghan Song Date: Thu, 13 Aug 2026 03:20:12 +0800 Subject: [PATCH] [Bugfix] Fix diffusion TTS adapter lookup in speech serving (#6121) Signed-off-by: HaningZS --- .../openai_api/test_serving_speech.py | 21 +++++++++++++++++-- .../entrypoints/openai/serving_speech.py | 6 ++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/tests/entrypoints/openai_api/test_serving_speech.py b/tests/entrypoints/openai_api/test_serving_speech.py index bcb89ff88..94d84d041 100644 --- a/tests/entrypoints/openai_api/test_serving_speech.py +++ b/tests/entrypoints/openai_api/test_serving_speech.py @@ -680,7 +680,7 @@ class TestSpeechAPI: @pytest.mark.asyncio async def test_create_diffusion_speech_extra_params(self, mocker: MockerFixture): - """Test that extra_params are correctly applied to sampling_params_list in diffusion mode.""" + """Test public diffusion speech success and extra_params propagation.""" # Mock the engine client mock_engine = mocker.MagicMock() @@ -704,7 +704,11 @@ class TestSpeechAPI: req = OpenAICreateSpeechRequest(input="Hello", extra_params={"new_arg": 123, "existing_arg": "new_value"}) - await server._create_diffusion_speech(req) + response = await server.create_speech(req) + + assert response.status_code == 200 + assert response.media_type == "audio/wav" + assert response.body == b"dummy" # Verify generate was called mock_engine.generate.assert_called_once() @@ -737,6 +741,19 @@ class TestTTSMethods: yield server server.shutdown() + def test_diffusion_audio_encode_speed_skips_ar_adapter(self, mocker: MockerFixture): + """Pure-diffusion speech keeps generic speed handling outside AR adapters.""" + server = OmniOpenAIServingSpeech.for_diffusion( + diffusion_engine=mocker.MagicMock(), + model_name="test-model", + ) + resolve_adapter = mocker.patch.object(serving_speech_module, "resolve_adapter") + + speed = server._audio_encode_speed(OpenAICreateSpeechRequest(input="Hello", speed=1.25)) + + assert speed == 1.25 + resolve_adapter.assert_not_called() + def test_is_tts_detection_no_stage(self, speech_server): """Test TTS model detection when no TTS stage exists.""" # Fixture creates server with stage_configs = [] -> _is_tts should be False diff --git a/vllm_omni/entrypoints/openai/serving_speech.py b/vllm_omni/entrypoints/openai/serving_speech.py index a662ae7de..109777282 100644 --- a/vllm_omni/entrypoints/openai/serving_speech.py +++ b/vllm_omni/entrypoints/openai/serving_speech.py @@ -502,11 +502,17 @@ class OmniOpenAIServingSpeech(OpenAIServing, AudioMixin): def _get_tts_adapter(self): """Return the per-model serving adapter for the current ``_tts_model_type``. + Pure-diffusion speech uses its dedicated request path and does not + resolve adapters for AR-stage TTS models. + Resolved lazily (rebuilt if ``_tts_model_type`` changed since the cached instance was built) so callers that set ``_tts_model_type`` after construction still dispatch to the matching adapter. In production ``_tts_model_type`` is fixed at init, so the cached instance is reused. """ + if self._diffusion_mode: + return None + adapter_cls = resolve_adapter(self._tts_model_type) if adapter_cls is None: self._adapter = None