CoolFace
Modelpublic

FarmerlineML/voxcpm2-dagbani-sft

sourceHugging Faceapache-2.0updated 2mo agoView on Hugging Face
0likes23downloads
Model Card

VoxCPM2 Dagbani — Full SFT

Full fine-tune of VoxCPM2 on Dagbani speech data. Trained by FarmerlineML for the darli AI agricultural voice assistant.

Training Details

ParameterValue
Base modelopenbmb/VoxCPM2 (2B)
MethodFull SFT (all parameters)
Learning rate1e-5
Batch size1 (grad accum 16, effective batch 16)
Sample rate16kHz (AudioVAE encoder input)
Final step3062

Validation Loss:

Steploss/totalloss/diffloss/stop
01.1074300.8570990.166888
5000.8683300.8199190.032275
10000.8644770.8129960.034321
15000.8552720.8061720.032734
20000.8705910.7981330.048305
25000.8651240.8004810.043095
30000.8514820.7987830.035133

Datasets:

Usage

python
from voxcpm import VoxCPM
import soundfile as sf
import numpy as np

model = VoxCPM.from_pretrained(
    "FarmerlineML/voxcpm2-dagbani-sft",
    load_denoiser=False,
)

def trim_audio(wav, sr, silence_thresh=0.01, max_silence_secs=2.0):
    abs_wav = np.abs(wav)
    window  = int(0.05 * sr)
    n_wins  = len(abs_wav) // window
    max_sil = int(max_silence_secs / 0.05)
    silence_count, cut_sample = 0, len(wav)
    for w in range(n_wins):
        chunk = abs_wav[w * window:(w + 1) * window]
        if chunk.max() < silence_thresh:
            silence_count += 1
            if silence_count >= max_sil:
                cut_sample = (w - max_sil + 1) * window
                break
        else:
            silence_count = 0
    return wav[:min(cut_sample + int(0.1 * sr), len(wav))]

wav = model.generate(
    text="a nyɛla Dagbanli lɔri yubu daluu",
    reference_wav_path="your_dagbani_speaker.wav",
    cfg_value=2.0,
    inference_timesteps=15,
    retry_badcase=False,
    max_len=max(50, len(text) * 4),
)
wav = trim_audio(wav, 48000)
sf.write("output.wav", wav, 48000)

Repo Structure

├── model.safetensors        # Model weights (~9.2GB)
├── audiovae.pth             # AudioVAE decoder
├── config.json              # Model architecture config
├── tokenizer.json           # Tokenizer
├── training/
│   ├── train.log            # Full training log
│   ├── val_loss_summary.txt # Validation losses per checkpoint
│   └── training_state.json  # Final training state
└── tensorboard/             # TensorBoard event files

Notes

  • —Reference audio is required at inference for voice identity anchoring
  • —Use max_len=max(50, len(text) * 4) to prevent hallucination after sentence end
  • —A post-generation 2-second silence trim is strongly recommended