neuapi / api /src /core /model_config.py
grimshaw's picture
Upload folder using huggingface_hub
35bb6f4 verified
Raw
History Blame Contribute Delete
7.43 kB
from __future__ import annotations
from dataclasses import dataclass
from enum import Enum
class BackendType(str, Enum):
TORCH = "torch"
GGUF = "gguf"
ONNX = "onnx"
@dataclass(frozen=True)
class BackboneModelInfo:
model_id: str
repo: str
language: str
backend: BackendType
supports_streaming: bool
description: str
@dataclass(frozen=True)
class CodecModelInfo:
codec_id: str
repo: str
codec_type: str
description: str
BACKBONE_MODELS: dict[str, BackboneModelInfo] = {
# NeuTTS-Air (English)
"neutts-air": BackboneModelInfo(
model_id="neutts-air",
repo="neuphonic/neutts-air",
language="en-us",
backend=BackendType.TORCH,
supports_streaming=False,
description="NeuTTS Air ~748M params, PyTorch",
),
"neutts-air-q4-gguf": BackboneModelInfo(
model_id="neutts-air-q4-gguf",
repo="neuphonic/neutts-air-q4-gguf",
language="en-us",
backend=BackendType.GGUF,
supports_streaming=True,
description="NeuTTS Air Q4 quantized, GGUF",
),
"neutts-air-q8-gguf": BackboneModelInfo(
model_id="neutts-air-q8-gguf",
repo="neuphonic/neutts-air-q8-gguf",
language="en-us",
backend=BackendType.GGUF,
supports_streaming=True,
description="NeuTTS Air Q8 quantized, GGUF",
),
"neutts-air-onnx": BackboneModelInfo(
model_id="neutts-air-onnx",
repo="neuphonic/neutts-air-onnx",
language="en-us",
backend=BackendType.ONNX,
supports_streaming=False,
description="NeuTTS Air ONNX runtime",
),
# NeuTTS-Nano (English)
"neutts-nano": BackboneModelInfo(
model_id="neutts-nano",
repo="neuphonic/neutts-nano",
language="en-us",
backend=BackendType.TORCH,
supports_streaming=False,
description="NeuTTS Nano ~120M params, PyTorch",
),
"neutts-nano-q4-gguf": BackboneModelInfo(
model_id="neutts-nano-q4-gguf",
repo="neuphonic/neutts-nano-q4-gguf",
language="en-us",
backend=BackendType.GGUF,
supports_streaming=True,
description="NeuTTS Nano Q4 quantized, GGUF",
),
"neutts-nano-q8-gguf": BackboneModelInfo(
model_id="neutts-nano-q8-gguf",
repo="neuphonic/neutts-nano-q8-gguf",
language="en-us",
backend=BackendType.GGUF,
supports_streaming=True,
description="NeuTTS Nano Q8 quantized, GGUF",
),
# NeuTTS-Nano German
"neutts-nano-german": BackboneModelInfo(
model_id="neutts-nano-german",
repo="neuphonic/neutts-nano-german",
language="de",
backend=BackendType.TORCH,
supports_streaming=False,
description="NeuTTS Nano German, PyTorch",
),
"neutts-nano-german-q4-gguf": BackboneModelInfo(
model_id="neutts-nano-german-q4-gguf",
repo="neuphonic/neutts-nano-german-q4-gguf",
language="de",
backend=BackendType.GGUF,
supports_streaming=True,
description="NeuTTS Nano German Q4 quantized, GGUF",
),
"neutts-nano-german-q8-gguf": BackboneModelInfo(
model_id="neutts-nano-german-q8-gguf",
repo="neuphonic/neutts-nano-german-q8-gguf",
language="de",
backend=BackendType.GGUF,
supports_streaming=True,
description="NeuTTS Nano German Q8 quantized, GGUF",
),
# NeuTTS-Nano French
"neutts-nano-french": BackboneModelInfo(
model_id="neutts-nano-french",
repo="neuphonic/neutts-nano-french",
language="fr-fr",
backend=BackendType.TORCH,
supports_streaming=False,
description="NeuTTS Nano French, PyTorch",
),
"neutts-nano-french-q4-gguf": BackboneModelInfo(
model_id="neutts-nano-french-q4-gguf",
repo="neuphonic/neutts-nano-french-q4-gguf",
language="fr-fr",
backend=BackendType.GGUF,
supports_streaming=True,
description="NeuTTS Nano French Q4 quantized, GGUF",
),
"neutts-nano-french-q8-gguf": BackboneModelInfo(
model_id="neutts-nano-french-q8-gguf",
repo="neuphonic/neutts-nano-french-q8-gguf",
language="fr-fr",
backend=BackendType.GGUF,
supports_streaming=True,
description="NeuTTS Nano French Q8 quantized, GGUF",
),
# NeuTTS-Nano Spanish
"neutts-nano-spanish": BackboneModelInfo(
model_id="neutts-nano-spanish",
repo="neuphonic/neutts-nano-spanish",
language="es",
backend=BackendType.TORCH,
supports_streaming=False,
description="NeuTTS Nano Spanish, PyTorch",
),
"neutts-nano-spanish-q4-gguf": BackboneModelInfo(
model_id="neutts-nano-spanish-q4-gguf",
repo="neuphonic/neutts-nano-spanish-q4-gguf",
language="es",
backend=BackendType.GGUF,
supports_streaming=True,
description="NeuTTS Nano Spanish Q4 quantized, GGUF",
),
"neutts-nano-spanish-q8-gguf": BackboneModelInfo(
model_id="neutts-nano-spanish-q8-gguf",
repo="neuphonic/neutts-nano-spanish-q8-gguf",
language="es",
backend=BackendType.GGUF,
supports_streaming=True,
description="NeuTTS Nano Spanish Q8 quantized, GGUF",
),
}
CODEC_MODELS: dict[str, CodecModelInfo] = {
"neuphonic/neucodec": CodecModelInfo(
codec_id="neuphonic/neucodec",
repo="neuphonic/neucodec",
codec_type="pytorch",
description="NeuCodec PyTorch (cpu/cuda)",
),
"neuphonic/distill-neucodec": CodecModelInfo(
codec_id="neuphonic/distill-neucodec",
repo="neuphonic/distill-neucodec",
codec_type="pytorch",
description="Distilled NeuCodec PyTorch (cpu/cuda)",
),
"neuphonic/neucodec-onnx-decoder": CodecModelInfo(
codec_id="neuphonic/neucodec-onnx-decoder",
repo="neuphonic/neucodec-onnx-decoder",
codec_type="onnx",
description="NeuCodec ONNX decoder (cpu)",
),
"neuphonic/neucodec-onnx-decoder-int8": CodecModelInfo(
codec_id="neuphonic/neucodec-onnx-decoder-int8",
repo="neuphonic/neucodec-onnx-decoder-int8",
codec_type="onnx_int8",
description="NeuCodec ONNX INT8 decoder (cpu)",
),
}
BUILTIN_VOICES: dict[str, dict] = {
"dave": {"language": "en-us", "gender": "male", "description": "English male voice"},
"jo": {"language": "en-us", "gender": "female", "description": "English female voice"},
"greta": {"language": "de", "gender": "female", "description": "German female voice"},
"hans": {"language": "de", "gender": "male", "description": "German male voice"},
"mateo": {"language": "es", "gender": "male", "description": "Spanish male voice"},
"elena": {"language": "es", "gender": "female", "description": "Spanish female voice"},
"juliette": {"language": "fr-fr", "gender": "female", "description": "French female voice"},
"pierre": {"language": "fr-fr", "gender": "male", "description": "French male voice"},
}
def get_backbone_info(model_id: str) -> BackboneModelInfo | None:
return BACKBONE_MODELS.get(model_id)
def get_codec_info(codec_id: str) -> CodecModelInfo | None:
return CODEC_MODELS.get(codec_id)
def get_voice_language(voice_name: str) -> str | None:
info = BUILTIN_VOICES.get(voice_name)
return info["language"] if info else None