vllm-project/vllm-omni

[CI/Test] Add Fish Speech TTS e2e test (no e2e coverage in any pipeline tier)

Open

#4,226 opened on Jun 7, 2026

View on GitHub
 (1 comment) (0 reactions) (0 assignees)Python (1,067 forks)github user discovery
good first issuetts

Repository metrics

Stars
 (4,990 stars)
PR merge metrics
 (PR metrics pending)

Description

Summary

Fish Speech has no end-to-end test in tests/e2e/. Every other TTS model has at least a core_model online smoke test that runs in CI, but Fish Speech only has CPU unit/regression tests, so no GPU serving path is exercised in any pipeline tier.

Why this matters

The CI tiers gate TTS e2e coverage by pytest marker:

Because no Fish Speech test lives under tests/e2e/ and none carries the tts marker, both tts-test and nightly-test are no-ops for Fish Speech. Recent Fish Speech bug fixes (prefix-cache collision #4008, Gradio default-voice 400 #3941) had no e2e path to catch them.

What to do

Add an online serving e2e smoke that mirrors the VoxCPM2 pattern:

  1. Create tests/e2e/online_serving/test_fish_speech_tts.py
  2. Mark it @pytest.mark.core_model + @pytest.mark.tts (add L4 + full_model variants if feasible)
  3. Cover a basic /v1/audio/speech text-to-speech request and a voice-clone request (ref_audio + ref_text), asserting non-empty, non-silent audio
  4. Reference implementations:
    • VoxCPM2 e2e: tests/e2e/online_serving/test_voxcpm2_tts.py
    • Fish Speech serving path: vllm_omni/entrypoints/openai/serving_speech.py
    • Example client: examples/online_serving/text_to_speech/fish_speech/

Acceptance criteria

  • Test collected by pytest -m "core_model and tts" and by the nightly tts-test selector
  • Passes on an L4 GPU with the published Fish Speech checkpoint

Good first issue for someone wanting to learn the vLLM-Omni TTS serving + CI test layout.

Contributor guide