Використання в PyTorch
Встановіть пакет і залежності (потрібен Git):
python -m pip install git+https://github.com/patriotyk/HolosTTS.git
Для NVIDIA GPU потрібна збірка PyTorch із підтримкою CUDA. Модель автоматично завантажує holos.pt та voices.pt із Hugging Face і кешує їх локально.
Синтез тексту
generate() приймає фонеми, тому спочатку розставляємо наголоси й отримуємо фонетичний запис:
import torch
import soundfile as sf
from ipa_uk import ipa
from ukrainian_word_stress import Stressifier
from holos.models import HolosTTS
device = "cuda" if torch.cuda.is_available() else "cpu"
model = HolosTTS("patriotyk/HolosTTS", device=device)
stressify = Stressifier()
phonemes = ipa(stressify("Привіт! Це український синтез мовлення."))
print(model.list_voices())
voice = model.list_voices()[0] # Можна вибрати іншу назву зі списку.
audio = model.generate(phonemes, voice=voice)
sf.write("speech.wav", audio.squeeze().cpu().numpy(), 24000)
Довгі тексти озвучуйте окремими реченнями. Для локальних файлів передайте HolosTTS("holos.pt", device=device, voices_path="voices.pt").
Голос з аудіозразка
Продовження попереднього прикладу: reference.wav — запис потрібного голосу без музики та сторонніх голосів.
from holos.models import VoiceEncoder
encoder = VoiceEncoder("patriotyk/HolosTTS", device=device)
custom_voice = encoder.encode("reference.wav")
audio = model.generate(phonemes, voice=custom_voice)
sf.write("custom_voice.wav", audio.squeeze().cpu().numpy(), 24000)
voice_encoder.pt завантажується автоматично; для готових голосів цей файл не потрібен.
ONNX
У репозиторії є дві альтернативні повні моделі — для запуску достатньо однієї:
holos.onnx— модель із вагами FP32 для ONNX Runtime, зокрема з CUDA на NVIDIA GPU.holos_cpu_int8.onnx— модель із частиною ваг в INT8 для CPU; займає менше місця, і швидша від FP32 на CPU.
Встановіть ONNX Runtime:
python -m pip install onnxruntime
Приклад самостійного запуску INT8-моделі. PyTorch тут лише читає словник фонем із holos.pt та голоси з voices.pt; синтез виконує ONNX Runtime.
import numpy as np
import onnxruntime as ort
import soundfile as sf
import torch
from huggingface_hub import hf_hub_download
from ipa_uk import ipa
from ukrainian_word_stress import Stressifier
repo = "patriotyk/HolosTTS"
checkpoint = torch.load(
hf_hub_download(repo, "holos.pt"), map_location="cpu", weights_only=True
)
vocab = {symbol: i for i, symbol in enumerate(checkpoint["vocab"])}
del checkpoint
voices = torch.load(
hf_hub_download(repo, "voices.pt"), map_location="cpu", weights_only=True
)
print(list(voices))
voice = voices[next(iter(voices))].reshape(1, 256).float().numpy()
phonemes = ipa(Stressifier()("Привіт! Це український синтез мовлення."))
tokens = [0] + [vocab[c] for c in phonemes if c in vocab] + [0]
session = ort.InferenceSession(
hf_hub_download(repo, "holos_cpu_int8.onnx"),
providers=["CPUExecutionProvider"],
)
audio, lengths = session.run(["audio", "audio_lengths"], {
"tokens": np.array([tokens], dtype=np.int64),
"voice": voice,
"speed": np.array([1.0], dtype=np.float32),
})
sf.write("speech_onnx.wav", audio.reshape(-1)[:int(lengths[0])], 24000)
Входи: tokens — індекси фонем із нульовим токеном на початку та в кінці, int64 [1, T]; voice — вектор голосу, float32 [1, 256]; speed — темп, float32 [1] (1.0 — звичайний, більше — швидше, менше — повільніше; значення має бути додатним). Виходи: audio — аудіосигнал, audio_lengths — його довжина у відліках.
Для FP32 на CPU замініть назву файла на holos.onnx. Для CUDA встановіть onnxruntime-gpu замість onnxruntime у середовищі з сумісними CUDA/cuDNN, виберіть holos.onnx та задайте providers=["CUDAExecutionProvider", "CPUExecutionProvider"].
Файли на Hugging Face
| Файл | Призначення |
|---|---|
holos.pt | Ваги PyTorch-моделі та словник фонем vocab. |
voices.pt | Готові голоси: словник назв і векторів розмірності 256 для PyTorch та ONNX. |
voice_encoder.pt | Ваги моделі, що отримує вектор голосу з аудіозразка. |
holos.onnx | Повна FP32-модель для синтезу через ONNX Runtime. |
holos_cpu_int8.onnx | Компактніша INT8-модель для синтезу на CPU. |