Far Fields mic (Mic array), или Как научить вашего голосового помощника слышать лучше
Plan: To bother about the best method of accomplishing an accidental result. [Ambrose Bierce, The Enlarged Devil’s Dictionary.].
В этой статье я хочу рассказать о своем давнем увлечении — изучении и работе с far fields mic (mic array) — массивами микрофонов. Статья будет интересна увлекающимся построением своих голосовых помощников, она ответит на некоторые вопросы людям, воспринимающим инженерное дело как искусство, а также желающим попробовать себя в роли Q (Это из Бондианы).
Много лет тому назад я увлекся программированием, писать код я начал потому, что разрешали играть только в игры, написанные самостоятельно. Это было в году так 87 и это была Yamaha MSX. На эту тему тогда же был первый стартап. Невольно вспоминается высказывание: «Выбери себе работу по душе, и тебе не придётся работать ни одного дня в своей жизни».
И вот прошли годы, и я по прежнему пишу код, но на этот раз, потому что мне просто нравится результат.
Для меня хобби — ну кроме катания на роликах, для разминки мозгов и «не забуду матан» это работа с Far Fields mic (Mic array). Зря что ли преподаватели время со мною тратили.
Что это такое и где применяется
В голосовом помощнике, который слышит вас с расстояния, обычно присутствует массив микрофонов. Их мы находим и в системах видео-конференц-связи. Так как при коллективном общении львиная доля внимания уделяется речи, мы естественно, не постоянно при общении смотрим на говорящего, а говорить точно в микрофон или гарнитуру, это сковывает и неудобно.
Практически каждый, уважающий клиента, производитель мобильников использует в своих творениях от 2 и более микрофонов, (да, да за этими дырочками сверху, снизу, сзади сидят микрофоны). К примеру в iPhone 3G/3GS он был единственный, в четвертом поколении айфонов их было два, а в пятом насчитывалось уже три микрофона. В общем то это тоже массив микрофонов. И все это для лучшей слышимости звука.
Ну вернемся к нашим голосовым помощникам.
Как же увеличить дальность слышания?
«Нужно больше микрофонов»
Простая идея: если для того, чтоб услышать того кто рядом, достаточно одного микрофона, то для того чтоб услышать издалека, нужно применить более дорогой микрофон с отражателем:
*На самом деле -это не часть фурри-сьюта, а серьезный девайс для охотников и разведчиков.
Диаметр зеркала от 200мм до 1,5м
Больше такого см elektronicspy.narod.ru/next.html
Или может, если поставить много дешевых микрофонов, то количество перейдет в качество и все получится?
Странно, но это работает. Правда с большим количеством матана, но работает. И расскажем мы про это в следующем разделе.
А почему слышим дальше и без красивых рупоров?
Соотношение сигнал\шум у систем с микрофонными матрицами как то лучше. Легко видеть:
Что несфокусированный микрофон (левая картинка) записывает все звуки со всех направлений, а не только тот, что нужно.
Откуда же большая дальность? На правой картинке, микрофон внимательно слушает только один источник. Как бы сфокусировавшись, получает сигнал только избранного источника, а не кашу из возможных источников шумов, а чистый сигнал просто усилить (сделать громче), не применяя сложных техник шумоподавления. Примерно как рупор, но на матановой тяге.
Что же не так с шумоподавлением?
У применения сложного шумоподавление уйма недостатков — значит, уйдет часть сигнала, вместе с частью сигнала изменится звук, и на слух это выглядит как характерное окрашивание звука шумодавом и как результат неразборчивость. Эта неразборчивость видна русскоговорящим, которые хотят услышать от собеседника вот эти шипящие. Ну и как дополнительно — в результате шумоподавления слушающий не слышит вообще никаких опознавательных сигналов, связывающих его с собеседником (дыхания, сопения и других шумов, сопровождающих живую речь). Это создаёт некоторые проблемы, ведь в разговорной речи вот это все слышно, и как раз помогает оценивать состояние и отношение к вам собеседника. Отсутствие их (шумов) пока мы слышим голос вызывает неприятные ощущения и снижает уровень восприятия, понимания ну и идентификации. Ну а если вас слушает голосовой помощник — шумоподавление затрудняет распознавание как ключевой фразы, так и речи после. Правда есть лайфхак — распознавалку нужно обучать на выборке, записанной с учетом искажений от именно используемого шумопонижения.
Те, кому знакомы слова cocktail party problem могут пока сходить на кофе или коктейль, и попробовать провести натурный эксперимент, те кому милей почитать, продолжают дальше.
Кратко о матане, на котором оно работает: ASL и Beamforming
Буду краток: делается это с помощью белой, серой или темной магии (зависит от предпочитаемой темы в IDE) и матана.
DOA Estimation (определение направления на источник звука) и формирование луча (beamforming)
Наиболее простой и легкий для понимания -delay & sum (DAS and FDAS) — лучеформирование на базе задержки и суммирования.
Рисунки взяты www.labbookpages.co.uk/...beamforming/delaySum.html
Не забываем про разную длину волн и для каждой частоты рассчитываем свою расчетную задержку tn
Примерная диаграмма направленности будет выглядеть как то так
Подробнее и с формулами на www.labbookpages.co.uk/...beamforming/delaySum.html
Не забывшие как раскуривать матан могут причаститься к JIO-RLS (Joint Iterative Subspace Adaptive reduced-rank least squares).
Очень напоминает по вкусу градиентный спуск, знаете ли.
Итак обычными методами добится сравнимого с матричным микрофоном качества сложно. После применения определения направления на источник, И как результат этого, слышим только тот источник, что нужен, избавляемся от шумов и реверберации среды, даже той, которая слабо различима на слух (эффект Хааса).
Голосовой помощник — как это выглядит изнутри
Итак как выглядит схема обработки звука у матерого голосового помощника:
Сигнал с массива микрофонов поступает на устройство, в котором мы формируем луч на источник звука (beamforming), тем самым убирая помехи. Потом звук этого луча начинаем распознавать, обычно для качественного распознавания ресурсов устройства недостаточно, и чаще всего сигнал уходит для распознавания в облако (На выбор Microsoft, Google, Amazon).
Внимательный читатель заметит: А на картинке с описанием есть какой то квадратик Нот word, а почему не сразу распознавание, как обещали?
Зачем на схеме нарисован этот наверное лишний квадратик?
А потому что постоянно транслировать сигнал изо всех источников шумов в интернет для прослушивания распознавания никаких ресурсов не хватит. Поэтому распознавать начинаем, только когда поняли, что от нас этого таки точно хотят—и для этого сказали специальное заклинание — ок гугл, сири или алекса, ну или кортану позвали. А классификатор Нот word — чаще всего нейронка и работает прямо на устройстве. В построении классификатора есть тоже много интересного, но сегодня не об этом.
И на самом деле схема выглядит вот так:
Может быть сформировано несколько лучей на разные источники сигнала, и ищем специальное слово мы в каждом из них. Но дальше обрабатывать будем того, кто сказал нужное слово.
Дальнейший этап- распознавание в облаке, многократно освещен в интернете, по нему множество туториалов. Мой скромный рассказ надеюсь поможет вам понять, почему помощник, сделанный строго по туториалу работает хорошо только при условии полного отсутствия шумов и рядом. И так плохо там, где они есть, например на кухне.
Как вы можете приобщится к этому празднику матана
Проще всего купить dev board. Обзор существующих девбордов: один из наиболее полных — developer.amazon.com/...xa-voice-service/dev-kits
Наиболее дружелюбные для начинающих:
www.seeedstudio.com/...-Raspberry-Pi-p-2941.html
www.seeedstudio.com/...ic-Array-v2-0-p-3053.html
основан на XMOS XVF-3000.
Применяю сам: https://www.matrix.one/products/voice
Сделана так как мне нравится — FPGA с открытым интерфейсом управляет микрофонами матрицы, общение с ней по SDA.
Мои подвиги по скрещиванию Android Things и Mic Array
К этой плате (Voice) конечно есть немало примеров, но вот мне как раз удобно использовать ее под Things.
Доводы за Things:
- как инструмент он гораздо более гибок.
- удобно что можно с экраном использовать как отдельный прибор
- можно использовать как headless устройство, т.е сделать передачу по сети (создать апи для передачи на другое устройство)
- удобная отладка
- много библиотек в том числе для передачи по сети;
- потому что инструментов для анализа — много.
Например я использую:
- анализ звуковых файлов,
- HRTF,
- Тренировка\построение классификаторов.
Да и потом если прийдется портировать/ переписывать код в какой нибудь эмбед, то как то проще это делать с Java кода.
К сожалению пример от авторов платы для Things был немного неработоспособен, поэтому я сделал свой— демо проект (естественно — я же ж могу)
github.com/...Voice-with-Android-Things
Вкратце о чем там — всю черную магию по быстрому опросу микрофонов, FFT делаем на C++, а визуализацию, анализ, сетевое взаимодействие — на Java.
Планы на будущее развитие
Источник планов ну и заодно вдохновения: ODAS github.com/introlab/odas
Вот хочу сделать то же, только на Things и без глюков.
- Потому что ODAS немного неудобен при использовании.
- Мне нужен нормальный инструмент для работы
- Потому что могу и мне нравится эта тема
- Использованные аппаратно программные средства отвечают сложности задачи.
12 комментариев
Добавить комментарий Подписаться на комментарииОтписаться от комментариев