[Refactor] Remove resampy dependency (#2891)

Signed-off-by: Nick Cao <ncao@redhat.com>
This commit is contained in:
Nick Cao authored and GitHub committed 2026-04-18 03:20:36 +00:00
1 parent 4f71f7309e
commit d2c23d7bd0
4 files changed
+12 -10

No files matched your search

@@ -5,7 +5,7 @@ speaker encoder from a Qwen3-TTS checkpoint, then interpolates between them
using SLERP and sends the result to the /v1/audio/speech API.
Requirements:
pip install torch resampy soundfile numpy httpx
pip install torch soundfile numpy httpx
Examples:
# Extract and save an embedding
@@ -143,11 +143,12 @@ def _load_speaker_encoder_weights(encoder: torch.nn.Module, model_path: str) ->
def compute_mel_spectrogram(audio: np.ndarray, sr: int = 24000) -> torch.Tensor:
"""Compute 128-bin mel spectrogram matching Qwen3-TTS's extraction pipeline."""
from vllm.multimodal.audio import resample_audio_resampy
from vllm.multimodal.audio import AudioResampler
# Resample to 24kHz if needed
if sr != 24000:
audio = resample_audio_resampy(audio.astype(np.float32), orig_sr=sr, target_sr=24000)
resampler = AudioResampler(target_sr=24000)
audio = resampler.resample(audio.astype(np.float32), orig_sr=sr)
y = torch.from_numpy(audio).unsqueeze(0).float()
-1
View File
@@ -1,7 +1,6 @@
# Common dependencies for all platforms
av>=14.0.0
omegaconf>=2.3.0
resampy>=0.4.3
diffusers>=0.36.0
accelerate==1.12.0
soundfile>=0.13.1
@@ -23,6 +23,7 @@ from vllm.model_executor.layers.logits_processor import LogitsProcessor
from vllm.model_executor.layers.vocab_parallel_embedding import ParallelLMHead
from vllm.model_executor.models.qwen3 import Qwen3Model
from vllm.model_executor.models.utils import AutoWeightsLoader, PPMissingLayer, WeightsMapper, maybe_prefix
from vllm.multimodal.audio import AudioResampler
from vllm.sequence import IntermediateTensors
from vllm_omni.model_executor.models.output_templates import OmniOutput
@@ -1094,9 +1095,8 @@ class Qwen3TTSTalkerForConditionalGeneration(nn.Module):
# Resample to 24kHz for speaker encoder.
target_sr = int(getattr(self.config.speaker_encoder_config, "sample_rate", 24000))
if sr != target_sr:
from vllm.multimodal.audio import resample_audio_resampy
wav = resample_audio_resampy(wav.astype(np.float32), orig_sr=int(sr), target_sr=target_sr)
resampler = AudioResampler(target_sr=target_sr)
wav = resampler.resample(wav.astype(np.float32), orig_sr=int(sr))
sr = target_sr
# Follow official implementation: mel_spectrogram expects 24kHz.
@@ -22,7 +22,7 @@ import soundfile as sf
import torch
from torch.nn.utils.rnn import pad_sequence
from transformers import AutoConfig, AutoFeatureExtractor, AutoModel
from vllm.multimodal.audio import resample_audio_resampy
from vllm.multimodal.audio import AudioResampler
from vllm.multimodal.media.audio import load_audio as _load_audio_file
from .tokenizer_12hz.configuration_qwen3_tts_tokenizer_v2 import Qwen3TTSTokenizerV2Config
@@ -161,7 +161,8 @@ class Qwen3TTSTokenizer:
audio = np.mean(audio, axis=-1)
if sr != target_sr:
audio = resample_audio_resampy(audio, orig_sr=sr, target_sr=target_sr)
resampler = AudioResampler(target_sr=target_sr)
audio = resampler.resample(audio, orig_sr=sr)
return audio.astype(np.float32)
@@ -209,7 +210,8 @@ class Qwen3TTSTokenizer:
if a.ndim > 1:
a = np.mean(a, axis=-1)
if int(sr) != target_sr:
a = resample_audio_resampy(a.astype(np.float32), orig_sr=int(sr), target_sr=target_sr)
resampler = AudioResampler(target_sr=target_sr)
a = resampler.resample(a.astype(np.float32), orig_sr=int(sr))
out.append(a.astype(np.float32))
return out