How to Use Different Vocoders with Speech-to-Speech Models in Hugging Face's speech-to-speech Library
You can swap vocoders in the speech-to-speech pipeline by configuring the Qwen3TTSHandlerArguments with your desired backend (ggml or torch), quantization level, and optional custom GGUF files for the talker and codec components.
The Hugging Face speech-to-speech repository decouples the neural model from the vocoder, letting you experiment with different audio synthesis backends. This guide shows you how to use different vocoders with speech-to-speech models by leveraging the configuration options in Qwen3TTSHandlerArguments.
Architecture: Where Vocoder Configuration Lives
The pipeline separates concerns across four layers. Understanding this structure helps you locate the right files when customizing your setup.
| Layer | Responsibility | Source File |
|---|---|---|
| Pipeline entry point | Parses CLI/JSON arguments and constructs the handler chain | src/speech_to_speech/s2s_pipeline.py |
| Argument dataclass | Holds user-exposed vocoder options | src/speech_to_speech/arguments_classes/qwen3_tts_arguments.py |
| TTS handler | Instantiates model and vocoder, streams audio | src/speech_to_speech/TTS/qwen3_tts_handler.py |
| Backend implementations | Execute actual vocoder inference | mlx-audio (Apple Silicon) or faster-qwen3-tts (CUDA/CPU) |
When you specify --tts qwen3, the factory function get_tts_handler in s2s_pipeline.py (lines 389–411) creates a Qwen3TTSHandler. The handler's setup() method then validates and applies your vocoder selections.
Vocoder Configuration Options
The following arguments in Qwen3TTSHandlerArguments control which vocoder loads and how it runs:
| Argument | Purpose | Common Values |
|---|---|---|
qwen3_tts_backend |
Selects the inference library | "ggml" (default), "torch" |
qwen3_tts_ggml_quantization |
Quantization for GGML backend | "BF16", "Q8_0", "Q4_K_M", "F32" |
qwen3_tts_gguf_talker_path |
Path to custom speaker GGUF file | Local .gguf file path |
qwen3_tts_gguf_codec_path |
Path to custom vocoder/codec GGUF file | Local .gguf file path |
qwen3_tts_mlx_quantization |
Quantization for MLX (Apple Silicon) | "bf16", "4bit", "6bit", "8bit" |
qwen3_tts_ref_audio / qwen3_tts_ref_spk / qwen3_tts_ref_rvq |
Voice cloning references | Paths to .wav, .spk, or .rvq files |
Backend-Specific Vocoder Behavior
MLX backend (platform == "darwin"): The vocoder is integrated into the MLX model loaded via mlx_audio.tts.utils.load_model. You adjust precision with qwen3_tts_mlx_quantization, but cannot swap the vocoder independently.
GGML/Torch backend (platform != "darwin"): The handler instantiates FasterQwen3TTS, passing your selected qwen3_tts_backend, qwen3_tts_ggml_quantization, and optional GGUF paths. This is where you inject entirely different vocoders via custom codec and talker files.
Method 1: Configure Vocoders via Command Line
The fastest way to use different vocoders with speech-to-speech models is CLI flags. This example forces the Torch backend with custom GGUF files:
python -m speech_to_speech.main \
--tts qwen3 \
--qwen3_tts_backend torch \
--qwen3_tts_gguf_talker_path /path/to/custom_talker.gguf \
--qwen3_tts_gguf_codec_path /path/to/custom_codec.gguf \
--qwen3_tts_ggml_quantization Q8_0
The _validate_ggml_options() method in qwen3_tts_handler.py checks that your GGUF paths exist and are compatible with your selected backend before loading.
Method 2: Configure Vocoders Programmatically
For integration into larger applications, build the Qwen3TTSHandlerArguments dataclass directly:
from speech_to_speech.arguments_classes.qwen3_tts_arguments import Qwen3TTSHandlerArguments
from speech_to_speech.s2s_pipeline import ParsedArguments, prepare_all_args
# Configure your custom vocoder
qwen_args = Qwen3TTSHandlerArguments(
qwen3_tts_backend="torch",
qwen3_tts_gguf_talker_path="/data/my_talker.gguf",
qwen3_tts_gguf_codec_path="/data/my_codec.gguf",
qwen3_tts_ggml_quantization="Q8_0",
)
# Assemble complete argument suite
parsed = ParsedArguments(
module_kwargs=module_args,
socket_receiver_kwargs=socket_recv_args,
socket_sender_kwargs=socket_send_args,
websocket_streamer_kwargs=ws_stream_args,
vad_handler_kwargs=vad_args,
whisper_stt_handler_kwargs=whisper_args,
language_model_handler_kwargs=lm_args,
responses_api_language_model_handler_kwargs=api_lm_args,
chat_tts_handler_kwargs=chat_tts_args,
facebook_mms_tts_handler_kwargs=fb_mms_args,
pocket_tts_handler_kwargs=pocket_args,
kokoro_tts_handler_kwargs=kokoro_args,
qwen3_tts_handler_kwargs=qwen_args, # Your vocoder configuration
)
# Apply device mapping and final preparation
prepare_all_args(**vars(parsed))
Voice Cloning with Custom Vocoders
The speech-to-speech pipeline supports voice cloning through reference audio or pre-computed speaker embeddings. To use a different vocoder for cloned voices:
- Point
qwen3_tts_ref_audioto a.wavfile for on-the-fly embedding extraction - Use
qwen3_tts_ref_spk(.spkfile) orqwen3_tts_ref_rvq(.rvqfile) for pre-computed embeddings - Change
qwen3_tts_speakerfor CustomVoice speakers
These references flow through the same codec specified in qwen3_tts_gguf_codec_path, letting you combine voice cloning with custom vocoder architectures.
Key Source Files Reference
| File | Description |
|---|---|
src/speech_to_speech/arguments_classes/qwen3_tts_arguments.py |
Dataclass defining all vocoder-related CLI arguments |
src/speech_to_speech/TTS/qwen3_tts_handler.py |
Handler logic for backend selection, validation, and audio streaming |
src/speech_to_speech/s2s_pipeline.py |
Pipeline factory (get_tts_handler) that instantiates handlers |
src/speech_to_speech/utils/mlx_lock.py |
Serialization utilities for MLX inference on Apple Silicon |
src/speech_to_speech/arguments_classes/module_arguments.py |
Module-level flags including --tts selector |
Summary
- Separate concerns: The speech-to-speech pipeline splits model inference from vocoder synthesis, enabling flexible experimentation.
- Two backends: Use
mlx-audioon Apple Silicon (vocoder bundled) orfaster-qwen3-ttson CUDA/CPU (swappable GGUF vocoders). - Swap via GGUF paths: On non-Apple platforms, set
qwen3_tts_gguf_codec_pathandqwen3_tts_gguf_talker_pathto load entirely different vocoder weights. - Quantization control: Fine-tune speed/quality tradeoffs with
qwen3_tts_ggml_quantizationorqwen3_tts_mlx_quantization. - Entry points: Configure through CLI flags for quick tests or
Qwen3TTSHandlerArgumentsfor programmatic integration.
Frequently Asked Questions
Can I use a custom vocoder on Apple Silicon?
No. The MLX backend in src/speech_to_speech/TTS/qwen3_tts_handler.py loads models through mlx_audio.tts.utils.load_model, which bundles the vocoder. You can only adjust quantization precision via qwen3_tts_mlx_quantization, not swap the vocoder architecture. For full vocoder customization, use the GGML or Torch backend on Linux/Windows.
What file format do custom vocoders need?
Custom vocoders and talkers use GGUF format (a binary format for GGML models). Specify paths via qwen3_tts_gguf_codec_path (vocoder weights) and qwen3_tts_gguf_talker_path (speaker/model weights). The handler validates these paths in _validate_ggml_options() before loading.
How do I optimize vocoder performance for real-time streaming?
Three levers control speed: quantization (Q4_K_M for fastest, BF16 for quality), backend selection (ggml for CPU efficiency, torch for CUDA optimization), and platform (MLX on Apple Silicon has lower overhead). For latency-critical applications, start with Q8_0 quantization and profile on your target hardware.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →