Этот пост представляет собой краткое и избранное техническое резюме моей реализации выразительной модели преобразования текста в речь от Google в рамках моей магистерской диссертации в Берлинском техническом университете.

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

Краткое резюме

В рамках своей магистерской диссертации я успешно реализовал первую реализацию с открытым исходным кодом расширения Capacitron VAE стандартной системы Tacotron 1 от Google в библиотеку Coqui AI TTS. Благодаря модульной конструкции модуля просодического кодировщика VAE этот кодировщик теперь также может использоваться с архитектурой Tacotron 2, что значительно повышает стабильность и качество и, таким образом, является расширенной, улучшенной версией с открытым исходным кодом. оригинальный метод, представленный в бумаге Баттенберга и др. [5]. Отправив рецепты обучения, две предварительно обученные модели конденсаторов и предварительно обученную модель вокера HiFiGAN на основе набора данных Кэтрин Байерс Blizzard 2013 в зоопарке моделей Coqui AI, сообщество теперь может немедленно экспериментировать и обучать новые выразительные системы на основе Tacotron.

Быстрые ссылки

Google Colab для экспериментов с обученными моделями

Предыдущие аудиопримеры.

Задние аудиопримеры.

Запрос на включение модели в Coqui TTS.

Выбор темы и мотивация

В статье 2013 г. от Aide-Zade et al. [1] определил два критерия, по которым можно оценивать машины, производящие синтетическую речь. Первым из них является «Разборчивость речи», которую можно приблизительно описать вопросом «Что произносится?». Предыдущие методы синтеза речи, такие как конкатенационные и параметрические технологии, значительно уступают более поздним моделям, основанным на глубоком обучении, по шкале субъективной оценки качества и естественности, известной как средняя оценка мнения. Эти новые технологии очень близки к сокращению разрыва между субъективным качеством восприятия синтетической и реальной человеческой речи, поэтому они охватывают критерии разборчивости речи, как показано на рисунке 1.

Вторым критерием является «Естественность звучания», которую условно можно определить вопросом «Как произносится определенная текстовая подсказка?». Синтез речи — это недостаточно определенная проблема, потому что одна текстовая подсказка может иметь множество различных реализаций в виде высказывания. Эти реализации воплощаются через интонацию, ударение, ритм и стиль речи — все вместе мы называем эти аспекты «просодией». Управление этими атрибутами таким образом, чтобы мы могли синтезировать обычную, выразительную синтетическую речь, является одним из святых граалей этой технологии, и эта тема активно изучается. Кроме того, такие системы также облегчили бы проблему сопоставления «один ко многим» синтеза речи, когда предыдущие методы могли синтезировать только определенную текстовую подсказку единственным способом.

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

VAE на базе Tacotron

На рисунке 2 мы можем видеть стандартную архитектуру преобразования текста в речь Seq2seq Tacotron, где модель берет текст в качестве входных данных и преобразует его во встраивания символов, которые затем передаются через множество различных слоев для создания выходных кадров спектрограммы — эти кадры затем могут быть преобразуется в аудио с использованием реконструкции Гриффина-Лима или нейронных вокодеров.

На рис. 3 мы видим расширение этой стандартной системы, посредством которой отдельная подсеть берет эталонные срезы спектрограммы для создания единого вложения просодии, которое впоследствии объединяется с вложениями символов. Во время обучения эталонная спектрограмма является фактической спектрограммой, которую модель пытается реконструировать, поэтому мы можем побудить эту эталонную сеть кодировщика изучить представление просодического пространства говорящего на входе, если мы достаточно хорошо его параметризуем. Эта работа посвящена именно уникальной параметризации этой сетевой архитектуры — расширению вариационного автоэнкодера системы, показанной справа, под названием Capacitron [5].

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

На рисунке 5 мы видим расширенную версию этой архитектуры, где кодировщик больше не выводит сжатое и фиксированное представление входных данных, а создает параметры для распределения — здесь mu и sigma. может быть, например. параметры многомерного стандартного нормального распределения, которое фактически формирует аппроксимированное апостериорное распределение q(z|x). Затем мы можем сделать выборку из этого распределения, чтобы создать фактическое скрытое встраивание — это больше не является фиксированным, поэтому мы можем ввести в сеть своего рода контролируемую случайность с этой архитектурой.

Архитектура VAE допускает 3 различных способа вывода обученной модели. Во-первых, если мы передаем в сеть эталонную спектрограмму, мы призываем кодировщик извлечь просодию из этой ссылки и применить ее либо к тому же тексту, что и в ссылке, что дает нам тот же текст. -перенос просодии (STT) — или мы можем вывести произвольный текст и тем самым перенести общий стиль из ссылки в совершенно новый текст — мы называем это межтекстовым переносом стиля (ITT).

Второй способ, которым мы можем сделать вывод о модели, заключается в том, чтобы не передавать ссылку, а поощрять модель к выборке из предварительного распределения скрытого пространства, что дает истинную генеративную модель, где реалистичная, но случайная просодия отбирается каждый раз, когда мы инициируем синтез, устраняя проблему отображения «один ко многим» стандартной системы Tacotron.

Вы можете прослушать некоторые из этих примеров в этих двух видео:

Функция потери модели

Не вдаваясь слишком в подробности того, как работают VAE (вы можете прочитать больше о теории в главе 3 моей диссертации), я сейчас представлю расширенную функцию потерь модели Capacitron и дам интуитивное представление о том, как возможности этой модели могут управлять глубиной выразительности синтезированной речи.

Первый член уравнения 1 представляет собой ожидаемые потери при реконструкции генеративной модели, где мы используем базовые потери декодера Tacotron L1 в качестве замены для отрицательной логарифмической вероятности сгенерированной спектрограммы x с учетом скрытого встраивания. z и текст y_{T} . Второй член уравнения 1 представляет собой расширенный расчет KL-члена между приблизительными апостериорными и априорными значениями, включая автоматически настраиваемый постоянный коэффициент бета, подобный множителю Лагранжа, и предел вариационной емкости C. Мы ограничиваем бета, чтобы она была неотрицательной, передавая неограниченный параметр через нелинейность softplus, что делает ограничение мощности пределом, а не целью [5].

Две цели этой функции потерь — уменьшить потери декодера стандартной модели Tacotron и оптимизировать KL-расхождение между аппроксимированным апостериорным и априорным (т. е. верхней границей взаимной информации между данными X и латентный просодический пробел Z) до желаемого значения вариационной емкости C. Чем выше C, тем больше поощряется эталонный кодировщик кодировать информацию из просодического пространства Z, а это означает, что, контролируя верхнюю границу взаимной информации между данными и скрытым пространством, мы можем контролировать степень выразительности, которую кодировщик просодии извлекает из данных. С другой стороны, структурную емкость архитектуры VAE можно легко настроить, изменив размерность скрытого вложения z. Установка этой размерности заставляет эталонный кодировщик переводить скрытое пространство в фиксированный тензор, размером которого можно управлять, чтобы контролировать, насколько большим должно быть вариационное вложение сети.

Различные детали реализации

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

Двойная оптимизация

Большая часть реализации была сосредоточена вокруг процедуры двойной оптимизации, подробно описанной в [5]. Функция потерь, определенная в уравнении 1, должна была быть оптимизирована двумя отдельными процессами. Основной оптимизатор ADAM используется для всех параметров модели, за исключением одного скалярного параметра бета, а отдельный оптимизатор SGD используется только для бета. Эта двойная оптимизация выполнялась путем разделения функции потерь на два отдельных назначения, каждое из которых включало только те параметры, которые необходимо минимизировать, с использованием метода PyTorch .detach() для отделения параметров от механизма автоматического дифференцирования. Вы можете найти реализацию этой процедуры в классе TacotronLoss:



Сверточная маскировка

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

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

Внутри модуля ReferenceEncoder этот входной тензор с экземплярами, дополненными нулями, проходит через стек из 6 сверточных слоев с фильтрами 3x3, шагом 2x2 и пакетной нормализацией. 6 слоев имеют 32, 32, 64, 64, 128 и 128 фильтров соответственно. Чтобы продемонстрировать, почему эта операция требует особого внимания, на рис. 7 показан простой одномерный пример входного тензора с input_length=5. Модуль свертки от PyTorch позволяет указать дополнительное заполнение нулями на разных осях входного тензора, в этом случае в измерении ширины показано заполнение нулями 2. Это делается для того, чтобы восприимчивое поле сверточных фильтров правильно включало информацию о краях входного тензора. С filter_width=3 и stride=2 мы видим, что фильтр принимает 3 входных значения, чтобы свернуть эти значения в одно выходное значение. Затем фильтр сдвигает 2 значения по оси ширины, чтобы включить следующую тройку значений и так далее. Эта сингулярная операция свертки теперь сжала входной тензор с input_length=5 до output_length=4.

Теперь явно не нужно было рассматривать предыдущий случай иначе, чем обычные операции свертки — в PyTorch есть все встроенные вспомогательные функции и методы для учета сжатия данных. Однако в нашем особом случае работы со звуком переменной длины на рис. 8 показано, где требуется больше внимания для этой операции. В этом случае тот же самый пример valid_length находится в другом пакете, где он больше не является самым длинным семплом, поэтому к концу сигнала уже применено некоторое заполнение нулями. В этом конкретном случае ввод уже дополнен нулями из сети фидера данных двумя нулевыми значениями. С той же операцией свертки, что описана выше, выход этой свертки имеет длину не 4, а 5. Последний фильтр применяет свертку к нулевым значениям, однако из-за смещения эти члены не будут равны нулю после свертки. шаг. Даже если они малы, в нашем случае со стеком из 6 таких сверток количество объединенной недопустимой информации по существу делает эту сверточную сеть неспособной должным образом обрабатывать входные данные и выдавать значимые выходные данные во время тестирования.

Решение этой проблемы состоит в том, чтобы вычислить valid_length каждого экземпляра в пакете после одного прохода свертки и замаскировать все недопустимые значения перед отправкой этого вывода обратно в следующую свертка. С помощью этой сверточной маскировки, показанной на рисунке 9, входной звук переменной длины правильно понижается в правильное сжатое представление.Эта деталь реализации оказалась важным аспектом метода Capacitron — модели, обученные без этой сверточной маскирование полностью не смогло изучить скрытое пространство входных данных и воспроизводило неразборчивый звук во время тестирования.

Вы можете найти, как эта маскировка реализована в классе CapacitronLayers:



Ссылки

[1] : Аида-Заде и др.: Основные принципы системы синтеза речи. 2013

[2] : WaveNet: генеративная модель для необработанных аудиозаписей в блоге. deepmind.com/blog/ article/wavenet-generative-model-raw-audio

[3]: Ван и др.: Такотрон: на пути к сквозному синтезу речи. 2017

[4] : Скерри-Райан и др.: На пути к сквозному переносу просодии для экспрессивного синтеза речи с помощью Tacotron. 2018

[5] : Баттенберг и др.: Эффективное использование возможностей вариативного встраивания в экспрессивном сквозном синтезе речи. 2019