Бумажный пошаговый обзор новой модели преобразования текста в речь от Microsoft Research.

Здравствуйте читатели,

В этой статье мы углубимся в новую интересную модель преобразования текста в речь, разработанную Microsoft Research, под названием VALL-E. Документ, представляющий работу, был выпущен 5 января 2023 года и с тех пор привлекает большое внимание в Интернете. Стоит отметить, что на момент написания этой статьи не было выпущено ни одной предварительно обученной модели, и единственный вариант в настоящее время протестировать эту модель в бою — это обучить ее самостоятельно.

Тем не менее, идея, представленная в этой статье, является новой и интересной, и ее стоит изучить, независимо от того, смогу ли я сразу клонировать свой голос с ее помощью или нет.

Эта статья будет организована следующим образом:

  • Часть 1. Введение в преобразование текста в речь, основные понятия
  • Часть 2 — ВАЛЛ-И: Преобразование текста в речь как языковая модель
  • Часть 3 — Encodec: рабочая лошадка VALL-E
  • Часть 4 — Постановка задачи и обучение ВАЛЛ-Э
  • Часть 5. Немного кода
  • Часть 6. Выводы и мысли на будущее

Часть 1. Введение в преобразование текста в речь, основные понятия

Технология преобразования текста в речь не нова и существует со времен Voder — первого электронного голосового синтезатора от Bell Labs в 1939 году, который требовал ручного управления. С тех пор в этой области произошли невероятные изменения, и вплоть до 2017 года доминирующей технологией был конкатенативный синтез речи. Эта технология основана на соединении предварительно записанных речевых сегментов для создания разборчивой речи. Хотя эта технология может давать реалистичные результаты, ее недостатки очевидны — она не может генерировать новые голоса, которых нет в предварительно записанной базе данных, и не может генерировать речь с другим тоном или эмоциями.

Перенесемся в эпоху глубокого обучения. В настоящее время доминирующая стратегия синтеза речи представлена ​​на рисунке 1. Давайте рассмотрим его различные части.

  • Во-первых, у нас есть фонемайзер, преобразующий текст в фонемы. Фонемы — это текстовое представление произношения слов (например, слово tomato будет иметь разные фонемы в американском и британском акценте), и это представление помогает нижестоящей модели достигать лучших результатов.
  • После этого у нас есть акустическая модель, которая преобразует эти фонемы в спектрограмму Мела, представляющую звук во временной X частотной области. Спектрограмма получается путем применения короткого преобразования Фурье (STFT) к перекрывающимся временным окнам необработанной звуковой волны (вот отличное объяснение спектрограммы Мела — https://medium.com/analytics-vidhya/understanding-the- мел-спектрограмма-fca2afa2ce53). Конечно, в этом случае спектрограмма создается статистической моделью, поскольку входного звука в режиме преобразования текста в речь в реальном времени не существует. Примеры последних архитектур моделей включают Tacotron2, DeepVoice 3 и TransformerTTS.
  • Завершающим этапом является преобразование спектрограммы Мела в сигнал. Сигнал обычно сэмплируется с частотой 24/48 кГц, где каждый сэмпл оцифровывается в 16-битное число. Эти числа представляют величину давления воздуха в каждый момент времени, то есть звук, который мы в конце концов слышим в наших ушах. Почему мы не можем просто детерминистически преобразовать спектрограмму в сигнал? Потому что это требует значительного увеличения частоты дискретизации во временной области, что требует от нас создания информации, которая явно не существует в спектрограмме, а также потому, что спектрограммы не содержат информации о фазе (только частота). Итак, как и при преобразовании фонем в спектрограмму Мела, здесь также нам нужна статистическая модель для преобразования спектрограммы в форму волны, и эти модели называются вокодерами. Примеры вокодеров включают WaveNet, WaveRNN и MelGAN.

Кроме того, существуют недавние модели, такие как VITS и YourTTS, которые используют сквозную модель для генерации сигналов на основе ввода текста. Другим примером такой сквозной системы является документ под названием Сквозной состязательный текст-в-речь от Deepmind (который превосходно объясняется Янником Килчером здесь — https://www.youtube.com /watch?v=WTB2p4bqtXU). В этой статье они используют процедуру обучения, подобную GAN, для создания реалистичных звуковых волн речи. Им также необходимо решить проблему выравнивания, которая представляет собой степень, в которой произнесение слов в сгенерированных образцах совпадает по времени с теми же произнесениями слов в образцах наземной истины. Эта проблема не решается сама по себе и требует явной обработки в архитектуре модели.

Основным недостатком этих сквозных моделей TTS является их невероятная сложность. Текст и речь — такие разные модальности, и для этого требуются сложные модели, которые явно решают такие проблемы, как выравнивание, идентификация говорящего и язык, что делает эти модели очень сложными. Прелесть VALL-E, в которую мы вскоре погрузимся, заключается в том, что она берет относительную простоту генеративных языковых моделей и творчески использует их в области генерации речи. Для таких людей, как я, которые являются новичками в области TTS и речи в целом и имеют некоторый опыт в НЛП, это дает хорошую отправную точку в этой увлекательной области.

Этот краткий обзор не отдает должного огромной области TTS, на изучение и понимание которой можно потратить всю жизнь (я призываю вас погрузиться немного глубже). Тем не менее, мы здесь сегодня, чтобы поговорить о ВАЛЛ-И, так что позвольте мне сразу перейти к этому.

Часть 2 — ВАЛЛ-И: Преобразование текста в речь как языковая модель

Как и в других системах преобразования текста в речь, на вход VALL-E поступает фонемизированный текст, а на выходе — соответствующая звуковая волна. Кроме того, VALL-E использует механизм подсказок, в котором 3-секундный звуковой образец подается в качестве дополнительных входных данных для модели. Это позволяет генерировать речевое высказывание входного текста, которое обусловлено заданной звуковой подсказкой — на практике это означает возможность выполнять нулевую генерацию речи, то есть генерацию речи из голоса, невидимого в обучающих данных. . Структура высокого уровня VALL-E представлена ​​на рисунке 2.

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

Трехсекундная акустическая подсказка, на которой формируется выходная речь, подается в кодер аудиокодека. В VALL-E для этого используется предварительно обученный кодировщик звука — Encodec (разработка Facebook Research — https://arxiv.org/abs/2210.13438). Encodec принимает в качестве входных данных сигнал речи и выводит его сжатое дискретное представление посредством рекурсивного векторного квантования (RVQ) с использованием нейронной архитектуры кодер-декодер. Мы углубимся в Encodec в части 3 этой статьи, а сейчас давайте просто предположим, что он выводит дискретное представление аудиосигнала, разбивая его на фиксированные временные окна и назначая каждому окну представление из известного словаря вложений аудио ( концептуально очень похоже на встраивание слов).

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

На рисунке 3 мы сравниваем конвейер VALL-E с традиционным нейронным конвейером TTS. Мы видим, что основное отличие заключается в промежуточном представлении звука. В VALL-E они отказались от спектрограммы Mel и использовали представление, созданное моделью Encodec. Однако стоит отметить, что под капотом Encodec также используется представление спектрограммы, поэтому оно все еще используется в этой архитектуре, хотя и менее заметно.

В разделе результатов документа VALL-E они показали, что они превосходят предыдущую современную модель TTS с нулевым выстрелом, YourTTS, на данных LibriSpeech по нескольким показателям, которые включают человеческие оценки, такие как сходство средняя оценка варианта (SMOS) и оценки на основе алгоритмов, такие как частота ошибок в словах (WER). В интересном исследовании абляции они показывают, что подсказка фонемы вносит вклад в содержание генерации (за счет уменьшения WER), а звуковая подсказка способствует сходству говорящего (путем улучшения показателя сходства говорящего).

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

Часть 3 — Encodec: рабочая лошадка VALL-E

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

В крайнем левом углу у нас есть наша исходная форма волны, которая сэмплируется с частотой 24/48 кГц, и каждый сэмпл представлен 16 битами (65536 вариантов). Необработанный сигнал передается в кодировщик, который включает операции одномерной свертки для понижения дискретизации и двухуровневый LSTM для моделирования последовательности. Выход кодировщика составляет 75/150 скрытых временных шагов (сравните это с исходными 24/48K!), с измерением глубины 128.

Декодер — это просто зеркальная версия кодировщика, использующая транспонированные свертки для повышения частоты дискретизации скрытого пространства и построения звуковой волны (вот хорошее объяснение транспонированных сверток https://towardsdatascience.com/what-is-transposed- сверточный слой-40e5e6e31c11).

Самое интересное здесь, конечно, квантователь. Как Encodec квантует непрерывную область звука? Использование метода, называемого остаточным векторным квантованием (RVQ), который состоит в проецировании входного вектора на ближайшую запись в кодовой книге заданного размера. Давайте разберем это предложение. Во-первых, что такое кодовая книга?

В случае VALL-E кодовая книга — это словарь векторов размером 1024, где каждая запись представляет вектор размером 128. Наша цель векторного квантования — сопоставить определенный вектор с ближайшим вектором в кодовой книге (по евклидову расстояние), после чего он может быть представлен индексом этого вектора в кодовой книге (при условии, что у всех есть доступ к кодовой книге). Конечно, таким образом мы теряем много информации. Что, если ни один вектор в кодовой книге точно не похож на наш вектор? Отсюда и «остаток» в RVQ!

На рисунке 5 показано, как вектор квантуется с использованием остаточного векторного квантования. В примере у нас есть 3 кодовых книги. Входной вектор сравнивается с каждым из векторов в первой кодовой книге и присваивается ближайшему из них (C1,1). Затем вычисляется остаток между C1,1 и входом, и мы пытаемся сопоставить остаток со следующей кодовой книгой и так далее, пока не достигнем конца нашей кодовой книги. Окончательное представление RVQ — это индексы, которые были сопоставлены в каждой из кодовых книг (1, 3, 2 в нашем примере). Этот метод кодирования чрезвычайно эффективен. Если у нас есть 8 кодовых книг, каждая из которых содержит 1024 записи, мы можем представить 1024⁸=1,2e+24 различных вектора, используя только 1024*8=8192 числа! Конечно, отправитель и получатель должны иметь одну и ту же кодовую книгу, чтобы этот метод квантования работал. Если вы хотите узнать больше о RVQ, например о том, как обучаются кодовые книги, я рекомендую прочитать другую статью, на которой основан Encodec, под названием SoundStream — https://arxiv.org/abs/2107.03312 (да, это кролик дыра).

Вернемся к конвейеру Encodec на рис. 4. Обратим внимание на 3 дополнительные детали, относящиеся к процедуре его обучения:

  1. Спектрограммы Mel создаются как из входного звука, так и из сгенерированного звука. Эти спектрограммы сравниваются, и сигнал от сравнения используется как потеря для управления обучением модели.
  2. Несколько дискриминаторов используются для сравнения кратковременного преобразования Фурье (STFT) исходного и синтетического сигнала. Эта потеря GAN дает другой сигнал, чем сравнение спектрограммы Mel, и было сочтено полезным для Encodec.
  3. Квантизатор содержит преобразователи, которые используются для дальнейшего сжатия аудиосигнала. Это не преобразователь в VALL-E, который предсказывает следующий токен речи, как бы запутанно это ни было. Для дальнейшего понимания преобразователей в Encodec рекомендую прочитать статью или посмотреть видео Алексы Гордич — https://www.youtube.com/watch?v=mV7bhf6b2Hs.

Давайте обобщим то, что мы знаем на данный момент. VALL-E — это модель преобразования текста в речь, которая напоминает языковые модели в своем рабочем режиме, так что она предсказывает следующий дискретный звуковой токен для данной подсказки, состоящей из фонематизированного текста и звукового ввода. Эти дискретные токены изучаются другой моделью под названием Encodec (которая сама основана на SoundStream), которая использует архитектуру кодер-декодер с остаточным векторным квантованием для преобразования звука в дискретные коды.

Часть 4 — Постановка задачи и обучение ВАЛЛ-Э

VALL-E содержит две модели преобразователя, которые используются для обработки входных данных (фонемизированный текст и аудио) — авторегрессионный (AR) преобразователь, который обращается только к прошлым данным, и неавторегрессионный (NAR) преобразователь, который обращает внимание на все точки в время. Давайте посмотрим, почему.

В VALL-E используются восемь различных кодовых книг как часть модели Encodec, где каждая кодовая книга состоит из 1024 записей. Коды из первого квантователя (кодовой книги) обрабатываются моделью AR в соответствии с этим уравнением 1. Давайте сначала проясним здесь некоторую терминологию:

  • C представляет сгенерированный вывод — в виде дискретных аудиокодов.
  • C~ — 3-секундная акустическая подсказка.
  • x - входной текст в виде последовательности фонем
  • C:,₁ представляет данные из первого квантователя/кодовой книги для C

Итак, уравнение 1 показывает, что выходные данные для первого квантователя обусловлены входными данными и выходными данными предыдущих временных шагов для первого квантователя (точно так же, как модель авторегрессионного языка).

В уравнении 2 мы видим генерацию кодов для квантователей со 2 по 8. В отличие от предыдущего случая, здесь выходные данные для каждого квантователя обусловлены всеми временными шагами от предыдущих квантователей (при вычислении кодов для квантователя № 7 модель обусловлена на данных, сгенерированных для квантователей с 1 по 6). В отличие от модели AR, это позволяет параллельно генерировать все временные шаги в одном квантователе, поскольку он зависит только от предыдущих кодов квантователя, а не от предыдущих временных шагов того же квантователя. Авторы подчеркнули этот момент, потому что быстрый вывод особенно важен в моделях преобразования текста в речь, которым необходимо генерировать речь в сценариях реального времени.

Уравнения 1 и 2 визуально изображены на рисунке 6, на котором модели AR и NAR показаны вместе и подчеркнуты различия между ними. Мы видим, что преобразователь AR используется для предсказания только C:,₁, которые являются токенами для первого квантизатора. При этом он обращает внимание на предыдущие токены, которые он сгенерировал. преобразователь NAR обращает внимание на предыдущие квантователи, а не на предыдущие временные шаги (предыдущие токены текущего квантователя недоступны в модели NAR).

VALL-E был обучен на 60 000 часов аудио из набора данных LibriLight, содержащего 7000 различных динамиков (что более чем в 100 раз больше данных, чем в предыдущем состоянии). Набор данных предназначен только для аудио, поэтому для маркировки использовалась модель автоматического распознавания речи. Модель Encodec используется как предобученная модель и на ней не производится тонкая настройка для VALL-E насколько я понял.

Для обучения из LibriLight брались случайные 10–20-секундные выборки. Для акустической подсказки от той же фразы отнималось еще 3 секунды. Они использовали 16 графических процессоров Tesla V-100 для обучения модели, что очень скромно по сравнению с большими языковыми моделями SOTA!

Мы узнали о процедуре и данных, теперь попробуем использовать неофициальную реализацию Pytorch VALL-E на GitHub.

Часть 5 — Немного кодирования

VALL-E не имеет официальной реализации на GitHub, поэтому для своих экспериментов я буду опираться на выпущенную неофициальную версию — https://github.com/enhuiz/vall-e. Более того, контрольная точка модели не выпущена, поэтому вам придется обучать ее с нуля.

Также есть блокнот Google Colab с простым обучающим примером — https://colab.research.google.com/drive/1wEze0kQ0gt9B3bQmmbtbSXCoCTpq5vg-?usp=sharing. В этом примере они подгоняют модель к одному высказыванию привет, мир и показывают, что модель способна воспроизвести это единственное высказывание. Меня интересовали две вещи:

  1. Я хотел воспроизвести их эксперимент «hello world» со своим голосом, просто чтобы убедиться, что конвейер работает правильно.
  2. Я хотел повторить эксперимент Джеймса Скелтона из Paperspace — https://blog.paperspace.com/training-vall-e-from-scratch-on-your-own-voice-samples/, где он обучал модель на очень небольшом подмножестве его собственных записей, и ему удалось воспроизвести с ее помощью свой голос (на чем-то, что он уже записал)

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

Так как же я преуспел? Мне удалось воспроизвести эксперимент hello world, но, к сожалению, мне не удалось воспроизвести эксперимент Paperspace — я просто получил модель, которая создает искаженный звук, отдаленно напоминающий мой голос. Вероятно, это из-за нехватки ресурсов (я тренирую его на экземпляре Google Colab, время ожидания которого истекает через 12 часов). Но все же, я хочу пройтись по процессу вместе с вами. Моя версия блокнота ВАЛЛ-Э здесь — https://colab.research.google.com/drive/1NNOsvfiOfGeV-BBgGkwf0pyGAwAgx3Gi#scrollTo=SbWtNBVg_Tfd.

Как только вы запустите следующую строку в блокноте Colab —

!git clone --recurse-submodules https://github.com/enhuiz/vall-e.git

Вы увидите каталог с именем vall-e в вашем файловом браузере. Путь content/vall-e/data/test содержит данные для эксперимента «Hello World». Обратите внимание, что он содержит два файла, потому что по какой-то причине он прерывается только с одним. Чтобы воспроизвести этот эксперимент, просто удалите файлы в каталоге данных с помощью !rm content/vall-e/data/test/*, запишите, как вы произносите «Hello world», и сохраните его как два файла .wav с разными именами. Поместите файлы .wav в каталог данных, включая два текстовых файла, содержащих слова «hello world» (текстовые файлы должны иметь те же имена, что и файлы .wav, с суффиксом a.normalized.txt).

После этого вы запустите эти две ячейки:

!python -m vall_e.emb.qnt data/test
!python -m vall_e.emb.g2p data/test

Первая ячейка запустит модель Encodec для ваших собственных данных и выполнит квантование, как мы обсуждали ранее. Вторая ячейка преобразует текст «hello world» в фонемы.

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

!python -m vall_e.train yaml=config/test/ar.yml
!python -m vall_e.train yaml=config/test/nar.yml

После того, как модель закончит обучение, вы запустите эту ячейку:

!mkdir -p zoo
!python -m vall_e.export zoo/ar.pt yaml=config/test/ar.yml
!python -m vall_e.export zoo/nar.pt yaml=config/test/nar.yml

Что сохраняет контрольную точку последней модели (которая была создана автоматически) в каталоге с именем zoo.

Наконец, вы выполните вывод с помощью модели, используя:

!python -m vall_e 'hello world' /content/vall-e/data/test/hello_world.wav toy.wav --ar-ckpt zoo/ar.pt --nar-ckpt zoo/nar.pt

Это запустит модель с текстовой подсказкой «Hello world» и звуковой подсказкой того же высказывания. Он сохранит сгенерированный образец как toy.wav, который вы затем сможете прослушать, используя:

from IPython.display import Audio
Audio('toy.wav')

Вот и все! Вы создали свой собственный VALL-E «Hello world». Если у вас нет большого количества вычислительных ресурсов, вероятно, лучше дождаться появления предварительно обученной модели, чтобы использовать эту модель в дальнейшем.

Часть 6 — Выводы и мысли наперед

В этой статье мы увидели VALL-E, новую архитектуру преобразования текста в речь от Microsoft Research. VALL-E генерирует звук в манере, подобной языковой модели, что отличает его от недавних современных методов, которые обычно являются сквозными или следуют конвейеру создания текста-›спектрограммы-формы волны.

Мы также говорили о модели Encodec, которая выполняет квантование звука и используется в качестве предварительно обученной модели при обучении VALL-E. Encodec завораживает сам по себе и позволяет создавать суперконденсированные звуковые представления, используя остаточное векторное квантование. Создатели VALL-E воспользовались этой функцией и построили генеративную «языковую» модель поверх этого квантования.

Наконец, мы увидели некоторый код и воспроизвели эксперимент «hello world» из неофициального кода своим собственным голосом. Официальный код для этой бумаги не был выпущен, равно как и контрольная точка модели. Было бы интересно увидеть и использовать предварительно обученную модель для ВАЛЛ-И, которая, как я предполагаю, рано или поздно появится. Тем не менее, это было интересное познавательное путешествие.

Увидимся в следующий раз!

Элад

Рекомендации

[1] https://arxiv.org/abs/2301.02111 — документ VALL-E (Языковые модели нейронных кодеков — это синтезаторы речи с нулевым преобразованием текста)

[2] https://arxiv.org/abs/2301.02111 — статья Encodec (High Fidelity Neural Audio Compression)

[3] https://wiki.aalto.fi/display/ITSP/Concatenative+speech+synchronous — Объяснение конкатенативного синтеза речи.

[4] https://www.youtube.com/watch?v=aLBedWj-5CQ&t=1s — глубокое погружение в встречу по синтезу речи (HuggingFace)

[5] https://www.youtube.com/watch?v=MA8PCvmr8B0 — переход от нейронного текста к речи (Microsoft Research)

[6] https://www.youtube.com/watch?v=G9k-2mYl6Vo&t=5593s — Отличное видео Джона Тан Чонг Мина о ВАЛЛ-И

[7] https://www.youtube.com/watch?v=mV7bhf6b2Hs — Отличное видео Алексы Гордич о Encodec