Преобразование текста в речь с помощью нейросети
Для преобразования текста в речь (Text To Speech, TTS) большинству систем необходимы качественные образцы голоса, согласованные фонемы и лингвистические признаки. Мы перевели статью о новом нейросетевом решении с менее строгими требованиями. Архитектура сети основывается на сдвиговом буфере памяти и является более простой, чем в уже существующих приложениях. Исходный код системы открыт и доступен для загрузки и тестирования.
Описание модели VoiceLoop
Методы преобразования текста в речь можно разделить на четыре типа: системы на базе правил (rule-based), конкатенативные, статистико-параметрические (основанные на скрытой марковской модели) и нейронные. Для статистико-параметрических методов необходим тщательный отбор и фильтрация исходных образцов речи. Конкатенативные системы менее строгие, но всё же требуют несколько десятков минут качественных аудиозаписей. Появляющиеся нейронные методы в перспективе обещают подражать реальным голосам, обучаясь на данных, взятых из открытого доступа.
В этой работе решается задача подражания голосу человека на основе образцов речи, взятых из Интернета. Современные системы строятся в основном на тщательно отобранных аудиосэмплах, в то время как предлагаемый метод может использовать звук, взятый из публичных выступлений (на YouTube), несмотря на наличие фонового шума, хлопков и неточной автоматической транскрипции текста. Более того, почти все такие видео содержат несколько говорящих людей, а некоторые ролики имеют низкое качество звука, что создаёт дополнительный шум и выбросы.
Применяемый метод называется VoiceLoop. Он основан на модели рабочей памяти, также известной как фонологическая петля. В этом алгоритме с помощью буфера памяти создаётся фонологическое хранилище, представляющее матрицу. В каждый момент времени все её столбцы сдвигаются вправо, и в буфер помещается новое представление. Это позволяет механизму, создающему представления, использовать уже существующие в буфере данные для формирования долгосрочных зависимостей.
Входные предложения представляются в виде списка фонем. Любая из 42 фонем, используемых в словаре, кодируется как короткий вектор, а входное предложение — как список векторов соответствующих фонем (контекст на этом этапе не учитывается). В каждый момент времени кодировки фонем взвешиваются и затем суммируются с помощью вектора весов внимания. Из них формируется текущий вектор контекста, а в качестве механизма внимания используется модель Грейвза.
Отличительные свойства TTS сети:
- Вместо обычных рекуррентных нейронных сетей (Recurrent neural network, RNN) используется буфер памяти.
- Одна и та же память распределяется между всеми процессами и многократно используется для выводов.
- Для всех вычислений применяются неглубокие полносвязные нейронные сети.
- Используется предельно простой механизм считывания данных.
Эти особенности делают архитектуру нейросети более надёжной и позволяют имитировать речь на основе зашумлённых и ограниченных обучающих данных. Кроме того, поскольку выход системы связан со входом, можно обучить новый синтезатор речи с помощью коротких аудиопоследовательностей в сочетании с автоматически генерируемым текстом. Различные интонации можно легко формировать путём прайминга: для этого необходимо инициализировать буфер до процесса синтеза.
Качество метода измерялось двумя способами: для TTS использовалась средняя экспертная оценка (Mean Opinion Score, MOS), а речевой синтезатор проверялся на предварительно обученной мультиклассовой нейросети, которая достигала почти идеальных показателей на реальных данных.
Архитектура сети
Прямая передача данных по сети VoiceLoop состоит из четырёх последовательных этапов. Сначала выполняется контекстно-свободное кодирование входной фразы и речевого синтезатора. Затем вычисляется контекст и происходит обновление буфера памяти. Завершающий шаг — генерация выходных данных. В случае ошибки буфер памяти подаёт сигнал с выхода на более ранние шаги.
Архитектура модели:
Шаг 1 — кодирование синтезатора речи и исходного предложения
Каждый речевой синтезатор представлен в виде вектора. Во время обучения эти векторы сохраняются в таблице поиска (Lookup table, LUT), а для новых синтезаторов, которые обучаются уже после настройки нейросети, они вычисляются путём простой оптимизации.
Входное предложение преобразуется в последовательность фонем с помощью словаря произношения CMU (Carnegie Mellon University). В этом словаре 40 фонем, к которым добавляются ещё два элемента для обозначения пауз различной длины. Затем каждая фонема сопоставляется с кодировкой, основанной на обученной таблице поиска. В результате получается матрица кодирования фонем.
Таким образом, на первом шаге используются две неглубокие сети — таблица поиска для синтезаторов речи и таблица поиска для фонем.
Шаг 2 — вычисление контекста
Для определения контекста применяется механизм монотонного внимания, основанный на смеси гауссовских распределений Грэйвза (Gaussian Mixture Model, GMM). В каждый выходной момент времени сеть внимания принимает буфер с предыдущего шага в качестве входных данных. Сеть имеет один скрытый слой и функцию активации ReLU для него.
Далее для каждого элемента суммируются все компоненты и рассчитываются веса внимания, образующие вектор.
Затем контекстный вектор вычисляется как взвешенная сумма столбцов матрицы вложений входной последовательности (кодировки фонем). Функция потерь всей модели зависит от контекстного вектора, и, следовательно, от вектора внимания.
Шаг 3 — обновление буфера
На каждом временном шаге в буфер добавляется новый вектор представления на место первого столбца. Последний столбец при этом удаляется, а остальные копируются со сдвигом вправо. Здесь количество элементов в буфере равно сумме размерности вложения фонем и размерности вывода.
Вектор нового представления вычисляется с использованием полносвязной неглубокой нейросети с одним скрытым слоем и функцией активации ReLU. В качестве входа сеть принимает буфер с предыдущего шага, вектор контекста и предыдущие выходные данные. Новое представление зависит также от речевого синтезатора и добавляет проекцию его вложения в вектор контекста.
Шаг 4 – генерация вывода
Выходные данные генерируются с помощью проекционной матрицы синтезатора речи и нейросети с такой же архитектурой, как в шагах 2 и 3.
Обучение
Вывод представляет собой вектор признаков вокодера размерностью 63, вычисленный с помощью Merlin toolkit. Во время обучения выходные данные сравниваются с истинными (ground truth) признаками вокодера с использованием среднеквадратичных потерь (Mean squared error, MSE). Этот процесс происходит на каждом временном промежутке и требует точного выравнивания входной и выходной последовательностей.
Но человеческая речь не является детерминированной — повторяя одну и ту же фразу, мы каждый раз произносим её по-разному. Поэтому нельзя ожидать, что детерминированный алгоритм спрогнозирует корректные значения. Даже один и тот же вокодер не может повторить свой голос и при этом полностью устранить MSE-потери, так как при повторном воспроизведении предложения появляется изменчивость. Проблему позволяет решить метод форсирования учителя (teacher forcing). Он устраняет большую часть отклонений и обеспечивает конкретику в произнесении предложений.
Когда начинается обучение, прогнозируемый результат сам по себе является ещё и источником шума, который по мере развития становится более похож на истинные образцы голоса. Однако систематическое различие между ними позволяет сети лучше обучаться в ситуации, возникающей во время тестирования. Во время обучения выполняется сначала прямой, а затем обратный проход по всем выходным последовательностям без усечения.
Эффективность
Полная модель содержит 9.3 миллиона параметров и работает почти в режиме реального времени на одноядерном CPU Intel Xeon E5 и в 5 раз быстрее на GPU NVIDIA M40. Следовательно, даже без специальной оптимизации VoiceLoop можно адаптировать для запуска на мобильном клиенте аналогично существующим не нейронным решениям TTS.
Обучение нового речевого синтезатора
Особенности речи разных людей могут существенно различаться, и приспособиться к этим факторам на основе ограниченного набора голосовых образцов — непростая задача. Цель TTS — научиться подражать новому человеку на основе сравнительно короткой голосовой выборки. В идеале новый голос должен интерпретироваться в виде параметров вложения вектора речевого синтезатора без необходимости переучивать сеть. Для этого нужна достаточно большая выборка обучающих голосовых примеров.
Для обучения нового синтезатора необходимы образцы голоса и расшифрованный текст. Процедура обучения проводится с фиксированными весами всех сетей и проекций. Метод стохастического градиентного спуска (Stochastic Gradient Descent, SGD) позволяет обновлять только вектор речевого синтезатора для формирования вложения нового голоса. Процесс обучения при этом не отличается от описанного ранее.
Генерирование изменчивости
Как упоминалось выше, естественная речь не является детерминированной и для подражания ей необходимо генерировать изменчивые фразы. VoiceLoop, в отличие от других моделей, не использует для этого случайный компонент (вариационный автоэнкодер) и генерирует выходные последовательности с помощью прайминга.
В прайминге начальный буфер инициализируется на основе вводного процесса, в котором через систему помимо основных входных данных проходит какое-нибудь другое слово или предложение. Это позволяет придать буферу окраску — мы получим разные результаты, если в качестве вводного предложения будем использовать фразу, сказанную с разным эмоциональным контекстом. При таком подходе можно достичь желаемого уровня изменчивости.
Эксперименты и результаты
В опытах использовалось несколько наборов данных. Для сравнения с существующими решениями, создающими только один синтезатор речи, применялись датасеты с голосом одного человека. Обучение нескольких синтезаторов проводилось на выборках из набора данных VCTK. Также создан новый датасет, состоящий из четырёх-пяти публичных выступлений разных людей на YouTube.
Эксперименты для одного синтезатора
Эксперименты проходили на Blizzard Challenge 2011 и 2013 с использованием наборов данных LJ, Nancy и аудиокниг на английском. Результаты сравнивались с истинными образцами, а также с методами Char2Wav и Tacotron. Ниже показаны оценки MOS. Как можно видеть, результаты превосходят эти два решения, но всё ещё хуже, чем истинные.
Оценки MOS (Mean + SD)
Метод | LJ | Blizzard 2011 | Blizzard 2013 |
Tacotron Char2Wav VoiceLoop Ground truth | 2.06 ± 1.02 3.42 ± 1.14 3.69 ± 1.04 4.60 ± 0.71 | 2.15 ± 1.10 3.33 ± 1.06 3.38 ± 1.00 4.56 ± 0.67 | N/A 2.03 ± 1.16 3.40 ± 1.03 4.80 ± 0.50 |
Также выполнена оценка Mel Cepstral Distortion (MCD) — это автоматическая проверка совместимости между двумя аудиопоследовательностями. Для выравнивания сэмплов по времени применялся MCD DTW, который использует динамическую трансформацию временной шкалы (Dynamic Time Warping, DTW). По результатам оценивания VoiceLoop также превосходит остальные методы за исключением Tacotron на датасете LJ. Но из предыдущей таблицы видно, что Tacotron не является конкурентоспособным на этом наборе данных.
Оценки MCD (Mean + SD, чем ниже, тем лучше)
Метод | LJ | Blizzard 2011 | Blizzard 2013 |
Tacotron Char2Wav VoiceLoop | 12.82 ± 1.41 19.41 ± 5.15 14.42 ± 1.39 | 14.60 ± 7.02 13.97 ± 4.93 8.86 ± 1.22 | N/A 18.72 ± 6.41 8.67 ± 1.26 |
Эксперименты для нескольких синтезаторов
Опыты проводились на наборе данных VCTK. Записи речи 109 людей делились на четыре подмножества: 22 человека из Северной Америки (мужчин и женщин) и 65, 85 и 101 случайно выбранных сэмплов, при этом оставшиеся (87, 44, 24 и 8 записей соответственно) использовались для проверки. Все подмножества были разделены на обучающую и тестовую выборки.
Как видно на рисунке, сгенерированные образцы голоса демонстрируют разное динамическое поведение для разных ораторов. Для сравнения результатов использовалась открытая реализация Char2Wav, позволяющая генерировать несколько речевых синтезаторов. Ниже можно увидеть оценки MOS и MCD, в которых VoiceLoop снова показывает лучшие результаты, чем Char2Wav.
Оценки MOS (Mean + SD)
Метод | VCTK22 | VCTK65 | VCTK85 | VCTK101 |
Char2Wav VoiceLoop Ground truth | 2.84 ± 1.20 3.57 ± 1.08 4.61 ± 0.75 | 2.85 ± 1.19 3.40 ± 1.00 4.59 ± 0.72 | 2.76 ± 1.19 3.10 ± 1.17 4.64 ± 0.64 | 2.66 ± 1.16 3.33 ± 1.10 4.63 ± 0.66 |
Оценки MCD (Mean + SD, чем ниже, тем лучше)
Метод | VCTK22 | VCTK65 | VCTK85 | VCTK101 |
Tacotron VoiceLoop | 15.71 ± 1.82 13.74 ± 0.98 | 15.10 ± 1.45 14.10 ± 0.94 | 15.23 ± 1.49 14.16 ± 0.81 | 15.06 ± 1.32 14.22 ± 0.88 |
Идентификация говорящего
Способность системы генерировать голоса, соответствующие исходным, протестирована специально обученным классификатором. Свёрточная сеть обучалась на наборе из нескольких реальных голосов, а затем тестировалась на сгенерированных образцах. Результаты идентификации приведены в таблице — VoiceLoop оказался более точным, чем VCTK, несмотря на использование одного и того же текста. Это указывает на то, что сгенерированные голоса больше похожи на обучающие образцы. Результаты Char2Wav значительно ниже.
Метод | VCTK85 | VCTK101 |
Тестовая выборка VCTK Тестовая выборка Char2Wav Тестовая выборка VoiceLoop | 98.25 75.70 100 | 97.16 81.60 99.76 |
Обучение нового речевого синтезатора
Для проверки возможности получить новые синтезаторы использовалась модель VoiceLoop, обученная на наборе данных VCTK85. Из датасета были убраны 16 ораторов, которые впоследствии использовались как входные данные для новых синтезаторов. В то время как системам TTS обычно требуется несколько часов для моделирования одного синтезатора речи, VoiceLoop тратит на генерацию ~24 минуты. Новые речевые синтезаторы достигают оценки MOS 3.08 ± 0.95, что говорит о том, что механизм генерации не ухудшается в пределах допустимых границ.
Как в случае с несколькими синтезаторами, классификаторы обучаются на основе истинных данных, а тестируются на сгенерированных. При этом они достигают 87.6% точности идентификации.
Размер данных обучения
Эффективность обучения нового синтезатора напрямую зависит от доступной длины образцов речи. Чтобы оценить влияние объёма входных данных на точность модели, описанный выше процесс обучения повторялся для 16 речевых синтезаторов с ограниченными длинами аудиозаписей: 1, 5, 10, 15 и 20 минут. На рисунке ниже видна точность идентификации для всех установленных пределов времени. Даже с двумя предложениями на каждого оратора, что в среднем составляет около 10 секунд, можно обучить новый образец голоса и идентифицировать его с точностью 64.4%.
Эксперименты на реальных данных
Для демонстрации гибкости метода проведены эксперименты с несколькими общедоступными видео. Выбраны четыре докладчика, для каждого из которых получены лучшие четыре-пять результатов. В опытах использовалась аудиодорожка и связанный с ней автоматически сгенерированный текст из видео на YouTube. Общий объём данных составляет 6.2 часа: 8000 сегментов длиной около трёх секунд. Аудио и текст являются зашумлёнными: некоторые примеры представляют собой дискуссии, а в других слышны вопросы репортёров. Иногда присутствовало эхо микрофона или звук низкого качества.
Использовалась такая же процедура обучения, как и в других экспериментах. Достигнутая оценка MOS составляет 2.97 ± 1.03, а точность идентификации — 95.81%. При этом поддерживается возможность генерации нескольких интонаций (прайминг), что продемонстрировано на рисунке ниже.
Можно заключить, что, несмотря на значительное количество зашумлённых данных, VoiceLoop оказывается достаточно устойчив к ним и не воспроизводит фоновые шумы в синтезированной речи.
Использование VoiceLoop
Демонстрационные образцы
1. Один синтезатор
2. Несколько синтезаторов
Исходное предложение:
"Some have accepted this as a miracle without any physical explanation"
Установка
Для работы с VoiceLoop необходимы следующие инструменты:
— Linux/macOS
— Python 2.7
А также:
1 |
sudo apt-get install festival espeak |
Для обучения модели требуется поддержка CUDA. Генерация речи с предварительно обученной моделью может выполняться на CPU.
Выполните следующие команды в выбранной директории проекта:
1 2 3 4 5 6 7 8 |
git clone https://github.com/dmikushin/loop.git cd loop git submodule init git submodule update pip install -r scripts/requirements.txt cd phonemizer python setup.py build sudo python setup.py install |
Данные
Данные для обучения или запуска готовых моделей можно загрузить командой:
1 |
bash scripts/download_data.sh |
Скрипт скачивает и выполняет предварительную обработку подвыборки датасета VCTK, которая содержит голоса людей с американским акцентом. Расположение набора данных:
1 2 3 4 5 6 7 8 9 10 |
loop ├── data └── vctk ├── norm_info │ ├── norm.dat ├── numpy_feautres │ ├── p294_001.npz │ ├── p294_002.npz │ └── ... └── numpy_features_valid |
Предварительно обученные модели
Модели можно скачать, выполнив:
1 |
bash scripts/download_models.sh |
После загрузки они будут находиться в каталоге models. Модель для одного синтезатора находится в папке blizzard.
1 2 3 4 5 6 7 8 |
loop ├── data ├── models ├── blizzard ├── vctk │ ├── args.pth │ └── bestmodel.pth └── vctk_alt |
SPTK и WORLD
Для генерации речи необходимы SPTK 3.9 и вокодер WORLD:
1 |
bash scripts/download_tools.sh |
Расположение:
1 2 3 4 5 6 |
loop ├── data ├── models ├── tools ├── SPTK-3.9 └── WORLD |
Быстрый старт
Если вы хотите воспользоваться уже обученной моделью, то после установки необходимых инструментов выполните команду:
1 2 |
python generate.py --spkr 10 --checkpoint models/vctk/bestmodel.pth --text "Hello, could you please say something?" mplayer models/vctk/results/Hello_could_you_please_say_something.gen_10.wav |
Результаты будут находиться в models/vctk/results. Вы получите:
— сгенерированный образец, сохранённый как gen_10.wav
— исходный (истинный) образец orig.wav.
Вы можете использовать тот же текст с другим голосом:
1 |
python generate.py --npz data/vctk/numpy_features_valid/p318_212.npz --spkr 18 --checkpoint models/vctk/bestmodel.pth |
Обучение
Один синтезатор
Модель для единичного голосового синтезатора обучена на Blizzard 2011. Выполните команду:
1 |
python train.py --noise 1 --expName blizzard_init --seq-len 1600 --max-seq-len 1600 --data data/blizzard --nspk 1 --lr 1e-5 --epochs 10 |
Затем продолжите обучение с новыми параметрами:
1 |
python generate.py --npz data/vctk/numpy_features_valid/p318_212.npz --spkr 18 --checkpoint models/vctk/bestmodel.pth |
Несколько синтезаторов
Для начала следует обучить модель с уровнем шума 4 и входной последовательностью длиной 100:
1 |
python train.py --expName vctk --data data/vctk --noise 4 --seq-len 100 --epochs 90 |
Снова обучите модель на полных данных, изменив уровень шума на 2:
1 |
python train.py --expName vctk_noise_2 --data data/vctk --checkpoint checkpoints/vctk/bestmodel.pth --noise 2 --seq-len 1000 --epochs 90 |
Теперь вы можете генерировать голосовые предложения, используя скрипт generate.py. Например:
1 |
python generate.py --text "hello world" --spkr 1 --checkpoint models/vctk/bestmodel.pth |
Раньше речевые синтезаторы разрабатывались для людей с нарушениями зрения. Сейчас же они доступны всем желающим. Генерация речи из текста позволяет не только подражать голосам известных людей, но и помогает изучать произношение иностранных языков, прослушивать книги и создавать виртуальных ассистентов.
С оригинальной статьёй можно ознакомиться на сайте arxiv.org.