Skip to main content

HiFi-GAN Implementation Report

It seemed cool until coding
Created on December 22|Last edited on December 26
ОТЧЕТ НАХОДИТСЯ НА СТАДИИ РАЗРАБОТКИ
Третий раз обучаю ган и трейтий раз недоволен происходящим. Но в целом работает

Введение

Задача простая и понятная. Человечество пока не справилось полностью отказаться от mel-spec преобразования сырого аудио. И если wav -> mel-spec понятным образом решается алгоритмически, то в обратную сторону уже сложнее, потому что мы потеряли информацию. Поэтому синтез речи нуждается в вокодерах. Да, есть Griffin-Lim, но как мы помним из предыдущей работы он щелкает и робовойсит, хоть и старается как может. Но мы же в эру искуственного интеллекта живем, так что грех не воспользоваться.
Если присмотреться к формулировке, то легко можно заметить хорошее применение для GAN'ов. И действительно, при желании можно собрать сколько угодно неразмеченных данных, сделать из них мелспеки, а потом решать задачу в обратную сторону. Авторы HiFi-GAN подумали так же и предложили свою замечательную архитектуру. Ее мы здесь и используем.

Реализация

У статьи есть официальная имплементация, от которой у меня агресия и зубы скрипят. Поэтому, немного подсматривая к ним, я кое-как написал свой ГАН, который не использует циклы по спискам тензоров для подсчета лосса, а так же лишен других явных вычислительных и визуальных недостатков.
Все гиперпараметры архитектуры и оптимизации были полностью взяты из статьи, за исключением размера батча: 16 для большой модели не помещался, поэтому использую 8. При запуске первой версии кода все учится - радуемся, открываем шомпанское!


После нескольких итераций багфикса на ночь поставил учиться две "перспективные модели". Модели обучились, даже что-то говорят осмысленно. Только вот графики какие-то странные...


Утром я буквально вскочил с мыслью "а шаг шедулера-то я как часто делаю?". Оказалось, каждую итерацию, а не каждую эпоху... Вот так 8 часов я выделял СО2 напрасно.
Ну вот, вроде багов больше не осталось, можно основательно ставить обучение за 12 часов до дедлайна. Спасибо хоть перенесли. Так как видеокарты две, а писать какое-либо распределенное обучение я не хотел, то было решено использовать модельки немного разного размера. Как показала практика, V2 с параметрами из статьи у меня немедленно проигрывает дискриминатору, поэтому hidden_dim (единственное отличие от V1) было решено поставить где-то посередине - 256. Соответственно, размер батча тоже получилось увеличить до авторских 16. Так что теперь смотрим на происходящее с замиранием сердца и надеемся на благосклонность градиентного спуска.


А пока оно учится предлагаю послушать семплы двух последних запусков и одного ночного у которого lr сошелся в 0.

Слушаем семплы и радуемся


Run set
3


Воспроизводимость

Про это есть в ридми, но давайте еще и тут расскажу.
Чтобы протестировать работу решения, достаточно запустить inference.py, предварительно указав путь к папке с вавками. Он сам скачивает нужную версию модельки с wandb, применяет мелспеку, прогоняет модельку и сохраняет результат в рядом с вавками.
Если же хочется обучить модельку, то параметры обучения (а так же логирование и пути) настраиваются в config.py. После того, как вы поменяли параметры на ваш вкус, достаточно запустить train.py, который тут же (ну или через некоторое время) обучит вам замечательный вокодер.

Выводы

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