Fast Speech 2 Implementation Report
Created on November 28|Last edited on December 19
Comment
Архитектура

Упрощенный он потому, что я в отличие от авторов статьи упрощенно работаю с питчем в VarianceAdaptor: не использую Wavelet, а также использую линейную сетку вместо логарифмической при разбиении на корзины. В остальном же модель повторяет архитектуру статьи, а так же реализует некоторые новые возможности контролируемого синтеза, о которых будет сказано дальше.
Воспроизведение
Эксперименты
Графиков будет мало, потому что больше 1000 итераций я запускал всего несколько моделей. Но даже по ним легко прослеживаются эксперименты и изменения.
В начальных экспериментах предсказывался не log (duration), а duration, что приводило к существенному замедлению оптимизации. Кроме того, предсказывались ненормированные энергия и питч, что тоже не шло на пользу.
Легко заметить, насколько лучше стали оптимизироваться duration (теперь логарифмируется), pitch и energy (теперь приводятся к [0, 1] делением на максимум).
После нескольких итераций дебага была обучена финальная версия модели (здесь CoolFastSpeech). Она учится 200 эпох с максимальных lr 3e-4 и batch size 64. На обучение потребовалось примерно 8 часов на P100. При этом полученное качество, как можно заметить дальше, очень даже хорошее (в качестве вокодера используется предобученная WaveGlow).
В качестве одного из экспериментов я пробовал переписать MHA с использованием pre-norm вместо post-norm (как мы знаем, он работает более стабильно и часто используется в статьях в последнее время). Однако эксперименты показали, что при тех же гиперпараметрах такая модель звучит хуже. К сожалению, вандб в этот запуск сломался и логи не сохранились и пришлось судить модель по моему личному opinion score.
Инференс
Здесь очень много дорожек, можно обслушаться.
Из интересного - последняя версия модели также обуславливается на speaker_id. В LJSpeech есть 50 разных спикеров. Информация о спикере подается в модель и добавляется к length_regulator_output в VarianceAdapter в виде speaker_embedding'a - вектора из обучаемой матрицы. И хотя разница на слух заметна не для всех спикеров, на синтез это все же влияет - получаются немного разные голоса.
А вот вам очень много разных примеров "контролируемой" генерации аудио. Здесь можно увидеть очень много примеров синтеза трех фраз:
- A defibrillator is a device that gives a high energy electric shock to the heart of someone who is in cardiac arrest
- Massachusetts Institute of Technology may be best known for its math, science and engineering education
- Wasserstein distance or Kantorovich Rubinstein metric is a distance function defined between probability distributions on a given metric space
с разными параметрами генерации. Варьируются скорость, питч, энергия и id говорящего.
К сожалению, нормальный UX не завезли (у меня кончилась квота на всех возможных гпу и я не смог перезаписать удобные вавки), придется поскролить лапками.
Название выглядит как sp={speed}_en={energy}_p={pitch}_sid={speaker_id}
Заключение
Все получилось! Модель умеет говорить даже сложные фразы, даже "vivivivivivivivivvivi trtrtrtrtrttrtrtrtrtr"! Получилось очень интересно, самое сложное, как всегда, было начать (и успеть до дедлайна).
Add a comment