Мы Опубликовали Качественный, Простой, Доступный и Быстрый Синтез Речи

от автора

fiona

Вокруг темы синтеза речи сейчас много движения: на рынке есть огромное число тулкитов для синтеза, большое число закрытых коммерческих решений за АПИ (как на современных технологиях, так и на более старых, т.е. "говорилки") от условных 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 Open In Colab
baya f ru Silero Private 8000 / 16000 Open In Colab
ksenia f ru Silero Private 8000 / 16000 Open In Colab
irina f ru Private contribution TBD 8000 / 16000 Open In Colab
natasha f ru source CC BY 4.0 8000 / 16000 Open In Colab
ruslan m ru source CC BY-NC-SA 4.0 8000 / 16000 Open In Colab
lj f en source Public Domain 8000 / 16000 Open In Colab
thorsten m de source Creative Commons Zero v1.0 Universal 8000 / 16000 Open In Colab
gilles m fr source Public Domain 8000 / 16000 Open In Colab
tux m es source Public Domain 8000 / 16000 Open In Colab

Как Попробовать

Все модели опубликованы в репозитории 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;

Скороговорки

И в качестве бонуса, немного скороговорок.

Русский язык:

Другие языки:

ссылка на оригинал статьи https://habr.com/ru/post/549480/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *