Вторая часть — https://habr.com/ru/post/563484/
Вокруг темы синтеза речи сейчас много движения: на рынке есть огромное число тулкитов для синтеза, большое число закрытых коммерческих решений за АПИ (как на современных технологиях, так и на более старых, т.е. "говорилки") от условных GAFA компаний, большое количество американских стартапов, пытающихся сделать очередные аудио дипфейки (voice transfer).
Но мы не видели открытых решений, которые бы удовлетворяли одновременно следующим критериям:
- Приемлемый уровень естественности речи;
- Большая библиотека готовых голосов на разных языках;
- Поддержка синтеза как в
16kHz
так и в8kHz
из коробки; - Наличие своих собственных голосов у авторов решения, не нарушающих чужие права и лицензии;
- Высокая скорость работы на "слабом" железе. Достаточная скорость работы на 1 потоке / ядре процессора;
- Не требует GPU, команды ML инженеров или какой-либо дополнительной тренировки или для использования;
- Минимализм и отсутствие зависимостей / использование в 1 строчку / не надо ничего собирать или чинить;
- Позиционируется именно как готовое решение, а не очередной фреймворк / компиляция чужих скриптов / тулкитов для сбора плюсиков;
- Решение никак не связано и не аффилировано с закрытыми экосистемами и продуктами Гугла / Сбера / Яндекса / вставить нужное;
Мы попытались учесть все эти пункты и представить комьюнити свое открытое некоммерческое решение, удовлетворяющее этим критериям. По причине его публичности мы не заостряем внимание на архитектуре и не фокусируемся на каких-то cherry picked
примерах — вы можете оценить все сами, пройдя по ссылке.
Краткий Обзор Решений
Данная статья не ставит своей целью глубокий технический обзор всех доступных решений. Мы хотим просто обрисовать некий ландшафт из доступных вариантов с минимальной степенью готовности. Понятно, что мы не рассматриваем многочисленные тулкиты, а смотрим в первую очередь какие есть более-менее готовые решения с ненулевой библиотекой голосов и подобием поддержки / комьюнити:
Конкатенативные модели (появившиеся до DL бума). Из того, что хоть как-то поддерживается и живо и можно запустить "as-is" без археологических раскопок, я нашел только rhvoice (я глубоко не копал, но есть целые форумы, посвященные использованию голосов из Windows, но вряд ли это можно назвать поддерживаемым решением). На момент, когда я пользовался проектом ради интереса, он по сути был заброшен, но потом у него появился новый "хозяин". К плюсам такого рода решений можно отнести их скорость и нетребовательность к ресурсам (исключая ресурсы, чтобы заставить это работать). Очевидный и основной минус — звучит как говорилка. Менее очевидный минус — довольно тяжело оценить стоимость обладания. Качество звучания: 3+ по пятибалльной шкале;
DL-based модели в основном разделяют end-to-end TTS задачу на подзадачи: текст -> фичи и фичи -> речь (вокодинг). Практически повсеместно для первой подзадачи используется Tacotron2. Выделим следующие сочетания моделей в соответствии с их эффективностью и простотой использования:
Tacotron2 + WaveNet (оригинальный WaveNet принимал на вход лингвофичи, но для такотрона поменяли на более удобные мелспектрограммы). Основная проблема — очень медленный инференс ввиду авторегрессионности модели и необходимость запретительно большого количества ресурсов и времени. Качество звучания: 4+;
Tacotron2 + WaveRNN (тоже с переходом от лингвофичей к спектрограммам). Вокодер заметно быстрее предыдущего: при использовании всех хаков можно получить даже риалтайм синтез без GPU, правда естественность звука несколько просядет. Качество звучания: 3.5-4;
Tacotron2 + Parallel WaveNet. Упомянутый выше медленный вокодер был использован в качестве учителя для получения новой довольно быстрой параллельной модели вокодера: с ней стал возможен синтез быстрее риалтайма, но все еще на мощных GPU. Из недостатков — дистилляция требует качественную учительскую модель и соответствующую схему обучения. Качество звучания: 4+;
Tacotron2 + multi-band WaveRNN. Тоже развитие предыдущих идей, тоже распараллеливание в некотором смысле — здесь доступен синтез быстрее риалтайма уже на CPU. Однако, не слишком популярная работа, меньше имплементаций и поддержки, хотя некоторые подходы хороши и были успешно использованы в более поздних моделях; Качество звучания: 3.5-4+;
Tacotron2 + LPCNet. Интересная идея про сочетание DL и классических алгоритмов, что может дать буст по скорости до подходящего для продакшена уровня и на CPU, но требует вдумчивого допиливания для качественных результатов. Качество звучания: 3.5-4+;
Многочисленные решения на базе Tacotron2 + Waveglow от Nvidia как нынешний стандарт для задачи синтеза речи. Никто не пишет про свой "секретный соус" (например как 15.ai делает голос по 15 минутам и сколько там моделей в цепочке). Есть много имплементаций и репозиториев, которые "копируют" чужой код. Может звучать на cherry-picked примерах неотличимо от живых людей, но когда смотришь реальные модели от комьюнити, качество заметно варьируется, а детали улучшенных решений не раскрываются. Архитектурно к такотрону и его аналогам по скорости и цене обладания претензий нет, но Waveglow очень прожорлив к ресурсам как на тренировке, так и в продакшене, что делает его использование по сути нецелесообразным. Качество звучания: 3.5-4+;
Замена Tacotron2 => FastSpeech / FastSpeech 2 / FastPitch, то есть уход к более простой сетке (на базе forced-align от такотрона и миллион более хитрых и сложных вариантов). Из полезного дает контроль темпа речи и высоты голоса, что неплохо, вообще упрощает и делает более модульной конечную архитектуру. Немаловажно, что сетка перестает быть рекуррентной, что открывает просторы для оптимизаций по скорости. Качество звучания: 3.5-4+;
Оценки Качества и Примеры Аудио
Чтобы не вдаваться в дебри, мы поступили максимально просто: синтезировали аудио из валидационной выборки датасетов (~200 файлов на спикера), смешали с оригинальными аудио этой же выборки и дали группе из 24 людей для оценки качества звучания по пятибалльной шкале. Для 8kHz
и 16kHz
оценки собирали раздельно, градация оценок — [1, 2, 3, 4-, 4, 4+, 5-, 5] — с большей детализацией для более качественного звука.
Всего было поставлено 37,403
оценок. 12 человек сделали оценку полностью. Еще 12 людей успели проставить только от 10% до 75% оценок. Дальше для каждого спикера мы просто посчитали среднее (в скобочках приведено стандартное отклонение). Расчет среднего от медиан по каждому аудио завышает средние оценки на 0.1 — 0.2 балла, но не влияет на отношения. Показательны естественно скорее отношения средних баллов друг к другу. Дисперсия довольно высокая, но оценки пользователей отличались сильно и мы решили не выбрасывать никакие, т.к. оценки одного пользователя были консистентными друг с другом. По ряду соображений мы провели такую оценку только на своих уникальных голосах:
Спикер | Оригинал | Синтез | Отношение | Примеры |
---|---|---|---|---|
aidar_8khz | 4.67 (.45) | 4.52 (.55) | 96.8% | link |
baya_8khz | 4.52 (.57) | 4.25 (.76) | 94.0% | link |
kseniya_8khz | 4.80 (.40) | 4.54 (.60) | 94.5% | link |
aidar_16khz | 4.72 (.43) | 4.53 (.55) | 95.9% | link |
baya_16khz | 4.59 (.55) | 4.18 (.76) | 91.1% | link |
kseniya_16khz | 4.84 (.37) | 4.54 (.59) | 93.9% | link |
Мы просили людей в первую очередь оценивать естественность звучания речи (а не качество звука). Нас удивило, что по расспросам обычные люди на своих ежедневных девайсах не особо слышат разницу между 8 kHz и 16 kHz (что подтверждается оценками)! Самые низкие абсолютные оценки и самое низкое отношение у Байи. Самые высокие абсолютные оценки — у Ксении, а относительные — у Айдара. Тут важно отметить, что у Байи меньше поставлен голос, но поэтому он звучит более по-человечески за счет этого. У Байи также выше дисперсия оценок.
Ручной просмотр аудио с большими расхождениями показывает ошибки спикеров, ошибки такотрона, ошибочные паузы (тоже вследствие ошибок такотрона), имена собственные и сложные слова, которые вообще непонятно как читать. Естественно 75% таких расхождений в синтезе (а не оригинале) и частота дискретизации особо не влияет.
Если мы пытались дать численную оценку естественности, то еще хорошо бы оценить "неестественность" или "роботизированность" голоса. По идее ее можно оценивать, давая людям пару аудио на выбор и прося выбрать между ними. Но мы пошли дальше и по сути применили "двойной слепой тест". Мы в случайном порядке дали людям поставить оценки "одному и тому же аудио" 4 раза — оригинал и синтез с разной частотой дискретизации. Для участников исследования, разметивших весь датасет, получается такая таблица:
Сравнение | Хуже | Одинаково | Лучше |
---|---|---|---|
16k против 8k, оригинал | 957 | 4811 | 1512 |
16k против 8k, синтез | 1668 | 4061 | 1551 |
Оригинал против синтеза, 8k | 816 | 3697 | 2767 |
Оригинал против синтеза, 16k | 674 | 3462 | 3144 |
Тут напрашивается несколько выводов:
- В 66% случаев люди не слышат разницы между 8k и 16k;
- В синтезе, 8k немного помогает скрыть ошибки;
- Примерно в 60% случаев люди считают, что синтез не хуже оригнала по естественности;
- Показательно, что два последних вывода не особо зависят от частоты дискретизации (8k имеет небольшое преимущество);
Можете оценить сами, как это звучит, как для наших уникальных голосов, так и для спикеров из внешних источников (больше аудио для каждого спикера можно синтезировать в colab.
Если вы не дружите с колабом или глаза разбегаются от количества файлов в папках с примерами, то вот несколько случайных аудио:
Айдар:
Байя:
Ксения:
Еще раз обращаю внимание, что это не cherry-picked примеры, а реальное звучание синтеза.
Бенчмарки по Скорости
После качества скорость является следующим определяющим свойством модели, для измерения скорости синтеза мы используем следующие простые метрики:
- RTF (Real Time Factor) — какую долю длительности аудио занимает синтез этого аудио;
- RTS = 1 / RTF (Real Time Speed) — насколько синтез "быстрее" риалтайма;
Метрики мы снимали на двух устройствах с помощью встроенных в PyTorch 1.8 утилит:
- CPU — Intel i7-6800K CPU @ 3.40GHz;
- GPU — 1080 Ti;
- При снятии метрик на CPU мы также ограничивали число используемых потоков;
Для моделей 16 kHz получаются такие показатели:
Батч | Устройство | RTF | RTS |
---|---|---|---|
1 | CPU 1 thread | 0.7 | 1.4 |
1 | CPU 2 threads | 0.4 | 2.3 |
1 | CPU 4 threads | 0.3 | 3.1 |
4 | CPU 1 thread | 0.5 | 2.0 |
4 | CPU 2 threads | 0.3 | 3.2 |
4 | CPU 4 threads | 0.2 | 4.9 |
--- | ----------- | --- | --- |
1 | GPU | 0.06 | 16.9 |
4 | GPU | 0.02 | 51.7 |
8 | GPU | 0.01 | 79.4 |
16 | GPU | 0.008 | 122.9 |
32 | GPU | 0.006 | 161.2 |
--- | ----------- | --- | --- |
Для моделей 8 kHz получаются такие показатели:
Батч | Устройство | RTF | RTS |
---|---|---|---|
1 | CPU 1 thread | 0.5 | 1.9 |
1 | CPU 2 threads | 0.3 | 3.0 |
1 | CPU 4 threads | 0.2 | 4.2 |
4 | CPU 1 thread | 0.4 | 2.8 |
4 | CPU 1 threads | 0.2 | 4.4 |
4 | CPU 4 threads | 0.1 | 6.6 |
--- | ----------- | --- | --- |
1 | GPU | 0.06 | 17.5 |
4 | GPU | 0.02 | 55.0 |
8 | GPU | 0.01 | 92.1 |
16 | GPU | 0.007 | 147.7 |
32 | GPU | 0.004 | 227.5 |
--- | ----------- | --- | --- |
Также при расчетах скорости мы были удивлены ряду вещей:
- Процессоры AMD показали себя сильно хуже;
- Удивительно, но бутылочным горлышком в нашем случае оказался именно такотрон а не вокодер (еще остается существенный потенциал ускорения всей системы в 3-4 раза, а может даже и в 10 раз, если получится квантизация и дополнительное сжатие);
- Более чем 4 потока CPU не помогают, равно как и батч больше 4;
Список Доступных моделей и Ссылки на Датасеты
Для простоты мы решили опубликовать все наши модели в рамках проекта silero-models. Список актуальных моделей всегда можно найти в этом yaml файле.
На момент написания этой статьи доступны следующие голоса (доступны _16khz
и _8khz
версии голосов):
Спикер | Пол | Язык | Источник | Лицензия Датасета | Примеры | Colab |
---|---|---|---|---|---|---|
aidar | m | ru | Silero |
Private | 8000 / 16000 | |
baya | f | ru | Silero |
Private | 8000 / 16000 | |
ksenia | f | ru | Silero |
Private | 8000 / 16000 | |
irina | f | ru | Private contribution | TBD | 8000 / 16000 | |
natasha | f | ru | source | CC BY 4.0 | 8000 / 16000 | |
ruslan | m | ru | source | CC BY-NC-SA 4.0 | 8000 / 16000 | |
lj | f | en | source | Public Domain | 8000 / 16000 | |
thorsten | m | de | source | Creative Commons Zero v1.0 Universal | 8000 / 16000 | |
gilles | m | fr | source | Public Domain | 8000 / 16000 | |
tux | m | es | source | Public Domain | 8000 / 16000 |
Как Попробовать
Все модели опубликованы в репозитории silero-models, там также есть примеры запуска синтеза в colab. Для полноты приведем минималистичный пример (да, это действительно так просто):
import torch
language = 'ru'
speaker = 'kseniya_16khz'
device = torch.device('cpu')
(model,
symbols,
sample_rate,
example_text,
apply_tts) = torch.hub.load(repo_or_dir='snakers4/silero-models',
model='silero_tts',
language=language,
speaker=speaker)
model = model.to(device) # gpu or cpu
audio = apply_tts(texts=[example_text],
model=model,
sample_rate=sample_rate,
symbols=symbols,
device=device)
На данный момент поддерживаются следующие спец-символы: !\'(),.:;?¡¿
. Кроме того, для большинства спикеров русского языка в тексте для озвучивания были использованы метки ударения (символ +
перед ударной гласной, при тестировании таких моделей пока еще нужно ставить ударение вручную):
Спикер | С ударением |
---|---|
aidar | да |
baya | да |
ksenia | да |
irina | да |
natasha | да |
ruslan | да |
lj | нет |
thorsten | нет |
gilles | нет |
tux | нет |
В будущем мы планируем перевести все модели на более простой и унифицированный формат, не требующий ударений. Чтобы не запутаться, в yml
файле, который описывает все наши модели, явно указан набор токенов для каждой модели и пример фразы для генерации.
Философия, Лицензия и Мотивация
Как авторы моделей, мы считаем следующие правила использования моделей справедливыми:
- Голоса из внешних источников приведены исключительно в целях демонстрации и будут удалены;
- Любые из описанных выше моделей нельзя использовать в коммерческих продуктах;
- Репозиторий
silero-models
опубликован под лицензией GNU A-GPL 3.0. Де-юре это не запрещает коммерческое использование, но по факту мы еще не встречали коммерческие решения с полностью открытым кодом, чего требует эта лицензия; - Если вы ставите своей целью некоммерческое использование наших моделей во благо общества — мы будем рады помочь вам с интеграцией моделей в ваше решение;
- Если вы планируете использование наших моделей в личных целях (по фану или для озвучки каких-то текстов), то делитесь результатами своих экспериментов в репозитории;
- Если вы планируете использование наших моделей в некоммерческих продуктах для людей с нарушениями речи или зрения — обращайтесь, мы поможем с интеграцией, чем умеем;
Делая этот проект мы ставили своей целью ценой многочисленных компромиссов показать, что современный TTS, удовлетворяющий описанным выше критериям, возможен. И для этого не нужно быть заложником закрытых экосистем корпораций.
Дальнейшая Работа
Мы планируем постоянно развивать и улучшать свое решение, в частности:
- Рано или поздно добавить поддержку изменения скорости и высоты голоса;
- Продолжать работать над качеством и естественностью звучания и расширять библиотеку голосов;
- Мы оцениваем, что есть еще запас ускорения всего пайплайна в целом примерно в 3-4 раза (возможно даже до 10 раз, если повезет);
- Маловероятно но не исключено, что рано или поздно мы сможем добавить мульти-спикерную модель или voice-transfer;
Скороговорки
И в качестве бонуса, немного скороговорок.
Русский язык:
Другие языки: