[Концепция глубокого обучения] · Глубокое обучение для распознавания речи - простая обработка речи

искусственный интеллект Python

Глубокое обучение для распознавания речи — простая обработка речи

Профессор Нг Энда однажды предсказал, что когда точность распознавания речи повысится с 95% до 99%, она станет основным способом взаимодействия с компьютерами.

Давайте научимся распознавать речевую комнату с помощью глубокого обучения!

Машинное обучение — не всегда черный ящик

Если вам интересно, как работает нейронный машинный перевод, вы, наверное, догадались, что мы можем просто кормить нейронную сеть некоторыми звуками и обучать ее генерировать текст:

Это высший квест по распознаванию речи с использованием глубокого обучения, но жаль, что мы еще не совсем там (по крайней мере, не на момент написания этой статьи — держу пари, что мы сможем сделать это через несколько лет) прибыть)

Большой проблемой является разная скорость речи. Один человек может сказать "Привет!" очень быстро, в то время как другой человек может сказать "heeeelllllllllllllooooo" очень медленно, в результате чего получится более длинный звуковой файл с большим количеством данных. Оба файла должны быть распознаны как один и тот же текст - "Привет!". Оказывается, очень сложно автоматически выравнивать аудиофайлы различной длины по тексту фиксированной длины.

Чтобы решить эту проблему, мы должны использовать некоторые специальные приемы и выполнять специальную обработку вне глубоких нейронных сетей. Давайте посмотрим, как это работает!

Преобразование звука в биты (Bit)

Очевидно, что первый шаг в распознавании речи — нам нужно ввести звуковые волны в компьютер.

Как мы должны преобразовать звуковые волны в числа? Давайте используем звуковой клип, в котором я сказал «привет», в качестве примера:

Звуковая волна одномерна, она имеет значение, зависящее от ее высоты в каждый момент времени. Увеличим небольшую часть звуковой волны:

Чтобы преобразовать эту звуковую волну в число, мы просто записываем высоту звуковой волны в равноудаленных точках:

Это называется выборкой. Мы делаем тысячи показаний в секунду и записываем высоту звуковой волны в этой точке одним числом. По сути, это несжатый аудиофайл .wav.

Звук «CD-качества» дискретизируется с частотой 44,1 кГц (44100 отсчетов в секунду). Но для распознавания речи частота дискретизации 16 кГц (16 000 выборок в секунду) достаточна для охвата частотного диапазона человеческой речи.

Давайте семплируем звуковую волну «Hello» 16 000 раз в секунду. Вот первые 100 образцов:

Каждое число представляет собой амплитуду звуковой волны на 16000-й доле секунды.

Ассистент цифрового сэмплирования

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

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

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

Предварительно обработайте наши сэмплированные звуковые данные

Теперь у нас есть последовательность чисел, где каждое число представляет 1/16000 секунды амплитуды звуковой волны.

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

Давайте начнем с того, что сначала разделим наш сэмплированный звук на фрагменты длиной 20 мс каждый. Вот наши первые 20 мс аудио (то есть наши первые 320 сэмплов):

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

Хотя запись длится всего 1/50 секунды, даже эта короткая запись замысловато составлена ​​из звуков разных частот. Есть немного баса, немного середины и даже несколько высоких частот. Но в целом именно эти звуки разной частоты смешиваются между собой, образуя человеческую речь.

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

Представьте, что у вас есть запись, на которой кто-то играет аккорд до мажор на пианино. Этот звук состоит из трех нот: C, E и G. Они смешиваются вместе, образуя сложный звук. Мы хотим разделить C, E и G, разбив этот сложный звук на отдельные ноты. То же самое верно и для распознавания речи.

Для этого нам понадобится преобразование Фурье. Он разбивает сложные звуковые волны на простые. Когда у нас есть эти отдельные звуковые волны, мы суммируем энергию, содержащуюся в каждой частотной полосе.

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

Но легче понять, когда вы рисуете их в виде диаграммы:

Вы можете видеть, что в нашем звуковом клипе длительностью 20 мс много низкочастотной энергии, но не так много энергии на более высоких частотах. Это типичный "мужской" голос.

Если мы повторим этот процесс для каждого фрагмента звука длительностью 20 мс, мы получим спектрограмму (каждый столбец слева направо представляет собой фрагмент аудио продолжительностью 29 мс).

Спектрограммы — это круто, потому что вы можете буквально видеть ноты и другие шаблоны высоты тона в аудиоданных. Нейронной сети гораздо проще найти закономерности в таких данных, чем в необработанных звуковых волнах. Итак, это представление данных, которые мы фактически будем передавать в нейронную сеть.

Определить персонажей из короткого аудио

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

Мы будем использовать рекуррентную нейронную сеть — нейронную сеть, которая имеет память и может влиять на будущие прогнозы. Это потому, что каждая буква, которую он предсказывает, должна иметь возможность влиять на его предсказание следующей буквы. Например, если мы уже сказали «HEL», есть большая вероятность, что мы скажем «LO» рядом с завершением «Hello». Мы вряд ли скажем что-то вроде «XYZ», если вообще не умеем читать. Таким образом, наличие памяти о предыдущих прогнозах помогает нейронной сети делать более точные прогнозы на будущее.

Пропустив весь наш аудиоклип (по одному блоку за раз) через нейронную сеть, мы получим сопоставление, которое идентифицирует каждый аудиоблок и его наиболее вероятную букву. Это приблизительный образец отображения, соответствующий предложению, которое я сказал «Привет»:

Наша нейронная сеть предсказывает, что слово, которое я сказал, скорее всего, будет «HHHEE_LL_LLLOOO». Но он также думает, что я, возможно, сказал "HHHUU_LL_LLLOOO" или даже "AAAUU_LL_LLLOOO".

Есть несколько шагов, которые мы можем выполнить, чтобы привести в порядок этот вывод. Во-первых, мы заменим любые повторяющиеся символы одним символом:

· HHHEE_LL_LLLOOO становится HE_L_LO

· HHHUU_LL_LLLOOO становится HU_L_LO

AAAUU_LL_LLLOOO становится AU_L_LO

Затем мы удалим все пробелы:

HE_L_LO становится HELLO

HU_L_LO становится HULLO

AU_L_LO становится AULLO

Это оставляет нам три возможных транскрипции — «Привет», «Привет» и «Аулло». Если произнести эти слова вслух, все они будут звучать как «Привет». Поскольку нейронная сеть предсказывает только один символ за раз, она выдает некоторые транслитерации, которые полностью отражают произношение. Например, если вы скажете «Он не пошел бы», это может дать транскрипцию «Он не пошел бы».

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

Из наших возможных транслитераций «Привет», «Привет» и «Aullo», очевидно, «Привет» будет чаще появляться в текстовой базе данных (не говоря уже о наших исходных данных обучения на основе аудио), так что это может быть правильным решением. Таким образом, мы выберем «Hello» в качестве нашего окончательного результата среди других транскрипций. Возьми!

Подожди минутку!

Вы можете подумать: «А что, если бы кто-нибудь сказал «Привет»?» Слово существует. Возможно, "Привет" - неправильная транскрипция!

Конечно, возможно, что кто-то действительно сказал «Привет» вместо «Привет». Но такая система распознавания речи (натренированная на американском английском) в принципе не выдает результата транскрипции типа «Hullo». Когда пользователь говорит «Привет», он всегда будет думать, что вы говорите «Привет», независимо от того, как сильно вы произносите «У».

Попробуйте! Если ваш телефон настроен на английский язык (США), попробуйте заставить помощника по телефону распознавать слово «Привет». Это не работает! Он переворачивает стол и выходит, и он всегда читает «Привет».

Не распознавать «Привет» — разумное поведение, но иногда вы сталкиваетесь с неприятной ситуацией: ваш телефон просто не понимает, что вы говорите правильно. Вот почему эти модели распознавания речи всегда переобучаются, им нужно больше данных, чтобы исправить эти несколько случаев.