Building local conversational voice agents usually comes with a frustrating trade-off: multi-gigabyte models sound great but add 1–2 seconds of latency, while tiny micro-models often suffer from terrible Word Error Rates (skipping words or mumbling consonants).
To see how much quality could fit into a micro footprint, I built Vaniq-Edge—an end-to-end, ~8.5M parameter standalone local TTS engine.
Text goes in, 24kHz mono audio comes out. No external vocoders or second-stage models running in the background.
🛠️ Model Overview
- Total Parameters: ~8.5M
- Model Size: 34.3 MB (FP32)
- Audio Output: 24 kHz high-fidelity mono
- License: Open weights
📊 Benchmarks & Performance
My main goal was keeping the Word Error Rate low so the output stays clear and understandable across long sentences:
-
Word Error Rate (Whisper WER):
2.94% -
Predicted Quality (UTMOS22):
4.35 / 5.0 -
GPU Latency (CUDA):
< 110msinitial generation (0.064xRTF) -
CPU Speed (1-Core):
0.262xRTF (approx. 3.8x faster than real-time)
⚠️ Known Limitations
I want to be upfront about the trade-offs:
- Single Voice: English-only, single fixed voice. No voice cloning or speaker switching.
- Text Normalization: Complex numbers, unusual abbreviations, or unpunctuated walls of text will still trip it up.
-
High-Frequency Artifacts: You might occasionally notice subtle high-frequency clipping on sharp
sorzsounds.
💻 Quick Start
You can test it locally in Python:
pip install torch torchaudio phonemizer espeakng-loader==0.2.4 num2words scipy huggingface_hub Unidecode
import sys
import torch
import scipy.io.wavfile as wavfile
from huggingface_hub import snapshot_download
# Download model weights from Hugging Face
model_path = snapshot_download(repo_id="Abiray/Vaniq-Edge")
if model_path not in sys.path:
sys.path.insert(0, model_path)
from inference import VaniqTTS
# Initialize
device = "cuda" if torch.cuda.is_available() else "cpu"
tts = VaniqTTS(model_path, device=device)
# Synthesize 24kHz Audio
sample_rate, wav_array = tts.synthesize("Hello world! Vaniq-Edge is running locally.")
wavfile.write("output.wav", sample_rate, wav_array)
🔗 Try the Demo / Links
Hugging Face Model Repo: Abiray/Vaniq-Edge
Interactive Playground (ZeroGPU): Vaniq-Edge Demo Space
If you test it out, try throwing some difficult text at it—unusual names, numbers, or tongue twisters—and let me know how it handles edge cases in the comments!