Синтез речи (TTS) на GPU: качество vs латентность

Задача страницы. Инженерный гид по построению TTS‑сервисов на GPU: выбор стеков «текст→мел‑спектрограмма→вокодер», низкая латентность для интерактива vs офлайн‑батчи высокого качества, стриминг (SSE/WebSocket), измерения (TTFA, jitter, RTF), тюнинг и экономика на профилях 24/48/80 ГБ. Все примеры ориентированы на локальный NVMe‑кэш, режимы On‑Demand и Interruptible, и развёртывания в контейнерах/K8s.

TL;DR

  • **Два режима: On‑Demand (реал‑тайм) — минимальная латентность (TTS для ассистентов/презентаций). Interruptible (батчи) — офлайн генерация аудио каталога/видео‑озвучки с упором на качество.
  • Стек: Text Normalize → Phonemize/Tokenizer → Acoustic (FastSpeech‑класс/Glow‑TTS/VITS‑класс) → Vocoder (HiFi‑GAN/BigVGAN/WaveRNN‑класс) → Post‑process.
  • **Латентность vs качество: Ускоряют — не‑АР вокодеры (GAN‑класс), FP16/BF16, фьюзинг, ONNX/TensorRT, стриминг блоками 20–40 мс. Улучшают качество — более тяжёлые акустические модели, высокие частоты дискретизации (22–24–48 кГц), продвинутая пост‑обработка.
  • Ключевые метрики: TTFA (time‑to‑first‑audio), RTF_TTS (synth_time / audio_time), jitter, drop‑rate, p50/p95.
  • Экономика: Cost_per_min = (c_gpu * RTF_TTS / U) / 60; sizing по суммарному RTF_TTS. См. https://cloudcompute.ru/solutions/cost-planner/ и https://cloudcompute.ru/solutions/throughput-vs-latency/
  • Тюнинг: FP16/BF16, кэш фонем/спикер‑эмбеддингов на NVMe, батчирование в батч‑режиме, zero‑copy. См. https://cloudcompute.ru/solutions/performance-tuning/ https://cloudcompute.ru/solutions/fp8-bf16/
  • Наблюдаемость: TTFA, p95 латентности, SPS (samples/sec), GPU util/HBM peak, буферные underruns. См. https://cloudcompute.ru/solutions/monitoring-logging/https://cloudcompute.ru/solutions/llm-inference/observability/

Сценарии использования

  • Интерактив/ассистенты/IVR: мгновенный TTS для ответов, систем оповещения, презентаций.
  • Озвучка видео/курсов/игр: пакетная генерация дорожек с высоким качеством и контролем тембра/стиля.
  • Локализация: мультиязычный TTS, выбор голоса/спикера, управление темпом/паузами/ударениями.
  • Доступность/саблайны: оперативная озвучка текстов, экранные дикторы.
  • A/B‑качество: итеративный рендер в батч‑режиме с несколькими конфигурациями вокодера.

Архитектуры и пайплайны 1) Real‑time TTS (низкая латентность, стриминг блоками)

Text Input

└─> Normalize/Tokenize

└─> GPU: Acoustic Model (stream blocks)

└─> GPU: Vocoder (20–40 ms frames, FP16/BF16)

└─> Ring Buffer (200–500 ms, jitter control)

└─> Stream Out (SSE/WebSocket, PCM/Opus)

Особенности: TTFA ≤ 150–300 мс, стабильный буфер, backpressure, динамический выбор размера блока по загрузке GPU.

2) Батчи высокого качества (Interruptible)

Text Corpus ─┬─> Normalizer/Phonemizer Cache (NVMe)

├─> Work Queue (prio, retries, idempotency)

└─> N x GPU Workers:

├─> Acoustic (HQ)

└─> Vocoder (HQ, non-AR preferred)

└─> Post-process (denoise, loudness)

└─> Writer (WAV/FLAC/segments + metadata)

└─> Object Storage / DB

Особенности: чанкование по фразам/пунктуации, ретраи ≤ 120 с задач, кэш фонем/эмбеддингов, NVMe для временных артефактов.

3) Мульти‑тенант/мульти‑голос

Ingress ─> Auth ─> Router(by tenant/voice/lang) ─> GPU Pools (24/48/80 ГБ)

└> Autoscaler (target U, TTFA SLA)

└> Profiles (low-latency vs HQ)

GPU‑профили и ориентиры

Диапазоны для одновременных потоков real‑time при TTFA ≤ 300 мс, RTF_TTS ≈ 0.3–0.6, U≈0.7. Для батчей используйте формулы из «Экономики».

**Профиль GPU** **Память** **Типичные стеки** **Реал‑тайм потоки\*** **Батчи (параллель)** **Комментарии**
24 ГБ (Compact) 24 ГБ FastSpeech‑класс + **HiFi‑GAN** 1–3 2–6 Низкая латентность, 22–24 кГц, хороший «радио‑уровень» качества.
48 ГБ (Balanced) 48 ГБ VITS‑класс / Glow‑TTS + **HiFi‑GAN/BigVGAN** 3–6 6–12 Баланс качества, поддержка мультиязычия/спикеров, стабильный TTFA.
80 ГБ (HQ) 80 ГБ Усиленный акустик + **BigVGAN** 6–12 12–24 HQ‑аудио (до 48 кГц), тяжёлые голоса/эмоции, пост‑проц фильтры.

* Зависит от частоты дискретизации, длины фраз, EMOTION/STYLE‑фич и пост‑обработки.

См. тюнинг: https://cloudcompute.ru/solutions/performance-tuning/https://cloudcompute.ru/solutions/fp8-bf16/https://cloudcompute.ru/solutions/throughput-vs-latency/

Конфиги и скелеты кода

Docker Compose (реал‑тайм + батчи)

version: "3.9"
x-common-env: &env
 MODELS_DIR: /models
 CACHE_DIR: /var/cache/tts
 SAMPLE_RATE: "24000"
 FRAME_MS: "20"
 TTS_PRECISION: "fp16" # bf16|fp16
 VOICE: "default"
 LANG: "auto"
 STREAM_CODEC: "pcm_s16le" # или opus
services:
 tts-realtime:
 image: cloudcompute/tts-service:latest
 environment:
 <<: *env
 SERVICE_MODE: "realtime"
 TTFA_TARGET_MS: "200"
 deploy:
 resources:
 reservations:
 devices: [{ capabilities: ["gpu"] }]
 ports: ["8081:8081"]
 volumes:
 - /nvme/models:/models
 - /nvme/tts-cache:/var/cache/tts
 command: ["python", "serve_realtime.py", "--host=0.0.0.0", "--port=8081"]
 tts-batch:
 image: cloudcompute/tts-service:latest
 environment:
 <<: *env
 SERVICE_MODE: "batch"
 MAX_TASK_SEC: "120"
 deploy:
 resources:
 reservations:
 devices: [{ capabilities: ["gpu"] }]
 volumes:
 - /nvme/models:/models
 - /nvme/tts-cache:/var/cache/tts
 - /mnt/texts:/data/in
 - /mnt/audio:/data/out
 command: ["python", "run_batch.py", "--input=/data/in", "--output=/data/out"]

K8s (скелет, 1 GPU на под)

apiVersion: apps/v1
kind: Deployment
metadata:
 name: tts-realtime
spec:
 replicas: 2
 selector: { matchLabels: { app: tts-realtime } }
 template:
 metadata:
 labels: { app: tts-realtime }
 spec:
 containers:
 - name: tts
 image: cloudcompute/tts-service:latest
 ports: [{ containerPort: 8081 }]
 env:
 - { name: TTS_PRECISION, value: "fp16" }
 - { name: SAMPLE_RATE, value: "24000" }
 - { name: FRAME_MS, value: "20" }
 - { name: TTFA_TARGET_MS, value: "200" }
 volumeMounts:
 - { name: models, mountPath: /models }
 - { name: cache, mountPath: /var/cache/tts }
 resources:
 limits:
 nvidia.com/gpu: 1
 memory: "24Gi"
 cpu: "4"
 volumes:
 - name: models
 hostPath: { path: /nvme/models }
 - name: cache
 hostPath: { path: /nvme/tts-cache }

Конфиг пайплайна (YAML)

pipeline:
 text:
 normalize: true
 lang: auto
 split_sentences: true
 acoustic:
 model: "fastspeech_like" # или vits_like/glow_tts_like
 precision: "fp16"
 speaker_id: "default"
 style: { speed: 1.0, energy: 1.0, pitch: 1.0 }
 stream_blocks_ms: 80
 vocoder:
 type: "hifigan_like" # или bigvgan_like/wavernn_like
 frame_ms: 20
 precision: "fp16"
 stream: true
 output:
 sample_rate: 24000
 codec: pcm_s16le
 stream_chunk_ms: 40
 formats: [wav, segments_json]

FastAPI: стриминг аудио (SSE с base64‑фреймами)

from fastapi import FastAPI, Body
from sse_starlette.sse import EventSourceResponse
import base64, asyncio, json
app = FastAPI()
async def tts_stream(text: str):
 # Генерируем аудио блоками 20–40 мс: bytes PCM16LE @ 24kHz
 async for frame in synth_blocks(text):
 yield base64.b64encode(frame).decode("ascii")
@app.post("/tts/stream")
async def tts_stream_endpoint(payload: dict = Body(...)):
 text = payload.get("text", "")
 async def event_gen():
 async for b64_chunk in tts_stream(text):
 yield {"event": "audio", "data": b64_chunk}
 yield {"event": "done", "data": "{}"}
 return EventSourceResponse(event_gen())

Пакетная генерация (псевдокод)

from pathlib import Path
from concurrent.futures import ThreadPoolExecutor
def normalize_and_cache(texts):
 # нормализация/фонемизация с кэшем на NVMe
 ...
def synth(text, voice="default", sr=24000):
 mel = acoustic_infer(text, voice=voice, precision="fp16", stream=False)
 wav = vocoder_infer(mel, sr=sr, precision="fp16")
 return postprocess(wav)
def batch_tts(input_dir, output_dir, workers):
 texts = [p.read_text() for p in Path(input_dir).glob("*.txt")]
 texts = normalize_and_cache(texts)
 with ThreadPoolExecutor(max_workers=workers) as ex:
 for i, wav in enumerate(ex.map(synth, texts)):
 write_wav(Path(output_dir)/f"utt_{i:06d}.wav", wav, sr=24000)
``` **Наблюдаемость, метрики, алерты**

**Метрики (Prometheus‑стиль):**

- **TTFA**: tts\_ttfa\_seconds{mode=rt} — время до первого аудиофрейма. Цель p95 ≤ 0.3 с.
- **RTF\_TTS**: tts\_rtf{mode=rt|batch} — отношение времени синтеза к длительности аудио.
- **Latency**: tts\_latency\_seconds{phase=normalize|acoustic|vocoder|post} (p50/p95).
- **Throughput**: tts\_samples\_per\_sec, tts\_frames\_per\_sec.
- **Jitter**: tts\_jitter\_ms — вариации интервала выдачи фреймов.
- **Drops/Underruns**: tts\_buffer\_underrun\_total, tts\_stream\_drop\_rate.
- **GPU**: tts\_gpu\_utilization, tts\_gpu\_memory\_bytes, tts\_gpu\_mem\_peak\_bytes.
- **I/O**: tts\_nvme\_read\_mb\_s, tts\_nvme\_write\_mb\_s, hit‑rate кэша фонем/спикеров.

**Алерты (примеры):**

- TTFA\_p95 &gt; 0.5s 5 мин — увеличить пул low‑latency или уменьшить stream\_blocks\_ms.
- RTF\_TTS\_p95 &gt; 0.8 — деградация; проверить акустик/вокодер/precision/параллелизм.
- GPU\_mem\_peak / HBM &gt; 0.9 — снизить размер блоков/включить offload/оптимизировать граф.
- buffer\_underrun\_total &gt; 0 — увеличить ring buffer до 300–500 мс, проверить backpressure.

См. <https://cloudcompute.ru/solutions/monitoring-logging/> и <https://cloudcompute.ru/solutions/llm-inference/observability/>

## **Экономика и формулы**

Обозначения: c\_gpu — цена GPU/час, U — целевая загрузка GPU, RTF\_TTS — t\_synth / t\_audio.

- **Сколько GPU для стриминга:
 GPU\_count = ceil( (Σ RTF\_TTS\_streams) / U )
 Пример: 10 потоков, каждый RTF\_TTS≈0.4, U=0.7 → ceil((10×0.4)/0.7)=6 GPU.
- **Стоимость минуты аудио:
 Cost\_per\_min = (c\_gpu \* RTF\_TTS / U) / 60.
- **Батчи (время партии):
 T\_batch ≈ (RTF\_TTS × L\_audio\_total) / (GPU\_count × U).
- **Кэш выгоден, если** Hit\_rate\_cache × t\_precompute &gt; t\_miss\_overhead.
 Кэшируйте фонемизацию и спикер‑эмбеддинги на NVMe.

См. <https://cloudcompute.ru/solutions/cost-planner/> и <https://cloudcompute.ru/solutions/throughput-vs-latency/>

**Безопасность и политики**

- **PII в тексте:** фильтры/маскирование (телефоны, адреса) до логирования.
- **Голоса/спикеры:** храните эмбеддинги/референсы отдельно, с доступом по ролям.
- **Ретеншн:** временные артефакты (мел‑спектры, промежуточные WAV) — авто‑очистка по TTL.
- **Секреты:** ключи/токены — только через Secret‑хранилища/переменные окружения.
- **Изоляция:** отдельные GPU‑пулы для тенантов/языков, контроль доступа к бакетам.

Подробнее: <https://cloudcompute.ru/solutions/security/> • <https://cloudcompute.ru/solutions/llm-inference/guardrails/>

**Траблшутинг**

<table><tbody><tr><td>**Симптом**

</td><td>**Возможная причина**

</td><td>**Решение**

</td></tr><tr><td>Долгий TTFA

</td><td>Крупные блоки/инициализация на запрос

</td><td>Подогрев, stream\_blocks\_ms 60–80, кэш моделей/эмбеддингов

</td></tr><tr><td>Дребезг/«металл»

</td><td>Агрессивный вокодер/низкая частота

</td><td>Переключить на HQ‑вокодер, 24–48 кГц, мягкий пост‑фильтр

</td></tr><tr><td>Паузы «ломаются»

</td><td>Сплит по пунктуации некорректен

</td><td>Улучшить нормализацию, ограничить длину фразы, расставить SSML‑паузу

</td></tr><tr><td>Статтеринг/повторы

</td><td>Нестабильность акустика при длинных фразах

</td><td>Короткие блоки, ограничить max‑len, стабилизировать prosody параметры

</td></tr><tr><td>Щелчки между блоками

</td><td>Границы фреймов/неконсистентный gain

</td><td>Кросс‑фейд 5–10 мс, общий loudness‑норм, единый dither

</td></tr><tr><td>Jitter/underruns

</td><td>Недогружен ring buffer/нет backpressure

</td><td>Буфер 200–500 мс, управление темпом стриминга, фикс потоков

</td></tr><tr><td>VRAM OOM

</td><td>Тяжёлый стек/высокая частота/много потоков

</td><td>FP16/BF16, уменьшить блоки, разделить акустик/вокодер по пулам

</td></tr><tr><td>Низкий U

</td><td>Мелкие задачи/частые переключения

</td><td>Микро‑батчинг для батч‑режима, pinning, совмещение очередей

</td></tr><tr><td>Качество «плоское»

</td><td>Неверные style/pitch/energy

</td><td>Калибровка style‑параметров, контроль скорости речи

</td></tr></tbody></table>

См. <https://cloudcompute.ru/solutions/performance-tuning/> • <https://cloudcompute.ru/solutions/interruptible-patterns/>

**Как запустить в cloudcompute.ru**

1. Откройте **Шаблоны запусков**: <https://cloudcompute.ru/solutions/templates/>
 Выберите **TTS (Real‑time)** или **TTS (Batch)**.
2. Профиль GPU: **24/48/80 ГБ**. Для интерактива — low‑latency стек (HiFi‑GAN‑класс), для HQ — BigVGAN‑класс.
3. Диски/кэш: смонтируйте /nvme/models и /nvme/tts-cache; для батчей — /mnt/texts и /mnt/audio.
4. Настройте переменные окружения (частоты, блоки, precision, голос/язык) как в docker-compose.yml.
5. Для продакшна: автоскейл по U/TTFA, отдельные пулы на low‑latency и HQ, мониторинг/алерты.

Дополнительно:
[ https://cloudcompute.ru/solutions/triton-inference-server/](https://cloudcompute.ru/solutions/triton-inference-server/) — сервинг моделей через Triton/ONNX/TensorRT.
[ https://cloudcompute.ru/solutions/gradio-fastapi/](https://cloudcompute.ru/solutions/gradio-fastapi/) — быстрый UI/эндпойнты.
[ https://cloudcompute.ru/solutions/containers-ci-cd/](https://cloudcompute.ru/solutions/containers-ci-cd/) — сборка и доставка контейнеров.

**Чек‑лист перед продом**

- Замерены TTFA p50/p95, RTF\_TTS p50/p95, jitter под целевой корпус.
- Выбран стек под профиль (24/48/80 ГБ) и SLA; запас по U ≥ 0.2.
- NVMe‑кэш подключён; кэш фонем/эмбеддингов активен.
- Стриминг блоками 20–40 мс; ring buffer 200–500 мс; backpressure протестирован.
- Форматы вывода и кодеки проверены (WAV/Opus/segments JSON).
- Алерты по TTFA/RTF/GPU‑HBM/underruns включены.
- Политики PII/ретеншна и доступов к голосам внедрены.
- Interruptible‑джобы идемпотентны, ретраи ≤ 120 с.
- Нагрузочное тестирование ≥ 30 мин на целевом профиле.

**Навигация**

- Хаб «Решения»: <https://cloudcompute.ru/solutions/>
- Шаблоны запусков: <https://cloudcompute.ru/solutions/templates/>
- Планирование стоимости: <https://cloudcompute.ru/solutions/cost-planner/>
- Производительность и тюнинг: <https://cloudcompute.ru/solutions/performance-tuning/>
- Throughput vs Latency: <https://cloudcompute.ru/solutions/throughput-vs-latency/>
- FP8/BF16: <https://cloudcompute.ru/solutions/fp8-bf16/>
- Multi‑GPU: <https://cloudcompute.ru/solutions/multi-gpu/>
- Хранение и данные: <https://cloudcompute.ru/solutions/storage-data>
- Безопасность: <https://cloudcompute.ru/solutions/security/>
- Мониторинг и логи: <https://cloudcompute.ru/solutions/monitoring-logging/>
- Наблюдаемость инференса: <https://cloudcompute.ru/solutions/llm-inference/observability/>
- Interruptible‑паттерны: <https://cloudcompute.ru/solutions/interruptible-patterns/>
- Triton Inference Server: <https://cloudcompute.ru/solutions/triton-inference-server/>
- Gradio + FastAPI: <https://cloudcompute.ru/solutions/gradio-fastapi/>
- CI/CD контейнеров: <https://cloudcompute.ru/solutions/containers-ci-cd/>

Готовы запустить?

Запустить GPU-сервер