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 torch then OmniVoice.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 torch

import 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 ♡