Виртуальный помощник своими руками

Создание простого интерактивного помощника


Привет, Хабр! Вдохновившись последними достижениями в области прикладного ИИ и личных помощников (Siri, Google Now и им подобные), я решил написать под себя помощника, пусть и не такого продвинутого как коммерческие аналоги, зато со своим блекджеком и своей изюминкой.

Знакомьтесь, Сузи

Главная изюминка моего псевдо-ИИ заключается в очень простой реализации и быстром обучении большому количеству фраз. Достигается это следующим образом:

Логика Сузи

В папке с исполняемым файлом есть (на данный момент) три файла: sinonims.txt, faq.txt, и phrases.txt. Они заполняются мною, в дальнейшем планирую добавить функцию заполнения голосом и/или какое ни будь подобие самообучения.

sinonims.txt

— база исходных слов их замен
привет=hi
здравствуй=hi
хай=hi

дела=state
жизнь=state
.

faq.txt

— база вопрос-ответ. Ответ может содержать текст, команду или переменную
*hi*=<&hi>, <%name>
*как*state*=<&state>

*off*debug*= <@dbg0>
В правой части содержится маска, под которую подставляется текст с синонимами, в левой ответ. Спец символы «@», «%» и «&» указывают на то, что нужно вставить вместо конструкции — команду, переменную или фразу соответственно.

phrases.txt

— база частых фраз в нескольких вариантах
hi1=здравствуйте
hi2=приветствую

state1=хорошо
state2=нормально
state3=все в норме
.

Если есть желание по заполнять базы — пишите в комментариях, я выложу базы, исходники, exeшник.

Пример обработки запроса

Исходный текст: привет, как дела -> Очищаем строку, заменяем синонимы по словарю: hi как state -> Смотрим под какие маски он попадает: *hi* и *как*state* -> Парсим ответ: заменяем и случайным образом на варианты, присутствующие в базе фраз, а на переменную curusr -> Результат: приветствую, Сэр все в норме (Вы, наверное, могли подумать, что Сузи не очень грамотная, но грамотность ей не нужна, в моих планах прикрутить к ней распознавание речи и TTS, а в этом случае ей не понадобится ставить знаки препинания и писать слова с заглавных букв)

Внутренности Сузи

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

Заключение

Планов относительно Сузи у меня много, я хочу добавить к ней распознавание и синтезирование речи (но это занятие долгое, а времени мало — сессия, студенты и им сочувствующие поймут), возможность запоминать то, что говорит оператор, анализировать это, сохранять напоминания, заметки. Всю эту систему я хочу поставить на отдельную машину, благо на даче их валяется куча, прикрутить хорошую колонку к ней, микрофон, датчик движения, релешки через com-порт, чтоб я мог зайти в комнату и сказать: «Сузи, закрой дверь, вруби кондиционер и поставь мою любимую песню» или что то в этом роде… Ах, как это круто, черт побери.

Пока искал картинку для топика, наткнулся на это, кто знает, тот поймет.

Источник

Создание голосового ассистента на Python, часть 1

Добрый день. Наверное, все смотрели фильмы про железного человека и хотели себе голосового помощника, похожего на Джарвиса. В этом посте я расскажу, как сделать такого ассистента с нуля. Моя программа будет написана на python 3 в операционной системе windows. Итак, поехали!

Работать наш ассистент будет по такому принципу:

  1. Постоянно «слушать» микрофон
  2. Распознавать слова в google
  3. Выполнять команду, либо отвечать

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, нужно написать такой код. В моей программе бот озвучивает все ответы.

На сегодня всё. В следующей части я расскажу как сделать умного бота, т.е. чтобы он мог не только отвечать, но и что-либо делать.

Источник

Python: как создать простейшего голосового помощника?

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

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

Для начала объявим необходимые нам библиотеки:

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

В лог файл мы записываем время сообщения, автора (бот или пользователь) и собственно сам сказанный текст.

Выводим первое сообщение за авторством бота: Привет! Чем я могу вам помочь?

А с помощью такой процедуры в Jupyter Notebook мы можем озвучить через устройство воспроизведения, настроенное по умолчанию, сказанные слова:

Как озвучивать текст мы рассмотрели выше, но как же мы свой голос сможем превратить в текст? Тут нам поможет распознавание речи от Google и некоторые манипуляции с микрофоном.

Что может сделать наш помощник кроме того, чтобы нас слушать? Все ограничено нашей фантазией! Рассмотрим несколько интересный примеров.

Начнем с простого, пусть при команде открыть сайт – он откроет сайт (не ожидали?).

Иногда полезно послушать свои слова, да чужими устами. Пусть бот еще умеет и повторять за нами:

Пусть еще и собеседником будет, но начнем мы пока только со знакомства:

Мы также можем попросить голосового помощника назвать случайное число в выбранных нами пределах в формате: Назови случайное число от (1ое число) до (2ое число).

Для того, чтобы завершить программу, достаточно только попрощаться с ботом:

А чтобы все это работало беспрерывно, мы создаем бесконечный цикл.

Источник

Пишем голосового ассистента на Python

Введение

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

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

Что умеет мой голосовой ассистент?

Описание умения Работа в offline-режиме Требуемые зависимости
Распознавать и синтезировать речь Поддерживается pip install PyAudio (использование микрофона)

pip install pyttsx3 (синтез речи)

Для распознавания речи можно выбрать одну или взять обе:

  • pip install SpeechRecognition (высокое качество online-распознавания, множество языков)
  • pip install vosk (высокое качество offline-распознавания, меньше языков)

Сообщать о прогнозе погоды в любой точке мира Не поддерживается pip install pyowm (OpenWeatherMap) Производить поисковый запрос в поисковой системе Google (а также открывать сами результаты данного запроса) Не поддерживается pip install google Производить поисковый запрос видео в системе YouTube Не поддерживается — Выполнять поиск определения в Wikipedia c дальнейшим прочтением первых двух предложений Не поддерживается pip install wikipedia-api Переводить фразы с изучаемого языка на родной язык пользователя и наоборот Не поддерживается pip install googletrans (Google Translate) Искать человека по имени и фамилии в социальных сетях Не поддерживается — «Подбрасывать монетку» Поддерживается — Здороваться и прощаться (после прощания работа приложения завершается) Поддерживается — Менять настройки языка распознавания и синтеза речи на ходу Поддерживается — TODO многое другое.

Шаг 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, проходить собеседования, получать повышение, справляться с профессиональным выгоранием, управлять разработкой и т.д.

Источник

Читайте также:  Выкройка кошелек своими руками с размерами
Оцените статью