Зачем вам streaming TTS, если ваш ассистент все еще бубнит как робот?
380 миллисекунд. За это время человеческий мозг даже не успевает осознать, что ждет ответ. Это время от отправки текста до первого звука (TTFA) в новой версии FishSpeech S2 Pro 2.0.0. Если в голосовых ассистентах на DGX Spark бились за 766 мс на весь пайплайн, то здесь речь только о синтезе. И нет, это не маркетинг - это конкретный код, который мы разберем ниже.
Что умеет FishSpeech S2 Pro в 2026 году
Это не просто апдейт. FishSpeech S2 Pro 2.0.0 - полный редизайн архитектуры под streaming. Контекстное осознание из контекстного TTS здесь никуда не делось. Модель видит абзац целиком, понимает пунктуацию, но генерирует аудио потоково.
- Поддержка streaming генерации из коробки
- TTFA 380 мс на RTX 5090 (и около 450 мс на RTX 4090)
- Иерархический трансформер на 580M параметров (оптимизирован для потоковой работы)
- Диффузионный кодек FastAudio 3.0 - генерация за 2 шага
- Нативная поддержка torch.compile и CUDA графов в PyTorch 2.5
Streaming архитектура: как она работает по кусочкам
Старая схема: текст целиком -> энкодер -> декодер -> аудио целиком. Новая: текст разбивается на чанки по 5-7 слов. Каждый чанк проходит через контекстное окно, которое помнит предыдущие 3 чанка. Аудио генерируется и отправляется сразу, пока модель работает над следующим куском.
Звучит просто, но в коде это адская синхронизация потоков. Ошибка в одном месте - и вы получаете аудио с пропусками или артефактами на стыках.
На что способны конкуренты: когда выбрать FishSpeech, а когда Soprano-Factory
| Инструмент | TTFA (15.03.2026) | Качество голоса | Контекстное осознание | Лучший сценарий |
|---|---|---|---|---|
| FishSpeech S2 Pro 2.0.0 | 380 мс | Высокое (близко к человеческому) | Да, иерархический трансформер | Streaming ассистенты, живые диалоги |
| Soprano-Factory | 15 мс | Среднее (роботизированные ноты) | Нет | Встроенные системы, где каждые 10 мс на счету |
| KaniTTS2 | ~200 мс | Очень высокое (ElevenLabs уровень) | Ограниченно (только просодия) | Озвучка контента, подкасты |
| Qwen3-TTS.cpp | 100-150 мс на CPU | Хорошее | Нет | Развертывание на серверах без GPU |
Видите разницу? FishSpeech не самый быстрый, но единственный, кто сочетает низкий TTFA с контекстным пониманием. Если вам нужна максимальная скорость - Soprano-Factory. Если качество в офлайн - KaniTTS2. Если streaming с осмысленными паузами и интонацией - только FishSpeech S2 Pro.
Код, который заставит ваш TTS летать: от базового streaming до CUDA графов
Теория - это скучно. Вот как выглядит реальный код на PyTorch 2.5 для RTX 5090. Установите fish-speech==2.0.0 и torch==2.5.1 с CUDA 12.5.
1Базовый streaming пайплайн (TTFA ~600ms)
Так делать можно, но не нужно. Задержка все еще высокая из-за накладных расходов PyTorch.
import torch
from fish_speech import FishSpeechS2Pro, StreamConfig
# Загружаем модель (автоматически на GPU если доступен)
model = FishSpeechS2Pro.from_pretrained("fish-speech/s2-pro-v2.0.0")
model.eval()
# Конфиг streaming
config = StreamConfig(
chunk_size=5, # слов в чанке
overlap=2, # перекрытие слов для плавности
use_context=True, # использовать контекстное окно
)
def generate_stream(text):
# Итератор по аудио чанкам
for audio_chunk in model.stream_generate(text, config):
# audio_chunk - raw PCM данные
yield audio_chunk
# Отправляем куда нужно - в WebRTC, в аудио буфер
# Использование
for chunk in generate_stream("Привет, как твои дела?"):
play_audio(chunk) # Ваша функция воспроизведения2Добавляем torch.compile (TTFA ~480ms)
PyTorch 2.5 научился компилировать динамические графы, что критично для streaming. Но есть нюанс - первый вызов будет медленным (компиляция), зато последующие полетят.
import torch
from fish_speech import FishSpeechS2Pro, StreamConfig
model = FishSpeechS2Pro.from_pretrained("fish-speech/s2-pro-v2.0.0")
model.eval()
# КРИТИЧЕСКИ ВАЖНО: mode='max-autotune' для RTX 5090
model = torch.compile(model, mode='max-autotune', fullgraph=True)
config = StreamConfig(chunk_size=5, overlap=2)
# Первый вызов - компиляция (~2-3 секунды)
first_audio = next(model.stream_generate("Тестовый текст", config))
print(f"Первый чанк скомпилирован, длина: {len(first_audio)}")
# Все последующие вызовы - быстро
def fast_stream(text):
for chunk in model.stream_generate(text, config):
yield chunkНе используйте torch.compile без fullgraph=True для streaming. Иначе PyTorch будет компилировать каждый чанк отдельно, что убивает производительность. Если fullgraph падает с ошибкой - значит в вашем графе есть динамика, которую нужно устранить.
3CUDA графы - финальный удар по задержке (TTFA ~380ms)
Это самый сложный, но самый эффективный метод. Мы фиксируем граф вычислений для конкретной длины чанка и переиспользуем его. На RTX 5090 с новой архитектурой это дает максимальный прирост.
import torch
from fish_speech import FishSpeechS2Pro
model = FishSpeechS2Pro.from_pretrained("fish-speech/s2-pro-v2.0.0")
model.eval()
model = torch.compile(model, mode='max-autotune', fullgraph=True)
# Подготавливаем статичные тензоры для графа
chunk_tokens = torch.randint(0, 1000, (1, 7), device='cuda') # 7 токенов = ~5 слов
context = torch.zeros(1, 3, 768, device='cuda') # Контекстное окно
# Захватываем CUDA граф
stream = torch.cuda.Stream()
with torch.cuda.stream(stream), torch.no_grad():
# Первый запуск для захвата графа
static_output = model._forward_chunk(chunk_tokens, context)
graph = torch.cuda.CUDAGraph()
with torch.cuda.graph(graph):
cached_output = model._forward_chunk(chunk_tokens, context)
# Теперь используем граф для каждого чанка
def ultra_fast_chunk(tokens, context):
chunk_tokens.copy_(tokens)
context.copy_(context)
graph.replay() # Молниеносное выполнение
return cached_output.clone()
# В реальном пайплайне вы вызываете ultra_fast_chunk для каждого чанка текстаДа, код стал сложнее. Да, нужно внимательно работать с памятью. Но результат - 380 мс TTFA вместо 600. Стоит того, если вы делаете коммерческий ассистент.
Кому подойдет FishSpeech S2 Pro, а кому лучше забыть
Берите FishSpeech если:
- Делаете голосового ассистента с живым диалогом (как в статье про убийство задержки для нескольких пользователей)
- Нужно streaming озвучивание длинных текстов с сохранением интонации
- Есть RTX 5090 или хотя бы 4090 (на 3090 TTFA будет ~550 мс)
- Готовы возиться с torch.compile и CUDA графами
Забудьте про FishSpeech если:
- Работаете на CPU или слабом GPU (выбирайте Qwen3-TTS.cpp)
- Нужна максимальная скорость в 15 мс (Soprano-Factory ваш выбор)
- Хотите простой 'установил и работает' (посмотрите на KaniTTS2)
- Озвучиваете книги офлайн (тут лучше Проект Прометей с батч-обработкой)
Главный совет на 2026 год: не гонитесь за абстрактными метриками. Возьмите FishSpeech S2 Pro, Soprano-Factory и KaniTTS2. Запустите на своем железе с реальными текстами из вашего приложения. Услышьте разницу. 380 мс против 15 мс - это не просто цифры, это компромисс между скоростью и человечностью. И только ваши пользователи скажут, какой компромисс им подходит.