Всем привет! Я Гриша Стерлинг, лид команды TTS в Сбере. Мы сделали новый синтез речи, он на голову выше старого, особенно по естественности и человечности. Мы так и называем его – «новый синтез», или GigaTTS. Он умеет смеяться, справляется со всеми эмоциями, говорит как живой человек.

Сразу предлагаю поболтать с ним в голосовом режиме GigaChat.

Основное наше достижение – мы отошли от одного универсального синтеза речи на все случаи жизни в сторону уникальных специализированных голосов. Так родились стиль Freespeech, синтез голосов операторов колл-центров и озвучивание подкастов. Дикторская подача никуда не делась, она доступна, но мы уверены, что в ближайшем будущем все клиенты захотят использовать более естественные голоса. Вы только послушайте разницу:

В этой статье я расскажу технические подробности, как мы пришли именно к такой модели, покажу примеры и похвастаюсь метриками. Отдельно расскажу про новые возможности, которые открыл нам LLM-based синтез. Текст получился большой, он будет интересен ML-специалистам, AI-энтузиастам и людям из продуктов, использующих синтез речи. А пока — с чего мы начинали.

Что было раньше

Синтез речи у нас существует уже больше 6 лет. В первую очередь он используется как голоса наших ассистентов Салют. Эти модели звучат на наших устройствах, Афину можно услышать, позвонив по номеру 900, а совсем недавно мы сделали синтез Сберкота.

Мы уже рассказывали про наши разработки в области моделей синтеза речи: 1, 2 и 3. Если коротко, то мы улучшили авторегрессионный Tactron 2 дополнительными модулями, которые улучшали финальное качество синтеза. Для своего времени такие модели неплохо синтезировали голос. Но однажды вышла статья про новую архитектуру — VITS. Мы обучили на наших данных открытую реализацию и сравнили с нашими лучшими моделями. Сначала получилось хуже, но мы увидели в ней потенциал. Потом применили к VITS все наши оптимизации и наработки и добились сильного улучшения качества. Этой моделью мы пользовались до недавнего времени.

В какой-то момент улучшать базовое качество стало очень сложно. Поэтому мы сконцентрировались на новых возможностях. Например, из самого интересного, мы реализовали управление эмоциональной окраской голосов, а также сделали мультиязычный синтез.

А что было в мире?

Появились новые подходы и продукты с другим качеством и возможностями. Про них можно написать отдельный обзор, что-то мы разобрали на наших лекциях по речевым технологиям. Но в этой статье мы обсудим только синтез на основе больших языковых моделей.

Обычно LLM-based синтез состоит из двух этапов: сначала авторегрессионная модель генерирует акустические токены, а потом их озвучивает декодер. Одной из первых таких разработок была довольно качественная, но медленная Tortoise TTS. Её успех породил целое направление исследований, после неё стало появляться всё больше архитектур для синтеза речи на основе LLM.

Сегодня существует два магистральных подхода:

  • Большая языковая модель предсказывает простые текстовые токены, допустим, семантические. В них мало информации о дикторе и интонациях. Затем токены превращает в звук сложный декодер, чаще всего диффузионный, который и привносит в речь всё богатство.

  • LLM генерирует токены со всей метаинформацией о тембре, интонациях и прочих нюансах голоса, а простой декодер их озвучивает.

Судя по многим исследованиям, первый подход лучше работает для клонирования речи. А для обычного синтеза на основе большого количества высококачественных записей одного диктора лучше второй — у нас именно такая ситуация.

Первая успешная модель

Мы выбрали вариант с полностью авторегрессионным синтезом, где всё богатство речи хранится в токенах. В нём ответственность за тембр и интонации возложена на LLM, что обеспечивает маленькую задержку, но требует очень хорошо обученной базовой модели, особой точности при разметке данных и применения разных технических ухищрений (например, «антициклин» для снижения вероятности бесконечного повторения токена мы реализовали с помощью простого repetition penalty).

Первую разговаривающую модель мы сделали так:

  1. Взяли Gigachat Lite после DPO (по всем нашим экспериментам было не важно, брать ли претрейн, SFT или DPO стадию обучения, взяли просто лучший по текстовым метрикам).

  2. Обучили DAC-токенизатор на наших данных. В качестве энкодера взяли родной GigaAM, сделали RVQ-квантование эмбеддингов звука и Hifigan декодер. Частота дискретизации 25 токенов в секунду.

  3. Обучили модель на более чем пятистах часах студийных данных (больше 100 дикторов, но в основном голоса ассистентов Салют).

  4. Подключили аудиоадаптер к выходу размороженного ГигаЧата и обучили авторегрессионно предсказывать все RVQ токены разом на каждый timestamp.

Хотя данных было даже больше, чем при обучении qVITS, модель говорила заметно хуже. Голоса звучали иногда словно на зажёванной кассете и путали буквы в словах. Но мы получили главный положительный сигнал: в голосе была некоторая живость, которую я слышал в последний раз в авторегрессионных моделях на основе Tacotron. Нам показалось, что нужно лишь решить конкретные проблемы с качеством, и заживём.

Мы улучшали модель с трёх сторон: с точки зрения архитектуры, данных и вычислительных ресурсов. С последним всё просто: добились, чтобы нам дали больше видеокарт. А над архитектурой модели и данными мы проделали гигантский объём работы.

Токенизаторы речи

Задача токенизатора звука — снизить размерность звука с десятков тысяч чисел в секунду всего до десятков. Причем так, чтобы из этих чисел декодер мог восстановить оригинальный звук без искажений.

Если кто-то думает, что это невозможно, то буквы русского языка плюс идентификатор говорящего — вот и готов простейший токенизатор на 10 т/c. Для него, правда, нужен очень мощный декодер, забирающий на себя всю суть задачи синтеза речи. Это глупый пример, но он показывает, что такое разреженное представление звука принципиально возможно.

Когда мы обсуждали архитектуру токенизатора, мы поняли три вещи:

  • Нет нужды делать универсальный токенизатор для всех звуков, для TTS можно сконцентрироваться на чистой студийной речи.

  • Очень важно уменьшить частоту токенов, чтобы гонять LLM как можно реже.

  • У аудиоэнкодеров есть bias либо в семантику (что сказано), либо в акустику (как и кем сказано).

В качестве исходного токенизатора у нас был DAC. Он использует Residual Vector Quantization (RVQ) — это способ представления единицы звука не одним токеном, а набором токенов, когда каждый последующий уточняет предыдущие. Это снижает размерность по времени, но добавляет новую — по глубине. Для такого подхода нужен аудиоэнкодер, мы взяли GigaAM. Получилась дискретизация 25 т/с, что уже лучше всех открытых на тот момент токенизаторов. И начали думать, как ещё больше сжать дискретизацию по времени.

Нам очень понравился подход SNAC с разной частотой токенов для нижних и верхних уровней. То есть самые грубые токены можно делать редкими, а уточняющие — частыми.

По нашим экспериментам прореживание в четыре раза приводило к критическим артефактам, а вот с двукратным был успех, хотя редкие артефакты всё же проявлялись.

Сравнение организации токенов в ванильном RVQ и предложенной в статье SNAC
Сравнение организации токенов в ванильном RVQ и предложенной в статье SNAC

Однажды мы попробовали энкодер GigaAM-v2. Чёткость восстановленной речи выросла, но пропали детали интонаций и похожесть голоса на оригинал. Дело было в том, что у второй версии сильный bias в сторону семантической составляющей речи. Мы поняли, что нужно два энкодера: семантический и акустический (либо один акустический энкодер с semantic distillation, но такой подход показал себя хуже). Эту же идею мы нашли в статье XCodec и реализовали у себя. В ней акустический энкодер учится с нуля так, чтобы добавить всю недостающую информацию о звуке к семантическим признакам. Это решило все проблемы с токенизацией. Мы даже отказались от SNAC, оставив везде всего 12,5 токенов в секунду на всех уровнях.

Финальная архитектура нашего токенизатора речи, основанная на статье XCodec.
Финальная архитектура нашего токенизатора речи, основанная на статье XCodec.

Следующий шаг — наилучшим образом предсказывать токены языковой моделью.

Архитектура нового синтеза

LLM обычно предсказывает текстовые токены из некоторого словаря. Это делается авторегрессионно, то есть каждое следующее предсказание делается на основе всех предыдущих. Мы модифицировали стандартную трансформерную LLM так, чтобы словарь был не текстовым, а акустическим, и на каждом шаге делали не одно предсказание, а восемь (по количеству RVQ-токенов). В каком-то смысле это задача машинного перевода, когда текст нужно перевести на другой «язык» — звуковой.

Это можно сделать двумя способами: переучив LLM на новый словарь (Decoder-Only), либо добавив адаптер к выходу текстовой модели (Thinker-Talker). Мы попробовали оба подхода, и сформулировали для себя такие преимущества:

  • DO: не звездолёт, а нативный подход; проще реализовать в runtime; много обучаемых весов.

  • TT: модель не забывает текст; можно включить LoRA; можно предобучить разные части модели.

Мы до сих пор так и не определились, какой подход лучше. Кажется, что стандартную задачу обычного синтеза речи лучше решать с помощью DO (именно такая модель сейчас попала в релиз), а при любых усложнениях с текстовыми промптами лучше себя показывает TT.

Сравнение архитектур синтеза, использующих LLM
Сравнение архитектур синтеза, использующих LLM

Входные данные для обеих архитектур – текстовые токены. Дальше они обрабатываются трансформерными слоями языковой модели и получаются эмбеддинги, так называемый hidden state модели. В нем обычно содержится вся информация о смысле слов, контексте и так далее. Затем для DO и TT есть развилка: в какой момент в этом скрытом представлении должна появляться информация о том, какой звуковой токен предсказать следующим. Для подхода DO мы учим модель добавлять эту информацию в hidden, а для TT – учим отдельный трансформер Talker добавлять эту информацию уже в свое внутреннее состояние. А в самом конце обеих архитектур стоит аудио голова, отвечающая непосредственно за генерацию звуковых токенов.

Обычно LLM предсказывает по одному токену на каждом шаге, а в синтезе у нас RVQ глубины 8. Причём модель должна предсказывать токены высокого уровня, основываясь на уже предсказанных токенах с нижнего, чтобы уточняющий токен знал, что именно он уточняет. Но и запускать тяжёлую LLM лишний раз не хочется. Эту проблему можно решить инженерно, предсказывая токены с задержкой, «лесенкой». Или добавить в модель часто используемый в подобных моделях депформер (он же rq-transformer, depth-transformer, depformer). Это особый трансформер, у которого attention считается не по времени, а по глубине представления токенов. Он запускается на каждом шаге большой LLM, работает быстро, уменьшает задержку модели и улучшает качество предсказания токенов.

Схема генерации RVQ токенов «лесенкой»
Схема генерации RVQ токенов «лесенкой»

Следующие эксперименты были связаны с выбором backbone. Мы экспериментировали с разными ГигаЧатами: старым Lite, новым Lite, новым Pro, внутренним Gigachat 3b, а также с открытым Qwen-0.5b. Первые приятные результаты получили на старой Lite модели, но наилучший синтез получили именно на 3b. Это наша внутренняя модель, обученная с применением современных ML-техник вроде multi-latent attention (MLA), multi-token prediction (MTP) и экспоненциальным усреднением весом (EMA). По текстовым возможностям она была лучше предыдущих, даже более тяжёлых моделей.

Тут мы подумали, что финальное качество синтеза напрямую зависит от текстовых метрик базовой модели. Но ни один эксперимент с ещё более «умной» Pro не показал себя лучше, чем 3b, везде было 50/50. На слух качество уже было космическим, так что, скорее всего, на этом этапе мы просто выжали максимум из имеющихся данных.

Данные

На сегодня мы накопили 30 тысяч часов размеченных данных. Из них примерно 1 тысяча — студийные записи в высочайшем качестве. Ещё были аудиокниги, Youtube и записи операторов колл-центров. Пример хорошего пайплайна подготовки данных для синтеза можно найти, например, в статье про Kimi Audio. Всем очевидно, что данных должно быть много, причём разнообразных и идеально чистых. Поэтому расскажу про по-настоящему важное знание, открывшее нам много новых возможностей: system prompt должен быть максимально подробный.

LLM позволяют указать в системном промпте, в какой роли нужно отвечать. Для текстовых моделей можно написать что угодно: описание персонажа; ограничения, что можно и нельзя говорить; подробные примеры решения вашей задачи (few-shots) и т. д. В самом начале мы ради приличия написали в небольшом системном промпте, что от модели требуется предсказывать акустические токены, а также указали идентификатор спикера.

Сегодня в системном промпте описано, читает ли диктор с листа, его роль, скорость речи и чистота разметки. Каждое такое поле объясняет какую-то особенность данных, которую невозможно восстановить из текста и идентификатора спикера.

Самое важное, на мой взгляд, поле в этом списке — роль, которую играет диктор. На слух мы всегда отличим телефонный разговор от чтения аудиокниги, или почти всегда поймём, читает ли человек текст с листочка, видя его впервые, или увлечённо рассказывает историю из своей жизни. Такое можно описать буквально парой слов в системном промпте для модели.

Особенно мне понравилась идея, как использовать грязноватые данные, чтобы модель не портилась, а только улучшалась. У нас были десятки тысяч часов проверенных чистых данных и примерно такой же объём более разнообразных, но хуже размеченных. Если наивно добавить их в обучение, то все авторегрессионные модели сломаются. Чтобы это починить, мы просто указали в системе, что во фразе могут быть лишние звуки, и умная нейронка всё выучила.

Объяснение обучающих данных не только улучшает сходимость модели. Оно позволяет контролировать синтез и позволяет переносить стили между дикторами. Чтобы было, что переносить, мы записали на студии очень много самых разных данных. Мы особенно гордимся Freespeech-голосами и моделями телефонных операторов. С последними всё просто, а вот как добиться максимальной непринуждённости у дикторов? Это была сложная задача. Они упорно не хотели «забывать всё, чему учились в школе», и пришлось менять формат записи.

Мы попробовали играть сценки по несколько раз, записывать диктора в формате интервью, разрешили импровизировать, и даже играли в Alias прямо во время записи. Охватили очень много ситуаций, нюансов и конкретных эмоций, которые встречаются в естественной речи. Дикторы вздыхали, сомневались, экали, смеялись и кашляли — всё это только добавляет живости нашим голосам.

Ну вот, общими словами рассказал про секреты и фишечки, которые мы применили, чтобы обучить наш новый синтез. А сейчас самое время посмотреть, что получилось.

Метрики

Основная метрика, которой мы оцениваем качество, — прямое сравнение двух моделей (side-by-side, SBS). Мы показываем разметчикам два аудио (от нынешнего прода и от кандидата) и спрашиваем, какое из них лучше звучит. Затем усредняем результаты по нескольким сотням примеров и считаем, какая доля людей проголосовала за модель А и за модель Б. Получаются два числа: a/b. Дальше мы смотрим, какая модель победила, и оцениваем статистическую значимость. Обычно считаем метрики для трёх наших главных голосов: Джой, Афины и Сбера.

Ещё есть вспомогательные метрики: human-vs-robot (HVR) и pronunciation sentence error rate (PSER). Первая оформлена как SBS, но мы спрашиваем, какое аудио звучит более естественно и человечно. А при измерении второй мы ищем конкретные ошибки в синтезе, например, лишние паузы, заикания и неправильные интонации. Актуальные метрики на разных тестовых наборах текстов выглядят так:

Новый синтез людям нравится в 2-4 раза чаще, чем старый. И почти всегда новый синтез кажется людям более естественным. Вот несколько примеров аудио от старого и нового синтеза:

В приведённых выше числах скрыта огромная работа. Ещё полгода назад у нас «прокрасились зелёным» только HVR-столбцы, а по SBS были проигрыши. Дальше был огромный этап ablation study, когда мы сравнивали разные комбинации данных и улучшения архитектуры, выигрывали по несколько процентных пунктов. И итеративно пришли к очень приятным финальным результатам. Но по этим метрикам непонятно, хорошо ли в целом получилось и где мы на глобальной арене.

К сожалению, придумать объективную метрику синтеза невозможно. Для этого нужно было бы зафиксировать датасет с конкретным голосом, раздать его всем научным группам и компаниям, заставить их обучить на нём свои лучшие модели, и затем ушами разметчиков сравнивать результаты, какая из них чуть лучше остальных. А затем ссориться из-за того, что в тестовую выборку включили, например, слишком мало вопросительных предложений.

Частичный выход из этой ситуации — публичные арены с моделями от разных команд. В российском сообществе любителей TTS эта тема только зарождается, но уже есть публичный leaderboard с популярными моделями. В ней учитывают разные автоматические метрики, оценивающие общее качество синтеза. Самая показательная и интерпретируемая из них — utmos. Это автоматический mean opinion score (оценка от 1 до 5), причём модель выложена в открытый доступ, чтобы все могли ею пользоваться. В топе лидеров уже есть наши старые публичные модели Борис и Александра, и мы посчитали метрики на этом бенчмарке для нового синтеза (зелёным помечены голоса, обгоняющие всех в этом бенчмарке):

Несмотря на такой успех с метриками, на слух было что-то было не так. С ассистентами было не так приятно разговаривать, они слишком стерильные и правильные. Чувствовалась «зловещая долина», совершенно не было ощущения, что говоришь с живым человеком.

Максимально естественный синтез речи

Работа диктора, как и любая другая, требует профессионализма. Нужно правильно открывать рот, работать с дыханием, стараться чётко выговаривать слова, держать ритм. Такая подача подходит для озвучивания рекламы или дубляжа фильмов, но естественной я не могу её назвать. Несколько лет назад мы попробовали смелую идею: записали дикторов в формате интервью. Задавали им вопросы, просили рассказывать истории из жизни. Не было задания говорить правильно, наоборот, нужно было говорить как человек.

Данные получились интересные, но в целом тогда идея тогда не сработала. Наши прошлые модели не справились с тем, чтобы выучить все особенности такой речи, получилось что-то среднее между диктором и роботом. И так мы бы и забыли про эти данные, если бы меня в какой-то момент не попросили подобрать дикторов для озвучки подкастов. В тот день уже была готова почти финальная модель нового синтеза, я послушал чуть ли не все доступные в ней голоса и очень удивился, как круто звучит Freespeech. Прикладываю тот самый подкаст, и еще один, сделанный по этой статье (да, рекурсия):

Стало ясно, что нам всем нужно. Мы захотели везде иметь такой синтез, в том числе у ассистентов. Начали тестировать, как он ведёт себя в разных ситуациях, на что способен. И решили использовать его в GigaChat Voice Mode.

С голосами телефонных операторов аналогичная история. Голос Афины, например, используется в колл-центре Сбера по номеру 900. У неё хорошо получается озвучить какую-нибудь информацию, но вот звонок клиенту её голосом будет звучать очень странно. Специально для этой задачи мы записали несколько голосов в роли оператора колл-центра. Они повторяли узнаваемые телефонные интонации, говорили «ага, угу», когда слушали клиента на другом конце провода, или «хмм» когда задумывались. В зависимости от контекста говорили то успокаивающе, то настойчиво и бодро, то заботливо сообщали плохие новости. Наш новый синтез все эти нюансы поймал и выучил. На мой слух, он на новом уровне решает известные бизнес-задачи.

Операторские голоса получились на мой слух очень хорошо. Прямо сейчас мы работаем над тем, чтобы заработал перенос этой роли на остальные голоса. Но трансфер других возможностей работает лучше.

Инструктивный синтез

Тему промптинга обучающих примеров можно развивать в сторону очень подробного описания каждого аудио из обучающей выборки. Чем подробнее будет объяснение, тем лучше обучится итоговая модель. Но и тем сложнее подбирать промпт под каждый озвучиваемый текст.

Мы используем компромиссный вариант: для каждого аудио делаем на естественном языке описание общего тона и других характеристик голоса. Подразумевается, что можно не указывать жёстко одну эмоцию, а, например, указать её силу (очень/чуть-чуть), смесь эмоций, динамику (в начале грустно, затем голос переходит в радостный), или проводить аналогии (заботливо, как бабушка) — всё это человеческим языком. В них содержится достаточно информации, чтобы, например, описать сарказм или проговорить ключевое слово чётко и медленно. Такие описания можно писать руками, но можно и составлять с помощью LLM по контексту.

Пример описания аудио в JSON-формате:

{
	"general_tone": "Дружелюбный, приветливый",
	"tempo": "Средний, ровный",
	"pauses": "Короткая пауза перед вопросом",
	"pitch": "Средняя высота, стабильная",
	"volume": "Громкость умеренная, без колебаний",
	"is_whisper": "Нет",
	"rhythm": "Четкий, структурированный",
	"confidence_level": "Высокая уверенность",
	"free_text_description": "Голос звучит дружелюбно и открыто, как будто готов помочь. Ясное и четкое произношение слов создает впечатление профессионализма.",
	"background_noise": "Фоновый шум отсутствует",
	"intonation_patterns": "Вопросительная конструкция в конце фразы"
}

Основную массу записей наших дикторов составляли нейтральные аудио, а также небольшие корпуса особенно экспрессивных примеров конкретных эмоций: радости, грусти и раздражения (в целом этот корпус получился переигранным, поэтому мы стараемся его не использовать). А хотелось покрыть инструкциями весь спектр человеческой экспрессии, включая редкие эмоции и мелкие детали интонаций, и максимально естественно. Такие данные нашлись в остальных наших in the wild корпусах, на которых мы учим модель. Мы разметили их и добавили в обучение модели. Дальше проверили, заработал ли трансфер этих эмоций на наши голоса. Научились делать вот такие примеры, причем ничего похожего дикторы не записывали:

Для этой фичи синтеза, правда, легко найти примеры, когда она работает хуже ожидаемого – когда текст и инструкция сильно расходятся по смыслу. Например, фраза: «Вау, круто, ты большой молодец!» по умолчанию должна быть озвучена с положительной эмоцией в голосе, и если попытаться использовать негативную инструкцию, то модель не понимает, что от неё хотят, и выдаёт нейтральный или неестественный синтез. Так происходит из-за того, в обучении было крайне мало примеров, где инструкция сильно расходилась с контентом. В обучающих данных обычно всё-таки текст и эмоция соответствуют друг другу. Получается своего рода out of domain, к которому наша модель была не готова. Если вы знаете, как решить эту проблему, ждём вас в нашей команде ;)

Voice cloning

Отдельно перед нами стояла задача клонирования голоса. Отдавать эту фичу в публичный доступ по понятным причинам мы не хотим, но в целом VC – очень хороший бенчмарк, позволивший нам сравниться с open-source моделями и конкурентами.

Изначально мы не проектировали архитектуру модели под клонирование голосов, и в целом понимали, что диффузионки тут сработают лучше. Но в какой-то момент подумали, что можем «сорвать низко висящий фрукт», реализовав особый режим работы модели.

Его идея: у нас есть 1) аудио, из которого мы хотим клонировать голос, 2) текст, который хотим этим голосом озвучить, и 3) модель синтеза, обученная в режиме next token prediction (NTP) с включённым teacher forcing. Дальше делаем так:

  1. Склеиваем текст из исходного аудио и текст, который хотим озвучить.

  2. Подаём в модель в режиме NTP, причём вместо предсказанных форсируем токены из оригинального аудио промпта.

  3. Инферим модель до конца, уже без форсирования токенов.

  4. Озвучиваем только сгенерированные на третьем шаге токены.

Нечто похожее было в статье про VALL-E, там тоже результат клонирования получался как бы продолжением промпта. Результат нас порадовал. Вот, например, голоса Шрека и Копатыча:

Мы увидели потенциал нашей модели для клонирования голосов, но для наилучшего качества организовать обучение надо было совсем по-другому. Как минимум, обойти три явные проблемы:

  • Текст промпта и синтеза не связаны между собой, мы подаём их в модель, будто это одно предложение. Это ведёт к плохим интонациям у клонирования.

  • Нет возможности клонировать голос из нескольких аудио, только из одного. На практике обычно доступно больше исходников, и нужно уметь эффективно их использовать.

  • Для аудио промпта в режиме audio continuation необходим точно распознанный текст

Все это можно решить с помощью использования few-shot. На этапе обучения помимо текста нужно подавать в промпте один или несколько несколько примеров голоса. Модель их видит и предсказывает следующий токен более качественно, а указанных выше проблем нет просто по определению.

Мы сравнили новый клонинг с нашим старым, с лучшей на сегодня русскоязычной open source моделью для клонирования голосов FishSpeech, а также с 11Labs (которые, как мы выяснили, улучшают prompt, а не повторяют его). Помимо SBS считаем еще и similarity-SBS. Дизайн метрики похожести очень похож на SBS, только мы показываем разметчикам ещё и референсный промпт, а формулировка вопроса другая: «В каком из двух аудио голос больше похож на оригинал?». После усреднения результатов мы получаем оценку, какая из двух моделей лучше клонирует голоса:

Multiturn-режим синтеза

Похожим способом мы решили проблему генерации длинных текстов. У всех авторегрессионных моделей есть проблема: на длинных текстах синтез разваливается и начинает генерировать шум. Это можно исправить добавлением в обучение особо длинных примеров, но раздувать датасет до бесконечности мы не можем. Поэтому придумали зайти с инженерной стороны.

В коде сервера TTS у нас работает так называемый чанкер. Это модуль, который по-умному делит длинный запрос на фрагменты такой длины, что модель гарантированно озвучит их без артефактов. Обычно это одно предложение, но можно делить по абзацам, количеству слов или символов.

Если наивно склеивать звук, получившийся после озвучивания чанков, то мы потеряем весь контекст, необходимый для более качественного синтеза, а реплики будут звучать не слитно. Мы придумали использовать тот же подход с few-shot, только в качестве них мы подаём не случайные записи спикера, а предыдущие реплики. Причем оформили это как единый чат, чтобы учитывался порядок реплик. Так модель учится бесшовно продолжать предыдущий чанк, учитывая контекст всех более ранних.

Но в какой-то момент контекст становится слишком большим, чтобы уместиться в память сервера. Тогда мы просто убираем из few-shot самые старые фрагменты. Кто-то, кого мы ждем к себе в команду, скажет, что это вычислительно неэффективно, потому что мы теряем весь посчитанный kv-cache модели. Но это небольшая проблема по двум причинам: значительный объем звука уже сгенерировался и заполняет буфер воспроизведения, да и в целом пересчет кеша — это довольно быстрая операция по сравнению с честной авторегрессионной генерацией токенов.

Вот так мы научились озвучивать тексты любой длины авторегрессионной моделью, и это была последняя фича нового синтеза, про которую я хотел рассказать. Спасибо!

Комментарии (7)


  1. AigizK
    21.11.2025 09:55

    сделали мультиязычный синтез.

    а на каких языках? и работает ли клонирование между языками?


    1. sterling239 Автор
      21.11.2025 09:55

      Хороший кстати вопрос) По умолчанию русский, отдельно работаем над полноценной мультиязычностью. Как именно клонинг работает еще рановато тестить, но чем черт не шутит


  1. Pulcomaru
    21.11.2025 09:55

    Даже немного обидно, что новостное поле вокруг этого продукта небольшое. Можно сказать, что в текущих условиях, реализовать такое - это сильное достижение.

    Гриша, надо газ не отпускать и обгонять 11labs во всех категориях)


  1. imillerkov
    21.11.2025 09:55

    В режиме api можно потестить? И где посмотреть описание стоимости?


    1. riky
      21.11.2025 09:55

      тоже интересно


  1. 9a75sd
    21.11.2025 09:55

    Один из голосов напомнил озвучку некоторых игр серии "Нэнси Дрю"


  1. Foror
    21.11.2025 09:55

    Какого уровня мощности нужны для обучения подобного и в какие сроки обучится? Как понимаю в опенсорц оно не пойдёт?