feat: add Soprano TTS as community model with GGUF packages - #323
feat: add Soprano TTS as community model with GGUF packages#323drzsdrtfg wants to merge 4 commits into
Conversation
|
pls let me know If there are any issues. |
|
@drzsdrtfg Serveral issues found: (1) The published GGUF does not run: (2) Converter output and spec do not match. But model_specs/soprano_tts.json expects: (3) Documented warmbench target is missing. (4) (5) Please follow the existing streaming implementations such as NeuTTS, Right now Soprano’s streaming path looks inconsistent with those patterns: |
|
@drzsdrtfg Could you isolate the changes in the framework Qwen runtime into a separate PR? It looks like a correctness fix, but it still needs validation across other models that use the same runtime to make sure there are no surprises. |
- converter emits spec-matched combined.safetensors (backbone + folded decoder incl. ISTFT window); loader requires the window strictly - register soprano_warm_bench target; document ENGINE_BUILD_WARMBENCH - parse eos_bias from request options - streaming follows NeuTTS pattern: run_mode reports task mode, options parsed once in start_stream and reused by next_stream_event - accept bare spec-declared session/load option names (text_chunk_size, backbone_weight_type, decoder_weight_type) - add soprano warm bench and document measured CPU/Vulkan performance including F16/Q8_0 backbone storage types Note: the soprano warm bench --warmup/--iterations paths depend on the QwenCausalDecodeRuntime prefill re-feed fix (0xShug0#331).
|
Something is still broken. The build doesnt work on cuda currently. Currently fixing it |
|
Oh, seems like it was another issue and you fixed it already. |
Soprano TTS — Community Model
Soprano is an ultra-lightweight (~80M parameter) English-only text-to-speech model using a two-stage architecture: a Qwen3-style causal LM (17 layers, hidden 512, vocab 8192) that autoregressively emits per-frame 512-dimensional features, and a non-iterative Vocos-style decoder (ConvNeXt backbone + single ISTFT head, n_fft 2048 / hop 512) that turns those features into 32 kHz audio.
Reference: https://github.com/ekwek1/soprano
Weights: https://huggingface.co/ekwek/Soprano-1.1-80M
GGUF packages: https://huggingface.co/WalkingCat/Soprano-1.1-80M-GGUF
Files added
src/community_models/soprano_tts/(5 .cpp)include/engine/community_models/soprano_tts/(5 .h)model_specs/soprano_tts.jsondocs/soprano_tts.mddocs/soprano_validation.mdtests/soprano_tts/soprano_warm_bench.cpptests/soprano_tts/soprano_warm_bench_cases.txttests/soprano_tts/soprano_python_warm_bench.pytools/soprano_tts/convert_soprano.pytools/soprano_tts/run_official.pytools/soprano_tts/compare_parity.pyFiles modified
CMakeLists.txtaudiocpp_add_model+add_engine_warmbenchREADME.mddocs/gguf.mdwebui/configs/models_catalog.jsonwebui/native/dist/index.htmlBuild
Quick start
Run warmbench
Validation
CPU performance vs official Python
sopranopackage (transformers backend, temp=0.3, top_p=0.95):Key observations:
docs/soprano_validation.mdfor full validation record.Known limitations
Code and PR assisted and written by ox alpha(GLM 5.3 flash) and Deepseek v4 flash.