Email: eblinkoff@mail.ru
Телеграм: +79312009928
WhatsApp: +79312009928
Спросить
Заказать
Акция!
Россия, Санкт-Петербург +79312009928

Голосовое управление с технической точки зрения - способ построить архитектуру управления приложением голосом


Как мне пришлось написать аналог консольного скрипта на чистом js и одновременно аналог Автокада на этом же самом чистом js и что изо всего этого получилось (спойлер: получилось!)

Общая архитектура проекта.

Проблема написания таких оболочек - для голосового управления - состоит в том, что мало распознать голос - надо придумать как превратить распознанную речь в команды и обеспечить выполнение этих команд. Самый простой способ - поставить в соответствие с теми или иными фразами (командами) вызов тех или иных методов - которые уже вызываются "руками" - по нажатию кнопок итд. Плюсы этого способа - простота в понимании (низкий порог входа), его легче использовать если пишешь фронтенд с нуля. Теперь про минусы. У меня фронтенд уже есть, он сложился за последние лет пять и встраивать в него что-то довольно затруднительно, да и просто неправильно. Почему неправильно - да хотя бы потому, что неплохо бы делать наш модуль голосового управления так, чтобы можно было использовать его и в других проектах. Также, те методы, которые мы будем вызывать часто имеют параметры, и мы сталкиваемся с проблемой откуда их брать. Также, раз написанный обработчик команд можно использовать повторно для управления не только голосом, а другими способами - например, жестами итд. Итак, решено, выбираем другой подход - делаем нашу систему голосового управления в виде внешней надстройки, котрая получает голосовые команды и инициирует определённые действия, например, клики итд, то есть то же самое, что мы раньше, когда голосового управления не было, делали ручками сами. Ок, с этим разобрались. Теперь перед нами встаёт во весь рост проблема интерпретации голосовых команд.

Интерпретация голосовых команд.

Ну, да, распознанные голосовые команды - это просто текст, чтобы превратить этот текст в действие, надо его "понять" и в зависимости от того, что нам "приказывают" сделать какое-то действие, например, нажать кнопку. И это достаточно сложно - ведь человеческая речь очень вариативна. Допустим, нам надо удалить страницу растения. Как мы можем сказать это? И "удали растение" и "удалить" и "растение выпало" и "удаляем растение" и ещё можно много чего придумать. И всё это неплохо бы предусмотреть, чтобы наши команды были похожи на человеческую речь и мы не мучились, пытаясь вспомнить команду где-нибудь на грядке. Тут есть два пути - пытаться создать нейросеть или что-то ещё более масштабное, понимающее и формализующее речь либо заставить формализовать речь самого пользователя, по максимуму предусмотрев все возможные варианты фразы-команды. Я пошёл по второму пути по вполне логичной причине - строить нейросети довольно сложно, дело это ресурсоёмкое, создать систему команд гораздо легче потому что у нас есть довольно логичное само приложение и контекст - во-первых сама страница приложения, открытая в данный момент и даже что-то более узкое - например, открытое модальное окно или что-то подобное. Всё это позволяет ограничить изначальное количество вариантов действий с бесконечности до вполне приемлемого уровня - от нуля до 10-15 вариантов, что позволяет нам обойтись без нейросетей. Также мы ограничиваем наши команды допущением - первые (или последние) одно или два слова в строке - команда, остальные слова - параметры, которые либо уточняют нашу команду, либо используются для чего-то ещё. Например, если мы говорим приложению: "перейти на блокнот", что оно делает? Оно проверяет, есть ли такая команда "перейти" и если есть проверяет, есть ли среди страниц приложения страница "блокнот"? Если есть - мы просто переходим на эту страницу, если же нет - можно проверить, если у нас есть, скажем, поле для ввода в фокусе, эти слова - "на блокнот" просто нужно ввести в это поле как текст. В итоге получается, что у нас есть три слоя: слой распознавания речи, слой разбора распознанного на команду и параметры и слой исполнения команды с учётом параметров (или без них).

При чем тут Автокад?

Да, всё это на него очень похоже. Распознавания речи там нет (да оно там и не нужно), разбор распознанного - это консоль, ну, а слой выполнения команд - это сама среда разработки. Мне никогда не приходилось писать консольное приложение и вот пришлось подойти к этому с такой неожиданной стороны.

Что мы имеем в результате.

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




<--Предыдущая статья | Следующая статья-->
RSSкомментариев

Введите Ваш комментарий

^
наверх