voice_audio_multi/tools/community_models/outetts/convert_outetts_dac.py
Fabio c36510c21e
Some checks failed
Linux Build / Linux cpu (push) Has been cancelled
Linux Build / Linux cpu-clang (push) Has been cancelled
Linux Build / Linux vulkan (push) Has been cancelled
mac-build / macOS CPU (push) Has been cancelled
Nix Build / Nix (cpu) (push) Has been cancelled
Nix Build / Nix (vulkan) (push) Has been cancelled
windows-build / Windows CPU (push) Has been cancelled
Initial import: audio.cpp with Orange Pi documentation
2026-11-04 19:05:22 +01:00

55 lines
1.8 KiB
Python

#!/usr/bin/env python3
"""Convert OuteTTS 1.0's official IBM DAC checkpoint to safetensors.
The official OuteTTS runtime loads a trusted PyTorch checkpoint. audio.cpp uses
the resulting plain tensor source for both native safetensors loading and GGUF
packing; no Python or pickle loader is needed at inference time.
"""
from __future__ import annotations
import argparse
from pathlib import Path
import dac
from safetensors.torch import save_file
def main() -> None:
parser = argparse.ArgumentParser()
parser.add_argument("input", type=Path, help="weights_24khz_1.5kbps_v1.0.pth")
parser.add_argument("output", type=Path, help="output model.safetensors")
parser.add_argument("--overwrite", action="store_true")
args = parser.parse_args()
if args.output.exists() and not args.overwrite:
raise SystemExit(f"output exists (pass --overwrite): {args.output}")
model = dac.DAC.load(str(args.input)).cpu().eval()
if model.sample_rate != 24000 or model.hop_length != 320:
raise RuntimeError(
f"expected OuteTTS DAC at 24 kHz with hop 320, got "
f"{model.sample_rate} Hz / hop {model.hop_length}"
)
if model.n_codebooks != 2 or model.codebook_size != 1024:
raise RuntimeError(
f"expected two 1024-entry codebooks, got "
f"{model.n_codebooks} x {model.codebook_size}"
)
tensors = {name: tensor.detach().contiguous() for name, tensor in model.state_dict().items()}
args.output.parent.mkdir(parents=True, exist_ok=True)
save_file(
tensors,
str(args.output),
metadata={
"format": "pt",
"source": "ibm-research/DAC.speech.v1.0",
"checkpoint": args.input.name,
},
)
print(f"wrote {args.output} ({len(tensors)} tensors)")
if __name__ == "__main__":
main()