Я только что закончил Онлайн-программу по глубокому обучению Coursera на этой неделе. Последнее задание программирования касается обнаружения триггерного слова, также известного как. пробуждение / обнаружение горячего слова. Например, когда вы кричите на Amazon Alexa или Google Home, чтобы они разбудили их.

Будет ли круто создать его самостоятельно и запустить в режиме реального времени?

В этом посте я покажу вам, как именно построить модель Keras, чтобы сделать то же самое с нуля. Для его работы не требуется сторонний голосовой API или сетевое подключение.

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

Подготовьте наборы данных для обучения

Для простоты возьмем слово «Активировать» в качестве триггерного слова.

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

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

Мы их генерируем!

Во-первых, у нас есть 3 типа аудиозаписей,

1. Записи разных фонов аудио. Они могут быть такими же простыми, как два клипа фонового шума по 10 секунд каждый, кафе и гостиная.

2. Записи триггерного слова «активировать». Возможно, вы просто произносите слово 10 раз разным тоном, по 1 секунде каждый.

3. Записи отрицательных слов. Это могут быть вы, говоря другие слова, такие как «ребенок», «кофе», по 1 секунде для каждой записи.

Вот шаг для создания обучающих входных аудиоклипов,

  • Выберите случайный 10-секундный фоновый аудиоклип
  • Случайным образом наложите 0–4 аудиоклипа «активировать» на этот 10-секундный клип.
  • Случайным образом наложите 0–2 аудиоклипа с отрицательными словами на этот 10-секундный клип.

Мы выбираем наложение, так как мы хотим смешать произносимые слова с фоновым шумом, чтобы звуки были более реалистичными.

Для меток вывода мы хотим, чтобы они отображали, закончил ли кто-то только что сказать «активировать».

Сначала мы инициализируем все временные интервалы меток вывода равными «0» с. Затем для каждой наложенной «активации» мы также обновляем целевые метки, присваивая следующие 50 временных шагов «1» с.

Почему у нас 50 временных шагов «1» с?

Потому что, если мы установим только 1 временной шаг после «активировать» на «1», в целевых метках будет слишком много нулей. Это создает очень несбалансированный тренировочный набор.

Иметь 50 «1» - это своего рода хитрость, но это может облегчить им обучение модели. Вот иллюстрация, чтобы показать вам идею.

Кредит: Coursera - deeplearning.ai

Для клипа, который мы вставили «активировать», «невиновен», «активировать», «ребенок». Обратите внимание, что положительные метки «1» связаны только с положительными словами.

Зеленый / голубоватый график - это спектрограмма, которая представляет собой частотное представление звуковой волны во времени. По оси абсцисс отложено время, а по оси ординат - частоты. Чем больше желтый / яркий цвет, тем активнее (громче) определенная частота.

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

Постройте модель

Без дальнейших пояснений, давайте взглянем на структуру модели.

1D сверточный шаг вводит 5511 временных шагов спектрограммы (10 секунд), выводит 1375 шагов. Он извлекает функции звука низкого уровня, аналогично тому, как 2D-свертки извлекают элементы изображения. Также помогает ускорить модель за счет уменьшения количества временных шагов.

Два уровня GRU считывают последовательность входных данных слева направо, а затем, в конечном итоге, используют плотный + сигмоидный слой для прогнозирования. Сигмоид делает диапазон каждой метки от 0 до 1. Значение 1 соответствует пользователю, только что сказавшему «активировать».

Вот код, написанный в функциональном API Кераса.

Обнаружение триггерного слова требует много времени для обучения. Чтобы сэкономить время, Coursera уже обучила модель в течение примерно 3 часов на графическом процессоре, используя архитектуру, показанную выше, и большой обучающий набор из примерно 4000 примеров. Загрузим модель.

Демо в реальном времени

Пока наша модель может взять только статический 10-секундный аудиоклип и сделать предсказание местоположения триггерного слова.

А вот самое интересное, давайте вместо этого заменим его живым аудиопотоком!

Модель, которую мы построили, ожидает 10-секундных аудиоклипов в качестве входных данных. При обучении возможна другая модель, которая берет более короткие аудиоклипы. Но требует от нас переобучения модели на GPU за несколько часов.

Мы также не хотим ждать 10 секунд, пока модель не сообщит нам, что слово-триггер обнаружено. Таким образом, одно из решений - иметь движущееся 10-секундное окно аудиопотока с размером шага 0,5 секунды. Это означает, что мы просим модель прогнозировать каждые 0,5 секунды, что сокращает задержку и делает ее отзывчивой.

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

Давайте посмотрим, как его построить

Входной 10-секундный звук обновляется каждые 0,5 секунды. Это означает, что каждые 0,5 секунды самый старый 0,5-секундный фрагмент звука будет отброшен, а новый 0,5-секундный звук будет сдвинут. Задача модели - определить, обнаружено ли новое слово запуска в свежем 0,5-секундном фрагменте звука. .

И вот код, чтобы это произошло.

Для получения аудиопотока мы используем библиотеку pyaudio. У которого есть возможность асинхронного чтения аудиопотока. Это означает, что запись аудиопотока происходит в другом потоке, и когда становится доступна новая фиксированная длина аудиоданных, она уведомляет нашу модель о необходимости ее обработки в основном потоке.

Вы можете спросить, почему бы просто не прочитать фиксированную длину аудио и просто обработать его в одной функции?

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

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

Когда вы его запускаете, он выводит один из 3 символов каждые 0,5 секунды.

«-» означает тишину,

«.» означает не молчание и не триггерное слово,

«1» означает, что обнаружено новое слово запуска.

--.--......-1----.-..--...-1---..-------..1---------..-1---------.----.--------.----.---.--.-.------------.

Не стесняйтесь заменять вывод символа «1» на все, что вы хотите, чтобы произошло при обнаружении триггерного слова. Запустите приложение, включите звук и т. Д.

Вот демо на YouTube

Резюме и дополнительная литература

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

Вот что следует помнить:

  • Синтез данных - это эффективный способ создания большого обучающего набора для речевых проблем, в частности, для определения триггера слов.
  • Использование спектрограммы и, необязательно, одномерного сверточного слоя является обычным этапом предварительной обработки перед передачей аудиоданных в RNN, GRU или LSTM.
  • Сквозной подход глубокого обучения можно использовать для создания очень эффективной системы обнаружения триггерных слов.
  • Прогнозирование модели глубокого обучения требует времени. Он обрабатывает аудиоданные асинхронно из входящего потока аудио, чтобы избежать прерывания потоковой передачи аудио.
  • Скользящее / подвижное окно ввода - эффективный способ уменьшить задержку.

Дополнительная литература

Привет, Siri: голосовой триггер на устройстве с поддержкой DNN для персонального помощника Apple

Лекция Обнаружение триггерных слов - Coursera

Теперь возьмите полный исходный код из моего репозитория GitHub и создайте потрясающее приложение с триггерным словом.

Первоначально опубликовано на www.dlology.com. Для более практического опыта глубокого обучения.