На связи снова Калмыкова Надежда, и, как и обещала в первой статье про задачу голосовой инвентаризации, возвращаюсь с рассказом о том, какие подходы к ее решению оказались самыми удачными, и поделюсь впечатлениями о нашем первом хакатоне HackWagon22, который прошел 16-18 декабря 2022.
Для начала, напомню формулировку задачи.
У нас есть аудиозапись, сделанная сотрудником в процессе инвентаризации на обычный смартфон, которая содержит информацию о каждой пронумерованной детали на складе. Из этого аудиофайла необходимо извлечь характеристики деталей и внести их в отчет с минимальными потерями информации. В результате получаем таблицу, где для каждой детали указан номер, завод-изготовитель, год изготовления и комментарий. Правильной считаем только ту строку отчета, где корректны все эти поля. Более подробная постановка задачи, предпосылки и подводные камни описаны здесь.
Перед тем, как использовать эту задачу для нашего хакатона, как подошла к ее решению я?
Поскольку задача состояла именно в проверке жизнеспособности идеи голосовой инвентаризации, и архитектура продукта для инвентаризации на тот момент была на начальных этапах проработки, не было необходимости «подружить» решение с чем бы то ни было, и в процессе разработки была полнейшая свобода.
Нам нужно было предусмотреть подавление шумов – ведь все склады очень разные, на некоторых может быть очень много посторонних звуков, и с этой задачей для наших аудио отлично показала себя библиотека NoiseReduce. Ее использование позволило уменьшить зашумленность исходного материала, не потеряв при этом нужную информацию, для инвентаризации это критично. Для получения текста из аудиозаписи я воспользовалась SpeechKit-ом. Он позволяет получить идеальное распознавание чисел при достаточно хорошей скорости работы и удобстве использования. А для того, чтобы собрать из текста необходимый отчет, я использовала расстояние Левенштейна в сочетании с регулярками – аккуратная работа с ними позволила добиться отличного значения метрики. Так мы пришли к выводу, что у голосовой инвентаризации есть будущее и такой функционал действительно поможет сократить ресурсы компании на проведение этого процесса, не потеряв в качестве результата.
Расскажу, что же происходило на нашем хаке.
Мы были приятно удивлены еще до его начала, потому что пришло в 3(!) раза больше участников, чем мы ожидали. На хакатоне было представлено 2 трека, между которыми распределение команд было плюс-минус одинаковым. Таким образом, на трек с голосовой инвентаризацией пришло почти 50 команд. Задача сначала показалась довольно простой, и на первом чекпоинте участники были настроены очень решительно, тем более, что мы не ставили ограничение на использование готовых сервисов для распознавания голоса. Но уже ко второму чекпоинту после бессонной ночи оптимизма стало меньше – оказалось, что на аудио есть и посторонние голоса, и нарушенный порядок полей, и ошибки в номерах, исправленные не так, как ожидалось – словом, хаоса сильно больше, чем хотелось бы. Ряды участников несколько поредели, однако, уже выделялись команды, у которых прослеживались классная идея решения и четкое распределение задач. И что нас особенно впечатлило – атмосфера соревнования была очень дружественной. Казалось бы, конкуренция – но в чате участники поддерживали друг друга, делились лайфхаками. Ну и куда же без мемасиков? (для них мы, кстати, сделали спец номинацию, но об этом в конце).
Перейдем наконец-то к лучшим решениям.
Бронзовыми призерами хакатона стала команда «Это база».
Сначала команда прогоняла аудиозапись через нейросеть от OpenAI под названием Whisper. Она давала неплохие результаты, но бывали случаи, когда числительные она записывала не цифрами, а прописью. Входящую строку, представляющую число прописью, ребята разбивали на подстроки с помощью регулярки \s+, затем каждую из подстрок сопоставляли с токенами-образцами или разбивали на более мелкие подстроки, выбирая при этом лучшие результаты. В итоге получали набор токенов, по которым генерировали число, а за величину ошибки принимали среднее арифметическое ошибок среди токенов, использованных при генерации. Финальным этапом стало создание веб-сервиса, куда пользователь может загрузить свое решение и скачать итоговый отчет.
Второе место забрала команда Baby Kagllers. Для того, чтобы решать задачу легче и быстрее, участники этой команды решили начать с обработки исходной аудиозаписи и не прогадали – удаление фонового шума и второго голоса на аудио помогло получить лучшие результаты в ходе распознавания. Далее с помощью алгоритма VAD (Voice Activity Detection) аудиозапись делили на отрезки, где спикер говорит. Каждый отрезок распознавали с помощью модели wav2vec. Это снова помогло увеличить скорость распознавания и сократить потребляемые ресурсы без потери качества. На полученных текстах использовали эвристики и регулярные выражения, чтобы достать определенные сущности, и из них уже формировали итоговую таблицу.
А победителями нашего первого хакатона стала команда FoxHound. Перед переводом речи в текст команда сегментировала запись, чтобы выделить основного диктора и отсечь прочие разговоры. Затем провела мини-исследование, какое API распознавания речи работает точнее. А с довольно сложной задачей структурирования неидеально распознанного текста в таблицу, справлялись с помощью алгоритмов нечёткого поиска и сравнения, а также обычных регулярных выражений.
Выбор победителей и призеров был очень непростой задачей – мы получили около 10 действительно классных результатов. Команды старались не только выбить лучший скор, но и продумать архитектуру, заменяемость различных составляющих своих решений, приятный интерфейс и, не забывая о бизнесовой специфике задания, работали над быстродействием используемых моделей.
В заключение хотелось бы в очередной раз поблагодарить всех участников за слаженную работу, профессионализм и неизменную жизнерадостность на протяжении всего хакатона, несмотря на недостаток сна, литры выпитого кофе и действительно непростые задачи. Мы планируем проводить хакатоны регулярно и будем делать все возможное, чтобы задачки были интересными, организация качественной, а опыт участия – исключительно положительным. Так что следите за нашими новостями и обязательно присоединяйтесь к следующим соревнованиям!
P.S. И конечно, один из лучших мемов этого хака!