OmniSinger Opens Note-Controlled Singing TTS

Introduction
OmniSinger just landed on Hugging Face: mindvu/OmniSinger (created 2026-11-05 ~03:38 UTC). It is a full OmniVoice checkpoint fine-tuned for singing voice synthesis with explicit note and duration control, not another spoken-only TTS card.
If you want open singing that clones a short reference clip and respects a lyric score you can type, this is the generative music/voice zero-day this cycle — ahead of another low-resource ASR port.
What Shipped
- Vendor / product: OmniSinger — mindvu (OmniVoice fine-tune)
- Modality: open-weight text-to-speech / singing voice synthesis (English + Vietnamese)
- Open vs closed: weights Apache-2.0; ungated
model.safetensors(~2.45 GB) - Runnable today:
pip install omnivoice soundfile torchthenOmniVoice.from_pretrained("mindvu/OmniSinger")on CUDA, MPS, or Intel XPU - Concrete fact: every sung word carries a
{MIDI_pitch:duration_centiseconds}tag; rests are<silence>{0:D}; melisma uses comma-separated pitch:duration pairs on one word
Architecture stays OmniVoice (Qwen3-backed audio codebooks). The only maker-facing change is the lyric format: prefix [singing], annotate pitch/duration, and pass a matching duration (seconds) equal to the sum of all tag durations ÷ 100.
Run It
pip install omnivoice soundfile torchimport re
import soundfile as sf
import torch
from omnivoice import OmniVoice
def compute_duration_from_text(text: str) -> float:
matches = re.findall(r"-?\d+:(\d+)", text)
if not matches:
raise ValueError("No {pitch:duration} tags found in text.")
return sum(int(d) for d in matches) / 100.0
model = OmniVoice.from_pretrained(
"mindvu/OmniSinger",
device_map="cuda:0", # or "mps" / "xpu"
dtype=torch.float16,
)
text = (
"[singing] <silence>{0:28} hold{68:144} me{67:33} close{65:73} and{63:50} "
"hold{59:30} me{69:36} fast{68:114} <silence>{0:45}"
)
duration = compute_duration_from_text(text)
audio = model.generate(
text=text,
ref_audio="reference.mp3", # short clip of the target voice
duration=duration,
postprocess_output=False,
)
sf.write("out.wav", audio[0], 24000)Omit ref_text and OmniVoice will Whisper-transcribe the reference clip for you. Keep duration locked to the tag sum or the line drifts.
Notes for makers
- Older OmniVoice singing checkpoints exist (ModelsLab and community mirrors); OmniSinger’s day-0 value is the documented pitch:duration score format plus a fresh ungated Apache card you can pull today
- Languages tagged on the card: en and vi — validate outside those before you promise a product language
- Peak VRAM follows the OmniVoice path; start on a CUDA card with headroom for the ~2.45 GB BF16/FP16 load plus reference encode
- Soft-holds still closed this cycle (Ghana ZipVoice 401, Moore gated, finanfa Fon TTS NC+WIP, Underdog Woof HF 401 despite the browser Escape demo) — this is the open singing unlock that cleared the write filter
- No Gen CTA: singing TTS does not map to the Flux / Grok / MiniMax-H3 / Seedream / Seedance Gen loop
Conclusion
For makers who want open, scoreable singing with voice cloning rather than another spoken ASR port, OmniSinger is the zero-day drop — annotate the lyric, point at a reference clip, and render 24 kHz audio today.
—Anabel ♡
