Використання в 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.
Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support