Text-to-Speech
VoxCPM
English
voxcpm2
voice-cloning
quantization
fp8
torchao
w8a8
blackwell
english
v1
Instructions to use ajh-code/VoxCPM2-FP8-W8A8 with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- VoxCPM
How to use ajh-code/VoxCPM2-FP8-W8A8 with VoxCPM:
import soundfile as sf from voxcpm import VoxCPM model = VoxCPM.from_pretrained("ajh-code/VoxCPM2-FP8-W8A8") wav = model.generate( text="VoxCPM is an innovative end-to-end TTS model from ModelBest, designed to generate highly expressive speech.", prompt_wav_path=None, # optional: path to a prompt speech for voice cloning prompt_text=None, # optional: reference text cfg_value=2.0, # LM guidance on LocDiT, higher for better adherence to the prompt, but maybe worse inference_timesteps=10, # LocDiT inference timesteps, higher for better result, lower for fast speed normalize=True, # enable external TN tool denoise=True, # enable external Denoise tool retry_badcase=True, # enable retrying mode for some bad cases (unstoppable) retry_badcase_max_times=3, # maximum retrying times retry_badcase_ratio_threshold=6.0, # maximum length restriction for bad case detection (simple but effective), it could be adjusted for slow pace speech ) sf.write("output.wav", wav, 16000) print("saved: output.wav") - Notebooks
- Google Colab
- Kaggle
Download client.py from ajh-code/VoxCPM2-FP8-W8A8: direct link, hf CLI and curl.
- Browser
- Download file 2.85 kB
-
https://huggingface.co/ajh-code/VoxCPM2-FP8-W8A8/resolve/main/client.py
- Command line
-
hf download hf://ajh-code/VoxCPM2-FP8-W8A8/client.py
-
curl -L -o client.py https://huggingface.co/ajh-code/VoxCPM2-FP8-W8A8/resolve/main/client.py
2.85 kB
| #!/usr/bin/env python3 | |
| """Small standard-library client for the bundled llama-compatible TTS API.""" | |
| from __future__ import annotations | |
| import argparse | |
| import base64 | |
| import json | |
| import urllib.error | |
| import urllib.request | |
| from pathlib import Path | |
| def _parser() -> argparse.ArgumentParser: | |
| parser = argparse.ArgumentParser(description="Generate speech with VoxCPM2 FP8 W8A8 V1") | |
| parser.add_argument("--url", default="http://127.0.0.1:8080/v1/audio/speech") | |
| parser.add_argument("--text", required=True) | |
| parser.add_argument("--output", type=Path, default=Path("output.wav")) | |
| parser.add_argument("--reference-audio", type=Path) | |
| parser.add_argument("--reference-text", default="") | |
| parser.add_argument("--seed", type=int, default=42) | |
| parser.add_argument("--cfg-value", type=float, default=2.0) | |
| parser.add_argument("--inference-timesteps", type=int, default=10) | |
| parser.add_argument("--max-steps", type=int, default=200) | |
| parser.add_argument("--temperature", type=float, default=1.0) | |
| parser.add_argument("--timeout", type=float, default=600.0) | |
| parser.add_argument("--force", action="store_true") | |
| return parser | |
| def main() -> None: | |
| args = _parser().parse_args() | |
| output = args.output.expanduser().resolve() | |
| if output.exists() and not args.force: | |
| raise SystemExit(f"Refusing to overwrite {output}; pass --force to replace it") | |
| payload = { | |
| "model": "voxcpm", | |
| "input": args.text, | |
| "voice": "default", | |
| "response_format": "wav", | |
| "seed": args.seed, | |
| "cfg_value": args.cfg_value, | |
| "inference_timesteps": args.inference_timesteps, | |
| "max_steps": args.max_steps, | |
| "temperature": args.temperature, | |
| } | |
| if args.reference_audio is not None: | |
| reference = args.reference_audio.expanduser().resolve() | |
| payload["reference_audio"] = base64.b64encode(reference.read_bytes()).decode() | |
| if args.reference_text: | |
| payload["reference_text"] = args.reference_text | |
| request = urllib.request.Request( | |
| args.url, | |
| data=json.dumps(payload).encode(), | |
| headers={"Content-Type": "application/json"}, | |
| ) | |
| try: | |
| with urllib.request.urlopen(request, timeout=args.timeout) as response: | |
| content_type = response.headers.get_content_type() | |
| if content_type != "audio/wav": | |
| raise RuntimeError(f"Expected audio/wav, received {content_type}") | |
| audio = response.read() | |
| except urllib.error.HTTPError as exc: | |
| detail = exc.read().decode(errors="replace") | |
| raise SystemExit(f"TTS request failed with HTTP {exc.code}: {detail}") from exc | |
| output.parent.mkdir(parents=True, exist_ok=True) | |
| output.write_bytes(audio) | |
| print(f"Wrote {len(audio)} bytes to {output}") | |
| if __name__ == "__main__": | |
| main() | |