Instructions to use KavirLabs/Darya_TTS with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- llama.cpp
How to use KavirLabs/Darya_TTS with llama.cpp:
Install (macOS, Linux)
curl -LsSf https://llama.app/install.sh | sh # Start a local OpenAI-compatible server with a web UI: llama serve -hf KavirLabs/Darya_TTS:Q8_0 # Run inference directly in the terminal: llama cli -hf KavirLabs/Darya_TTS:Q8_0
Install from WinGet (Windows)
winget install llama.cpp # Start a local OpenAI-compatible server with a web UI: llama serve -hf KavirLabs/Darya_TTS:Q8_0 # Run inference directly in the terminal: llama cli -hf KavirLabs/Darya_TTS:Q8_0
Build from source code
git clone https://github.com/ggml-org/llama.cpp.git cd llama.cpp cmake -B build cmake --build build -j --target llama-app # Start a local OpenAI-compatible server with a web UI: ./build/bin/llama serve -hf KavirLabs/Darya_TTS:Q8_0 # Run inference directly in the terminal: ./build/bin/llama cli -hf KavirLabs/Darya_TTS:Q8_0
Use Docker
docker model run hf.co/KavirLabs/Darya_TTS:Q8_0
- Llama new
- LM Studio
- Jan
- Ollama
How to use KavirLabs/Darya_TTS with Ollama:
ollama run hf.co/KavirLabs/Darya_TTS:Q8_0
- Unsloth Desktop
- Docker Model Runner
How to use KavirLabs/Darya_TTS with Docker Model Runner:
docker model run hf.co/KavirLabs/Darya_TTS:Q8_0
- Lemonade
How to use KavirLabs/Darya_TTS with Lemonade:
Pull the model
# Download Lemonade from https://lemonade-server.ai/ lemonade pull KavirLabs/Darya_TTS:Q8_0
Run and chat with the model
lemonade run user.Darya_TTS-Q8_0
List all available models
lemonade list
- Atomic Chat
Update train.py
Browse files
train.py
CHANGED
|
@@ -1,5 +1,4 @@
|
|
| 1 |
import argparse
|
| 2 |
-
import json
|
| 3 |
import logging
|
| 4 |
import math
|
| 5 |
import os
|
|
@@ -17,7 +16,11 @@ from accelerate.utils import set_seed
|
|
| 17 |
from transformers import get_cosine_schedule_with_warmup
|
| 18 |
from torchao.float8 import Float8LinearConfig, convert_to_float8_training
|
| 19 |
|
| 20 |
-
from dataset import
|
|
|
|
|
|
|
|
|
|
|
|
|
| 21 |
from discriminator import ConformerDiscirminator
|
| 22 |
from model_transformer import load_config, model_from_config
|
| 23 |
|
|
@@ -54,6 +57,8 @@ def module_filter_fn(mod, fqn):
|
|
| 54 |
return False
|
| 55 |
if fqn in FP8_SKIP_EXACT or fqn.startswith(FP8_SKIP_PREFIXES):
|
| 56 |
return False
|
|
|
|
|
|
|
| 57 |
return True
|
| 58 |
|
| 59 |
|
|
@@ -137,7 +142,12 @@ def extract_disc_features(
|
|
| 137 |
disc_t=None,
|
| 138 |
disc_noise=None,
|
| 139 |
):
|
|
|
|
| 140 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 141 |
max_len = int(latent_lengths.max().item())
|
| 142 |
latents = latents[:, :max_len, :]
|
| 143 |
valid_mask = torch.arange(max_len, device=latents.device)[None, :] < latent_lengths[:, None]
|
|
@@ -243,10 +253,12 @@ def compute_loss(
|
|
| 243 |
cond = cond * valid_audio_mask.unsqueeze(-1).to(cond.dtype)
|
| 244 |
model_input = x_t * valid_audio_mask.unsqueeze(-1).to(x_t.dtype)
|
| 245 |
|
| 246 |
-
|
|
|
|
|
|
|
| 247 |
p_drop_both = 0.1
|
| 248 |
p_drop_text = 0.1
|
| 249 |
-
p_drop_speaker = 0.0 #
|
| 250 |
|
| 251 |
r = torch.rand(B, device=device)
|
| 252 |
b0 = p_drop_both
|
|
@@ -296,7 +308,7 @@ def compute_loss(
|
|
| 296 |
stats = {"fm_loss": fm_loss.detach(), "gen_adv_loss": zero, "speaker_aux_loss": zero}
|
| 297 |
return fm_loss, stats, None
|
| 298 |
|
| 299 |
-
|
| 300 |
raw = unwrap_model(model)
|
| 301 |
speaker_aux_loss = zero
|
| 302 |
if need_hidden and hasattr(raw, "predict_speaker"):
|
|
@@ -441,9 +453,7 @@ def cleanup_checkpoints(exp_dir, keep_last_k):
|
|
| 441 |
def parse_args():
|
| 442 |
parser = argparse.ArgumentParser()
|
| 443 |
parser.add_argument("--config", type=str, required=True)
|
| 444 |
-
|
| 445 |
-
dataset_group.add_argument("--dataset", type=str)
|
| 446 |
-
dataset_group.add_argument("--datasets", type=str)
|
| 447 |
parser.add_argument("--streaming", action="store_true")
|
| 448 |
parser.add_argument("--dataset_split", type=str, default="train")
|
| 449 |
parser.add_argument("--tokenizer", type=str, default=None)
|
|
@@ -511,44 +521,27 @@ def build_optimizer(args, model, train_cfg):
|
|
| 511 |
|
| 512 |
def build_data(args, cfg, need_audio):
|
| 513 |
data_cfg = cfg["data"]
|
| 514 |
-
train_cfg = cfg["training"]
|
| 515 |
-
|
| 516 |
raw_max = data_cfg["max_audio_seconds"] * data_cfg["codec_rate_hz"]
|
| 517 |
-
|
|
|
|
|
|
|
|
|
|
| 518 |
latent_dim=data_cfg["latent_dim"],
|
| 519 |
need_audio=need_audio,
|
| 520 |
max_text_len=data_cfg["max_text_length"],
|
| 521 |
max_latent_len=int(data_cfg.get("max_latent_length", int(raw_max))),
|
| 522 |
text_pad_id=data_cfg["text_pad_id"],
|
| 523 |
-
train_cfg=
|
| 524 |
tokenizer=(
|
| 525 |
args.tokenizer
|
| 526 |
or data_cfg.get("tokenizer")
|
| 527 |
or data_cfg.get("tokenizer_name")
|
| 528 |
or data_cfg.get("text_tokenizer")
|
| 529 |
),
|
|
|
|
|
|
|
| 530 |
)
|
| 531 |
|
| 532 |
-
if args.datasets is None:
|
| 533 |
-
logger.info(f"Loading dataset from {args.dataset}")
|
| 534 |
-
return build_tts_dataloader(
|
| 535 |
-
dataset_path=args.dataset,
|
| 536 |
-
streaming=args.streaming,
|
| 537 |
-
dataset_split=args.dataset_split,
|
| 538 |
-
**common,
|
| 539 |
-
)
|
| 540 |
-
|
| 541 |
-
if args.streaming:
|
| 542 |
-
raise ValueError("--streaming is not supported with --datasets")
|
| 543 |
-
|
| 544 |
-
with open(args.datasets, "r", encoding="utf-8") as f:
|
| 545 |
-
dataset_configs = json.load(f).get("datasets")
|
| 546 |
-
if not isinstance(dataset_configs, list) or not dataset_configs:
|
| 547 |
-
raise ValueError("--datasets JSON must contain a non-empty top-level 'datasets' list")
|
| 548 |
-
|
| 549 |
-
logger.info(f"Loading {len(dataset_configs)} configured datasets from {args.datasets}")
|
| 550 |
-
return build_multi_tts_dataloader(dataset_configs=dataset_configs, **common)
|
| 551 |
-
|
| 552 |
|
| 553 |
def main():
|
| 554 |
args = parse_args()
|
|
|
|
| 1 |
import argparse
|
|
|
|
| 2 |
import logging
|
| 3 |
import math
|
| 4 |
import os
|
|
|
|
| 16 |
from transformers import get_cosine_schedule_with_warmup
|
| 17 |
from torchao.float8 import Float8LinearConfig, convert_to_float8_training
|
| 18 |
|
| 19 |
+
from dataset import (
|
| 20 |
+
build_tts_dataloader,
|
| 21 |
+
extract_speaker_embs_from_batch,
|
| 22 |
+
load_titanet,
|
| 23 |
+
)
|
| 24 |
from discriminator import ConformerDiscirminator
|
| 25 |
from model_transformer import load_config, model_from_config
|
| 26 |
|
|
|
|
| 57 |
return False
|
| 58 |
if fqn in FP8_SKIP_EXACT or fqn.startswith(FP8_SKIP_PREFIXES):
|
| 59 |
return False
|
| 60 |
+
if ".mamba." in fqn:
|
| 61 |
+
return False
|
| 62 |
return True
|
| 63 |
|
| 64 |
|
|
|
|
| 142 |
disc_t=None,
|
| 143 |
disc_noise=None,
|
| 144 |
):
|
| 145 |
+
"""Stack hidden states from the score net as discriminator input.
|
| 146 |
|
| 147 |
+
When disc_t/disc_noise are given the latents are noised to that level
|
| 148 |
+
first, so the discriminator sees noisy representations instead of
|
| 149 |
+
requiring ODE-sampled sequences.
|
| 150 |
+
"""
|
| 151 |
max_len = int(latent_lengths.max().item())
|
| 152 |
latents = latents[:, :max_len, :]
|
| 153 |
valid_mask = torch.arange(max_len, device=latents.device)[None, :] < latent_lengths[:, None]
|
|
|
|
| 253 |
cond = cond * valid_audio_mask.unsqueeze(-1).to(cond.dtype)
|
| 254 |
model_input = x_t * valid_audio_mask.unsqueeze(-1).to(x_t.dtype)
|
| 255 |
|
| 256 |
+
# Mutually exclusive CFG drop buckets. Marginals:
|
| 257 |
+
# P(text dropped) = p_drop_both + p_drop_text
|
| 258 |
+
# P(speaker dropped) = p_drop_both + p_drop_speaker
|
| 259 |
p_drop_both = 0.1
|
| 260 |
p_drop_text = 0.1
|
| 261 |
+
p_drop_speaker = 0.0 # raise in stage 2
|
| 262 |
|
| 263 |
r = torch.rand(B, device=device)
|
| 264 |
b0 = p_drop_both
|
|
|
|
| 308 |
stats = {"fm_loss": fm_loss.detach(), "gen_adv_loss": zero, "speaker_aux_loss": zero}
|
| 309 |
return fm_loss, stats, None
|
| 310 |
|
| 311 |
+
# --- speaker auxiliary prediction ---
|
| 312 |
raw = unwrap_model(model)
|
| 313 |
speaker_aux_loss = zero
|
| 314 |
if need_hidden and hasattr(raw, "predict_speaker"):
|
|
|
|
| 453 |
def parse_args():
|
| 454 |
parser = argparse.ArgumentParser()
|
| 455 |
parser.add_argument("--config", type=str, required=True)
|
| 456 |
+
parser.add_argument("--dataset", type=str, required=True)
|
|
|
|
|
|
|
| 457 |
parser.add_argument("--streaming", action="store_true")
|
| 458 |
parser.add_argument("--dataset_split", type=str, default="train")
|
| 459 |
parser.add_argument("--tokenizer", type=str, default=None)
|
|
|
|
| 521 |
|
| 522 |
def build_data(args, cfg, need_audio):
|
| 523 |
data_cfg = cfg["data"]
|
|
|
|
|
|
|
| 524 |
raw_max = data_cfg["max_audio_seconds"] * data_cfg["codec_rate_hz"]
|
| 525 |
+
|
| 526 |
+
logger.info(f"Loading dataset from {args.dataset}")
|
| 527 |
+
return build_tts_dataloader(
|
| 528 |
+
dataset_path=args.dataset,
|
| 529 |
latent_dim=data_cfg["latent_dim"],
|
| 530 |
need_audio=need_audio,
|
| 531 |
max_text_len=data_cfg["max_text_length"],
|
| 532 |
max_latent_len=int(data_cfg.get("max_latent_length", int(raw_max))),
|
| 533 |
text_pad_id=data_cfg["text_pad_id"],
|
| 534 |
+
train_cfg=cfg["training"],
|
| 535 |
tokenizer=(
|
| 536 |
args.tokenizer
|
| 537 |
or data_cfg.get("tokenizer")
|
| 538 |
or data_cfg.get("tokenizer_name")
|
| 539 |
or data_cfg.get("text_tokenizer")
|
| 540 |
),
|
| 541 |
+
streaming=args.streaming,
|
| 542 |
+
dataset_split=args.dataset_split,
|
| 543 |
)
|
| 544 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 545 |
|
| 546 |
def main():
|
| 547 |
args = parse_args()
|