- Создание голосового ассистента на Python, часть 1
- Искусственный интеллект под Android с открытым API
- Время шло, а API у Siri не появлялось
- Ассистент на русском
- Открытое API искусственного интеллекта
- Что умеет API
- Как получить API
- Основы
- Агенты и модули
- Продолжение следует
- Пишем голосового ассистента на Python
- Введение
- Что умеет мой голосовой ассистент?
- Шаг 1. Обработка голосового ввода
- Шаг 2. Конфигурация голосового ассистента
- Шаг 3. Обработка команд
- 1 способ
- 2 способ
- Шаг 4. Добавление мультиязычности
- Шаг 5. Немного машинного обучения
- Заключение
Создание голосового ассистента на Python, часть 1
Добрый день. Наверное, все смотрели фильмы про железного человека и хотели себе голосового помощника, похожего на Джарвиса. В этом посте я расскажу, как сделать такого ассистента с нуля. Моя программа будет написана на python 3 в операционной системе windows. Итак, поехали!
Работать наш ассистент будет по такому принципу:
- Постоянно «слушать» микрофон
- Распознавать слова в google
- Выполнять команду, либо отвечать
1) Синтез речи
Для начала мы установим в систему windows русские голоса. Для этого переходим по ссылке и скачиваем голоса в разделе SAPI 5 -> Russian. Там есть 4 голоса, можно выбрать любой, какой вам понравится. Устанавливаем и идём дальше.
Нам нужно поставить библиотеку pyttsx3 для синтеза речи:
Затем можно запустить тестовую программу и проверить правильность её выполнения.
2) Распознавание речи
Существует много инструментов для распознавания речи, но они все платные. Поэтому я пытался найти бесплатное решение для моего проекта и нашёл её! Это библиотека speech_recognition.
Также для работы с микрофоном нам необходима библиотека PyAudio.
У некоторых людей возникает проблема с установкой PyAudio, поэтому следует перейти по этой ссылке и скачать нужную вам версию PyAudio. Затем ввести в консоль:
Затем запускаете тестовую программу. Но перед этим вы должны исправить в ней device_index=1 на своё значение индекса микрофона. Узнать индекс микрофона можно с помощью этой программы:
Тест распознавания речи:
Если всё отлично, переходим дальше.
Если вы хотите, чтобы ассистент просто общался с вами (без ИИ), то это можно сделать с помощью бесплатного инструмента DialogFlow от Google. После того, как вы залогинетесь, вы увидите экран, где уже можно создать своего первого бота. Нажмите Create agent. Придумайте боту имя (Agent name), выберете язык (Default Language) и нажмите Create. Бот создан!
Чтобы добавить новые варианты ответов на разные вопросы, нужно создать новый intent. Для этого в разделе intents нажмите Create intent. Заполните поля «Название» и Training phrases, а затем ответы. Нажмите Save. Вот и всё.
Чтобы управлять ботом на python, нужно написать такой код. В моей программе бот озвучивает все ответы.
На сегодня всё. В следующей части я расскажу как сделать умного бота, т.е. чтобы он мог не только отвечать, но и что-либо делать.
Источник
Искусственный интеллект под Android с открытым API
Только ленивый не знает сегодня о том, что такое голосовой помощник Siri. Когда два года назад этот продукт был показан на презентации нового iPhone 4S, многие посмотрели на развитие IT-индустрии по-новому. Действительно, искусственный интеллект в кармане, понимающий естественную речь, еще не показывал никто.
Многие в то время начали говорить о том, что Apple может уже на следующем WWDC предоставить всем программистам под iOS возможность использовать открытое API ассистента Siri для своих собственных программ. Картина вырисовывалась радужной — любое приложение смогло бы реагировать на пользовательские фразы, исполняя различные команды. Действительно, если в магазине AppStore так много разных полезных приложений, почему бы им не дать возможность управления голосом? Тем более что такой вид коммуникации с пользователем, как речь, быстро стал трендовым после выхода iPhone 4s.
О том, удалось ли это сделать Apple, и что удалось сделать нам, читайте далее.
Время шло, а API у Siri не появлялось
Надо отметить, что большинство путает просто распознавание речи и собственно возможности ассистента как искусственного интеллекта. Между этими двумя понятиями огромная разница — решения по распознаванию речи (speech-to-text) присутствуют на рынке уже давно (к примеру, в ОС Android она доступна всем желающим), а вот создать открытую технологию диалоговой системы (с поддержанием контекста, извлечением смысла и т.д.) не удавалось еще никому. Многие также не задумывались о том количестве проблем, которые возникнут при общем доступе множества программ к единому мозговому центру AI в лице Siri. А также о том числе совершенно новых технологий, с которым программистам пришлось бы иметь дело.
Идея создать голосового ассистента с открытым и доступным для всех API “искусственного интеллекта” уже витала на тот момент в наших головах, и мы решили ее осуществить.
Ассистент на русском
Наша небольшая группа инициативных разработчиков взялась за проект, известный ныне как Ассистент на русском.
Стоит заметить, что создание подобной голосовой платформы предполагает наличие знаний в таких специализированных областях как технологии распознавания (ASR) и синтеза речи (TTS), а также NLP, позволяющего извлекать смысл из пользовательской речи и управлять контекстом диалога. Именно этот компонент является связующим для любой системы искусственного интеллекта и позволяет не просто превратить речь в текст, но и понять, чего хочет пользователь. Это и отличает технологию распознавания речи от технологии искусственного интеллекта.
Нашей целью было сделать доступный инструмент для использования этих технологий.
К моменту запуска приложение умело решать повседневные задачи пользователя с помощью речи. А пользователи Android версии JellyBean могли выполнять голосовые команды без подключения к интернету.
Открытое API искусственного интеллекта
С первого дня каждый сервис “Ассистента на русском” создавался на основе той же платформы, которую мы планировали открывать для всех в будущем. Этот принцип по-английски называется “Eating your own dog food”. Таким образом мы могли параллельно проектировать голосовую архитектуру и функциональность самого ассистента.
Результатом нашей работы стало приложение с открытым API и “гибридной” технологией NLP, которая, с одной стороны, дает возможность программировать голосовой интерфейс без всяких серверов, с использованием только вашего девайса и Android SDK, а с другой стороны, переносить часть решений в облако по необходимости. Например, ваши контакты не отправляются ни на какие серверы (привет, Siri), а список всех городов, с которыми работает, скажем, сервис “Погода”, не хранится на клиенте.
Все сервисы ассистента создавались разными программистами, часть которых не имеют специальных знаний в области ASR, TTS или NLP. При этом особых сложностей в использовании API нашего “Ассистента” не было, так как мы ставили себе задачу сделать открытую, доступную и понятную всем платформу.
“Ассистент на русском” использует возможность межпроцессного взаимодействия (IPC) в ОС Android, так что сам ассистент выступает в роли голосового интерфейса между пользователем и вашим собственным приложением. При этом ваше приложение может отображать свой GUI в интерфейсе ассистента — для этого используются RemoteViews и другие похожие техники.
Что умеет API
За счет API “Ассистента на русском” можно создавать и гораздо более интересные варианты, где функциональность ассистента выходит за пределы устройства, на котором он работает. Например, стороннее приложение “АссистентКоннект”, используя API нашего ассистента, дает возможность управлять голосом различными устройствами “умного” дома и домашним кинотеатром.
При этом “АссистентКоннект” является обычным андроид-приложением, которое умеет отправлять запросы по HTTP-протоколу кинотеатру XBMC и ZWave контроллеру умного дома Vera.
Также можно посмотреть, как с помощью того же аддона можно управлять, например, обычным браузером. Все это демонстрирует возможности API ассистента, позволяющего создавать новый вид коммуникации с пользователями.
Как получить API
Попробовать API в своих собственных проектах можно уже сейчас, скачав его с нашего сайта. Сейчас мы даем только краткое описание того, как можно его использовать. В следующих статьях мы более детально опишем технические подробности реализации всей платформы “Ассистента на русском”, а также расскажем о нюансах использования самого API.
Данная статья — самый первый шаг по публикации API ассистента. В ближайшем будущем многое будет меняться, мы планируем предоставить больше возможностей, в том числе каталог дополнений, с помощью которого пользователь сможет находить в PlayStore все приложения с поддержкой функции голосового управления, а также коммерческое SDK для создания собственных голосовых ассистентов.
Основы
Для внедрения библиотеки с API ассистента в свое приложение вам не понадобится изучать никаких новых языков программирования или технологий. Все, что вам нужно — это Android SDK и IDE для разработки. Мы предлагаем использовать Android Studio. Подключение библиотек осуществляется просто указанием зависимостей в файле build.gradle
API позволяет установить связь между вашим приложением и “Ассистентом на русском” таким образом, что все фразы пользователя, по смыслу подходящие вашему приложению, будут перенаправлены специальному сервису, который вы должны реализовать. Мы называем такие сервисы Агентами.
Агенты и модули
Ассистент заранее извлечет все необходимые данные из текста фразы и предоставит их агенту в виде семантического дерева разбора — Токена. Это происходит благодаря специальным грамматикам (Модулям), которые вам нужно сформировать для вашего сервиса.
Модуль — это набор команд с шаблонами (Паттернами) фраз, на которые должен реагировать ваш агент (синтаксис паттернов детально описан в документации к API). Агент в любой момент может ограничить набор таких модулей, доступных пользователю, тем самым сформировав контекст диалога. Вот пример простейшего модуля:
Модуль — это просто xml-файл, который нужно хранить в ресурсной директории xml вашего приложения. Здесь приведен пример простейшего модуля с двумя командами и очень простыми паттернами.
Как видите, модуль не содержит никакого управляющего кода, так как весь код будет описан в классе вашего агента. Это отражает основной принцип нашего подхода к голосовому API — декларативная часть, описывающая грамматику диалога, отделена от управляющего кода, который реализует логику обработки и полностью независим от языка.
Агент — это, по сути, надстройка над обычными Android-сервисами. Он реализует интерфейс между ассистентом и логикой вашего приложения.
Вот простой пример того, как агент может обработать команды, описанные ранее в модуле. Абстракция AssistantAgent предоставляет множество различных методов для обработки команд, управления контекстом диалога, вызовом сторонних активностей и т.д.
Request содержит всю необходимую информацию о запросе пользователя — идентификатор команды, контент запроса (токен или что-то другое), сессию и т.д. На любой запрос агент должен сформировать ответ — Response, содержащий контент ответа и, при необходимости, инструкции ассистенту о переключении контекста диалога.
Это пример формирования быстрого ответа в одну строку. А вот чуть более сложный пример:
Здесь ответ кроме контента в виде строки (можно передавать и другие виды контента, например GUI) содержит еще и информацию об изменении контекста диалога. Теперь пользователю будут доступны команды только из модуля R.xml.name, и после озвучки ассистентом ответа от агента автоматически включится микрофон — это называется “модальный режим”.
Каждый агент — это сервис, и поэтому его надо описать в манифесте приложения — AndroidManifest.xml
Здесь указывается основной модуль агента и пакет того “Ассистента на русском”, с которым агент может работать.
После сборки вашего приложения и установки на девайс “Ассистент на русском” подхватит информацию из вашего манифеста и загрузит модуль. А затем будет перенаправлять все подходящие запросы от пользователя к вашему агенту, если NLP-движок ассистента посчитает, что фраза подходит лучше всего под паттерны команд модуля.
Продолжение следует
В этом посте мы очень кратко привели основы использования нашего API, описав базовые принципы работы с ним. Конечно, библиотека ассистента предоставляет множество более сложных функций: удаленные и нечеткие паттерны, RemoteViews, динамическое изменение контента ответа, извлечение данных из фраз и многое другое. Все это описано в документации, которую мы будем дополнять по ходу доработок в самой библиотеке.
Мы предлагаем вам попробовать голосовое управление в ваших собственных проектах, вступить в сообщество разработчиков и помочь в улучшении этого инструмента.
Источник
Пишем голосового ассистента на Python
Введение
Технологии в области машинного обучения за последний год развиваются с потрясающей скоростью. Всё больше компаний делятся своими наработками, тем самым открывая новые возможности для создания умных цифровых помощников.
В рамках данной статьи я хочу поделиться своим опытом реализации голосового ассистента и предложить вам несколько идей для того, чтобы сделать его ещё умнее и полезнее.
Что умеет мой голосовой ассистент?
Описание умения | Работа в offline-режиме | Требуемые зависимости |
Распознавать и синтезировать речь | Поддерживается | pip install PyAudio (использование микрофона) |
pip install pyttsx3 (синтез речи)
Для распознавания речи можно выбрать одну или взять обе:
- pip install SpeechRecognition (высокое качество online-распознавания, множество языков)
- pip install vosk (высокое качество offline-распознавания, меньше языков)
Шаг 1. Обработка голосового ввода
Начнём с того, что научимся обрабатывать голосовой ввод. Нам потребуется микрофон и пара установленных библиотек: PyAudio и SpeechRecognition.
Подготовим основные инструменты для распознавания речи:
Теперь создадим функцию для записи и распознавания речи. Для онлайн-распознавания нам потребуется Google, поскольку он имеет высокое качество распознавания на большом количестве языков.
А что делать, если нет доступа в Интернет? Можно воспользоваться решениями для offline-распознавания. Мне лично безумно понравился проект Vosk.
На самом деле, необязательно внедрять offline-вариант, если он вам не нужен. Мне просто хотелось показать оба способа в рамках статьи, а вы уже выбирайте, исходя из своих требований к системе (например, по количеству доступных языков распознавания бесспорно лидирует Google).
Теперь, внедрив offline-решение и добавив в проект нужные языковые модели, при отсутствии доступа к сети у нас автоматически будет выполняться переключение на offline-распознавание.
Замечу, что для того, чтобы не нужно было два раза повторять одну и ту же фразу, я решила записывать аудио с микрофона во временный wav-файл, который будет удаляться после каждого распознавания.
Таким образом, полученный код выглядит следующим образом:
Возможно, вы спросите «А зачем поддерживать offline-возможности?»
Я считаю, что всегда стоит учитывать, что пользователь может быть отрезан от сети. В таком случае, голосовой ассистент всё еще может быть полезным, если использовать его как разговорного бота или для решения ряда простых задач, например, посчитать что-то, порекомендовать фильм, помочь сделать выбор кухни, сыграть в игру и т.д.
Шаг 2. Конфигурация голосового ассистента
Поскольку наш голосовой ассистент может иметь пол, язык речи, ну и по классике, имя, то давайте выделим под эти данные отдельный класс, с которым будем работать в дальнейшем.
Для того, чтобы задать нашему ассистенту голос, мы воспользуемся библиотекой для offline-синтеза речи pyttsx3. Она автоматически найдет голоса, доступные для синтеза на нашем компьютере в зависимости от настроек операционной системы (поэтому, возможно, что у вас могут быть доступны другие голоса и вам нужны будут другие индексы).
Также добавим в в main-функцию инициализацию синтеза речи и отдельную функцию для её проигрывания. Чтобы убедиться, что всё работает, сделаем небольшую проверку на то, что пользователь с нами поздоровался, и выдадим ему обратное приветствие от ассистента:
На самом деле, здесь бы хотелось самостоятельно научиться писать синтезатор речи, однако моих знаний здесь не будет достаточно. Если вы можете подсказать хорошую литературу, курс или интересное документированное решение, которое поможет разобраться в этой теме глубоко — пожалуйста, напишите в комментариях.
Шаг 3. Обработка команд
Теперь, когда мы «научились» распознавать и синтезировать речь с помощью просто божественных разработок наших коллег, можно начать изобретать свой велосипед для обработки речевых команд пользователя 😀
В моём случае я использую мультиязычные варианты хранения команд, поскольку у меня в демонстрационном проекте не так много событий, и меня устраивает точность определения той или иной команды. Однако, для больших проектов я рекомендую разделить конфигурации по языкам.
Для хранения команд я могу предложить два способа.
1 способ
Можно использовать прекрасный JSON-подобный объект, в котором хранить намерения, сценарии развития, ответы при неудавшихся попытках (такие часто используются для чат-ботов). Выглядит это примерно вот так:
Такой вариант подойдёт тем, кто хочет натренировать ассистента на то, чтобы он отвечал на сложные фразы. Более того, здесь можно применить NLU-подход и создать возможность предугадывать намерение пользователя, сверяя их с теми, что уже есть в конфигурации.
Подробно этот способ мы его рассмотрим на 5 шаге данной статьи. А пока обращу ваше внимание на более простой вариант
2 способ
Можно взять упрощенный словарь, у которого в качестве ключей будет hashable-тип tuple (поскольку словари используют хэши для быстрого хранения и извлечения элементов), а в виде значений будут названия функций, которые будут выполняться. Для коротких команд подойдёт вот такой вариант:
Для его обработки нам потребуется дополнить код следующим образом:
В функции будут передаваться дополнительные аргументы, сказанные после командного слова. То есть, если сказать фразу «видео милые котики«, команда «видео» вызовет функцию search_for_video_on_youtube() с аргументом «милые котики» и выдаст вот такой результат:
Пример такой функции с обработкой входящих аргументов:
Ну вот и всё! Основной функционал бота готов. Далее вы можете до бесконечности улучшать его различными способами. Моя реализация с подробными комментариями доступна на моём GitHub.
Ниже мы рассмотрим ряд улучшений, чтобы сделать нашего ассистента ещё умнее.
Шаг 4. Добавление мультиязычности
Чтобы научить нашего ассистента работать с несколькими языковыми моделями, будет удобнее всего организовать небольшой JSON-файл с простой структурой:
В моём случае я использую переключение между русским и английским языком, поскольку мне для этого доступны модели для распознавания речи и голоса для синтеза речи. Язык будет выбран в зависимости от языка речи самого голосового ассистента.
Для того, чтобы получать перевод мы можем создать отдельный класс с методом, который будет возвращать нам строку с переводом:
В main-функции до цикла объявим наш переводчик таким образом: translator = Translation()
Теперь при проигрывании речи ассистента мы сможем получить перевод следующим образом:
Как видно из примера выше, это работает даже для тех строк, которые требуют вставки дополнительных аргументов. Таким образом можно переводить «стандартные» наборы фраз для ваших ассистентов.
Шаг 5. Немного машинного обучения
А теперь вернёмся к характерному для большинства чат-ботов варианту с JSON-объектом для хранения команд из нескольких слов, о котором я упоминала в пункте 3. Он подойдёт для тех, кто не хочет использовать строгие команды и планирует расширить понимание намерений пользователя, используя NLU-методы.
Грубо говоря, в таком случае фразы «добрый день«, «добрый вечер» и «доброе утро» будут считаться равнозначными. Ассистент будет понимать, что во всех трёх случаях намерением пользователя было поприветствовать своего голосового помощника.
С помощью данного способа вы также сможете создать разговорного бота для чатов либо разговорный режим для вашего голосового ассистента (на случаи, когда вам нужен будет собеседник).
Для реализации такой возможности нам нужно будет добавить пару функций:
А также немного модифицировать main-функцию, добавив инициализацию переменных для подготовки модели и изменив цикл на версию, соответствующую новой конфигурации:
Однако, такой способ сложнее контролировать: он требует постоянной проверки того, что та или иная фраза всё ещё верно определяется системой как часть того или иного намерения. Поэтому данным способом стоит пользоваться с аккуратностью (либо экспериментировать с самой моделью).
Заключение
На этом мой небольшой туториал подошёл к концу.
Мне будет приятно, если вы поделитесь со мной в комментариях известными вам open-source решениями, которые можно внедрить в данный проект, а также вашими идеями касательно того, какие ещё online и offline-функции можно реализовать.
Документированные исходники моего голосового ассистента в двух вариантах можно найти здесь.
P.S: решение работает на Windows, Linux и MacOS с незначительными различиями при установке библиотек PyAudio и Google.
Кстати, тех, кто планирует строить карьеру в IT, я буду рада видеть на своём YouTube-канале IT DIVA. Там вы сможете найти видео по тому, как оформлять GitHub, проходить собеседования, получать повышение, справляться с профессиональным выгоранием, управлять разработкой и т.д.
Источник