В последние годы вычислительная фонетика продвинулась вперед благодаря переходу от эвристики, разработанной мозгом пещерного человека, к эвристике, разработанной компьютерами. В этой статье вы узнаете, как сделать классификатор слов, используя написанную мной библиотеку под названием dixi (https://github.com/Threadnaught/dixi).

Зависимости и загрузка

Если вы не используете apt, вам придется найти правильные зависимости. Также требуется Tensorflow-gpu. Откройте терминал и введите;

sudo apt install ffmpeg espeak mbrola mbrola-en1 mbrola-us1 mbrola-us2 mbrola-us3
git clone https://github.com/Threadnaught/dixi
cd dixi

Просто покажи мне данные

tensorboard --logdir=logs

Откройте браузер и перейдите на localhost:6006.

Как это работает?

Эта модель работает на сверточной нейронной сети, что приводит к классификатору, обученному с помощью контрастной оценки шума. Прежде чем запускать его, вы должны сгенерировать 280 000 необходимых обучающих аудиоклипов с помощью python2 synthVoices.py. Даже при работе в четырех потоках это займет некоторое время, поэтому, пока вы ждете, откройте phoneticVector.py в редакторе по вашему выбору.

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

11 dx.loadWords("synth")

В строках с 14 по 18 определяются заполнители для аудиоданных, длины аудио и индекса слова.

14 audio_in = tf.placeholder(tf.float32, [batch_size, 60000])
15 audio_lengths_in = tf.placeholder(tf.int32, [batch_size])
17 index_in = tf.placeholder(tf.int32, [batch_size])

Следующим важным шагом является добавление внешнего интерфейса dixi. Это применяет преобразование Фурье, эквивалентное вопросу «какие ноты составляют этот звук?» Он также растягивает клип, так что независимо от длины слова требуется одинаковое количество времени для произнесения. Это делается для того, чтобы заставить сеть выполнять тяжелую работу по различению звуков, а не легкую работу по измерению длины каждого слова.

20 audio_stretched = dx.addFrontend(audio_in, audio_lengths_in, addNoise=False)

Каждый клип теперь, по сути, стал изображением со временем по одной оси и высотой звука по другой (технический термин — спектрограмма). Как и изображение, вы можете обрабатывать эти данные, используя слои свертки и объединения.

22 audio_conv, _ = dx.addConvPoolLayers(audio_stretched)

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

25 dense, _ = dx.addDense(conv_flat, [int(conv_flat.shape[1]), 100, dx.phonetic_vector_size])

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

30 nce_loss = tf.reduce_mean(tf.nn.nce_loss(nce_weights, nce_biases, index_reshape, dense, nce_sample_count, len(dx.train_words)))
31 train_step = tf.train.AdamOptimizer().minimize(nce_loss)

Следующие несколько строк предназначены для оценки точности модели. Наш трюк с NCE больше не работает, так как каждый клип может содержать любое из 10000 слов. К счастью, мы делаем оценочную партию для каждых 100 обучающих батчей, так что падение производительности приемлемо.

33 guess = tf.argmax(tf.matmul(dense, tf.transpose(nce_weights)) + nce_biases, 1)
34 accuracy = tf.reduce_mean(tf.cast(tf.equal(tf.cast(guess, tf.int32), index_in), tf.float32))

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

Запуск модели

Если у вас есть все клипы, вы можете запустить модель. Осторожно: это занимает у меня 15 часов с использованием моего жесткого диска и моего gtx 970, ваш пробег может отличаться.

python2 phoneticVector.py

Теперь, если вы запустите tensorboard --logdir=logs и откроете localhost:6006, вы увидите созданные вами векторы.