feat(gallery): add experimental Fish Drama 3 (#12789)

Offer the community GGUF with Q4 experts and a Q8 backbone through
existing audio-cpp routing. Document cloning inputs, memory needs, and
the Fish Audio Community License.

Keep automatic task selection for voice cloning. The existing audio.cpp
pin defaults to top_k 4097, so no sampling override or backend bump is
needed.

Assisted-by: Codex:gpt-5

Co-authored-by: Ettore Di Giacinto <mudler@localai.io>
This commit is contained in:
mudler-agentandEttore Di Giacinto authored and GitHub committed 2026-10-20 15:33:15 +02:00
1 parent b53b2b54c9
commit 560527e2e1
2 files changed
+95

No files matched your search

+46
View File
@@ -68908,6 +68908,52 @@
- filename: audio-cpp/yue2-3b/sidecars/yue2-vae-config.json
sha256: f0191bb9694009956de44e0c361a6f1334760be4c8f848e599bde242a54a0970
uri: huggingface://audio-cpp/Yue2-3B-GGUF/sidecars/yue2-vae-config.json
- name: audio-cpp-fish-drama3
url: github:mudler/LocalAI/gallery/virtual.yaml@master
urls:
- https://huggingface.co/fishaudio/drama-3
- https://huggingface.co/Jmica/Drama-3-GGUF
- https://huggingface.co/Jmica/Drama-3-GGUF/blob/17a5b40c5dc2c2be986f5371a7e650108b828e29/LICENSE
- https://github.com/0xShug0/audio.cpp
description: |
Fish Audio Drama 3 is an experimental community port served by audio-cpp.
This GGUF uses Q4_K_S experts and an 8-bit (Q8) backbone. The download is
approximately 24.6 GB; runtime memory requirements exceed the weight size.
Allow additional memory for inference and reference audio processing.
For voice cloning, supply a server-local reference WAV path in the OpenAI
`voice` field and its transcript in `params.reference_text` (or
`params.ref_text`). Cloning requires reference audio and a matching
transcript; plain TTS can run without a reference. No named preset voices
are provided. Use only reference audio for which you have rights and consent.
The Fish Audio Community License governs the weights, not MIT. Review its
use and redistribution terms before installation. This community port is
experimental and is not an official Fish Audio serving implementation.
license: other
tags:
- audio-cpp
- fish-drama3
- experimental
- tts
- text-to-speech
- voice-cloning
- gguf
- quantized
overrides:
backend: audio-cpp
known_usecases:
- tts
name: audio-cpp-fish-drama3
options:
- family:fish_drama3
- backend:best
parameters:
model: audio-cpp/drama-3-backbone-8bit-experts-Q4_K_S.gguf
files:
- filename: audio-cpp/drama-3-backbone-8bit-experts-Q4_K_S.gguf
sha256: 05af716baf78e7c20863b9ccebb3ebdeca9607dd3ea7d0b72c35079e675b212b
uri: https://huggingface.co/Jmica/Drama-3-GGUF/resolve/17a5b40c5dc2c2be986f5371a7e650108b828e29/drama-3-backbone-8bit-experts-Q4_K_S.gguf
- name: audio-cpp-indextts-2.5
url: github:mudler/LocalAI/gallery/virtual.yaml@master
urls:
+49
View File
@@ -0,0 +1,49 @@
# SPDX-License-Identifier: MIT
"""Offline Drama 3 gallery regression. Requires PyYAML; downloads no weights."""
import pathlib
import unittest
import yaml
ROOT = pathlib.Path(__file__).resolve().parents[1]
NAME = "audio-cpp-fish-drama3"
FILE = "drama-3-backbone-8bit-experts-Q4_K_S.gguf"
REVISION = "17a5b40c5dc2c2be986f5371a7e650108b828e29"
SHA256 = "05af716baf78e7c20863b9ccebb3ebdeca9607dd3ea7d0b72c35079e675b212b"
class Drama3GalleryTest(unittest.TestCase):
def test_gallery_entry(self):
entries = yaml.safe_load((ROOT / "gallery/index.yaml").read_text())
matches = [entry for entry in entries if entry["name"] == NAME]
self.assertEqual(len(matches), 1, "expected exactly one Drama 3 entry")
entry = matches[0]
self.assertEqual(entry["url"], "github:mudler/LocalAI/gallery/virtual.yaml@master")
yaml.safe_load((ROOT / "gallery/virtual.yaml").read_text())
self.assertEqual(entry["license"], "other")
self.assertIn("https://huggingface.co/Jmica/Drama-3-GGUF/blob/" + REVISION + "/LICENSE", entry["urls"])
self.assertIn("plain TTS can run without a reference", entry["description"])
self.assertTrue({"tts", "voice-cloning", "experimental", "gguf"} <= set(entry["tags"]))
overrides = entry["overrides"]
self.assertEqual(overrides["name"], NAME)
self.assertEqual(overrides["backend"], "audio-cpp")
self.assertEqual(overrides["known_usecases"], ["tts"])
# Do not pin task:tts: the router must still select voice cloning.
self.assertEqual(set(overrides["options"]), {"family:fish_drama3", "backend:best"})
# LLM top_k is not forwarded by the TTS RPC. The existing audio.cpp
# c6abb443 pin defaults to 4097 in fish_drama3/session.cpp:138.
self.assertEqual(overrides["parameters"], {"model": "audio-cpp/" + FILE})
self.assertNotIn("voices", overrides.get("tts", {}))
self.assertEqual(entry["files"], [{
"filename": "audio-cpp/" + FILE,
"sha256": SHA256,
"uri": "https://huggingface.co/Jmica/Drama-3-GGUF/resolve/" + REVISION + "/" + FILE,
}])
for text in ("experimental", "community port", "reference", "transcript",
"24.6 GB", "memory", "Fish Audio Community License"):
self.assertIn(text, entry["description"])
if __name__ == "__main__":
unittest.main()