Как сделать голосового помощника на python
Перейти к содержимому

Как сделать голосового помощника на python

  • автор:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Создаем собственную Alexa в 20 строках Python

У всех моих друзей есть Alexa, а у меня нет, из-за чего они надо мной смеются. Натерпевшись вдоволь, я решил: “Хватит!”.

Я связался со своей командой, и как только с моих уст прозвучало “Alexa”, кто-то из ребят выкрикнул: “Не покупай Alexa! Создай свою. Это можно сделать в 20 строк кода”.

О чем этот проект?

Его цель — сэкономить деньги и создать собственную Alexa, способную выполнять для вас массу полезных вещей.

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

Немного терминологии

Модуль/библиотека:

Предопределенный или предварительно написанный кем-то код, который можно бесплатно использовать в своем проекте.

Класс:

Концепция из ООП, которая позволяет группировать код и в некотором смысле является схемой для создания объектов. Классы позволяют использовать код повторно.

Объект:

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

У Alexa есть две задачи

1. Слушать

Прослушивание команд является основной функциональностью любого виртуального помощника. Команды бывают различные, например: “Алекса, включи музыку” или “Алекса, сколько время?”

Помощник должен прослушать команду, понять ее и выполнить действие.

2. Говорить

Прослушивая и понимая команды, Alexa выполняет определенные действия. В ходе этого процесса она предоставляет голосовую обратную связь.

Реализация этих функций

Нам понадобятся два модуля Python:

  1. SpeechRecognition.
  2. Python Text-To-Speech (pyttsx3).

1. SpeechRecognition

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

Любой сторонний продукт нужно так или иначе устанавливать. Для этого выполните в терминале:

После установки можно использовать библиотеку в проекте. В процессе работы с модулем нам понадобятся три важных компонента.

1) Класс Recognizer: это основной класс модуля, который содержит все ключевые функции, нужные для создания приложения распознания речи.

Для начала нужно создать этот класс, а также его объекты:

Здесь r представляет просто произвольное имя, заданное для объекта. В его качестве можно использовать любую допустимую переменную Python.

2) Доступ к микрофону: так как помощнику нужно прослушивать команды, вам потребуется предоставить ему доступ к микрофону устройства. Для этого можно использовать класс Microphone :

3) Прослушивание речи пользователя: после организации доступа к микрофону останется прописать прослушивание команд. Это можно сделать с помощью метода listen() , предоставляемого классом Recognizer :

Таким образом происходит работа с распознаванием речи в Python. Разобравшись с основами этого модуля, можно переходить к следующему.

2. Python Text-To-Speech (pyttsx3)

Это библиотека Text-to-Speech (TTS) для Python 2 и Python 3, которая работает без обращения к интернету и каких-либо задержек.

Поскольку это сторонний модуль, сначала его нужно также установить:

Теперь с помощью этого модуля ваш помощник обретет дар речи.

Секрет: здесь мы просто преобразуем текст в речь.

Все остальное будет очень легко. Сначала нужно инициализировать модуль pyttsx3 с помощью метода init() и создать его объект. Затем можно использовать его функции для преобразования текста в речь:

Здесь say() выполняет основную работу по преобразованию текста в речь, а runAndWait() ожидает, пока модуль закончит проговаривать конкретное предложение, после чего переходит к следующей задаче.

Разобравшись и с этим модулем, пора переходить к самому интересному.

Самое интересное

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

Шаг 1. Импорт модулей

Это всегда будет первым шагом:

Шаг 2. Инициализация модулей

Для использования импортированных модулей нужно их инициализировать и создать объекты:

Здесь listener является объектом класса Recognizer .

Модуль pyttsx3 — это похититель голосов. Он крадет разные голоса и сохраняет их в свойстве voice .

Мужской голос установлен по умолчанию с индексом 0. Нам нужен приятный женский голос. Для его получения мы используем метод getProperty() . Женский голос хранится в индексе 1.

Теперь перейдем далее и создадим методы, которые помогут ассистенту говорить и слушать.

Шаг 3. Создание метода talk() для преобразования текста в речь

Здесь talk() — это имя метода, который получает параметр text . Текстом может быть любая строка, которую нам нужно преобразовать в речь, чтобы помощник заговорил.

Далее мы просто передаем его в метод say() и вызываем метод runAndWait() через созданный выше объект engine . Принцип действия должен быть вам понятен, потому что вы уже знаете основы pyttsx3 . Теперь ваш помощник получил возможность говорить.

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

Шаг 4. Создание метода take_command() для распознавания речи

Для обработки возможных ошибок микрофона и прочих мы обертываем его в блок try-except .

Остальное очень похоже на то, что мы делали ранее. Модуль speech recognition предоставляет различные механизмы распознавания речи, которые и делают всю работу. Здесь мы применили механизм от Google, для чего был использован метод recognize_google() из класса Recognizer .

Мы уже на полпути к цели, и основная часть проекта у нас позади.

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

Шаг 5. Создание метода run_alexa() для ответа

Здесь нужно понять несколько моментов:

1) Получение требуемой части: предположим, что вас преследует навязчивая строчка из песни, и вы решили ее послушать, приказав Alexa: “Play song_name ”. Для этой команды в данном проекте мы просто удаляем слово Play и получаем часть song_name :

Результат мы просто сохраняем в переменной song .

2) pywhatkit.playonyt(): для его использования понадобится установить и импортировать модуль pywhatkit . PyWhatKit — это библиотека Python для отправки сообщений WhatsApp в определенное время, но в ней есть и ряд других функций, которые помогут нам с автоматизацией. Этот модуль предоставляет метод playonyt() , который позволит воспроизводить желаемые песни прямо на YouTube.

Модуль этот тоже сторонний и требует установки:

И последующего импорта:

3) datetime.datetime.now(): для использования этого метода сначала нужно импортировать модуль datetime . Он является встроенным модулем Python, который позволит нам управлять датами и временем. Метод now() возвращает текущее время.

4) wikipedia.summary(): для применения этого метода потребуется установить и импортировать модуль Wikipedia. Wikipedia — это библиотека Python, предоставляющая возможность доступа и парсинга данных из Википедии. Она поможет нам находить нужную информацию и возвращать ее в качестве вывода. Метод summary() запрашивает данные из сводного раздела этого ресурса.

Опять же, это сторонний модуль, который нужно установить:

5) pyjokes.get_joke(): для использования этого метода нужно установить и импортировать модуль Pyjokes. Он позволит генерировать случайные однострочные шутки для программистов, которые помощник сможет обработать.

Этот сторонний модуль мы также устанавливаем:

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

В функции выше сначала происходит вызов метода talk_command() , который начинает прослушивать команды и сохранять их в переменной command :

Помимо этого, чтобы помощник заговорил, мы вызываем метод talk() и передаем ему нужные данные.

Шаг 6. Начальный вызов функции

В завершении мы вызываем метод run_alexa() , который запускает нашего помощника.

Теперь у вас есть собственная Alexa!

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

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

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

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

image

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

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

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

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

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

Шаг 1. Обработка голосового ввода

Начнём с того, что научимся обрабатывать голосовой ввод. Нам потребуется микрофон и пара установленных библиотек: PyAudio и SpeechRecognition.

Подготовим основные инструменты для распознавания речи:

Теперь создадим функцию для записи и распознавания речи. Для онлайн-распознавания нам потребуется Google, поскольку он имеет высокое качество распознавания на большом количестве языков.

А что делать, если нет доступа в Интернет? Можно воспользоваться решениями для offline-распознавания. Мне лично безумно понравился проект Vosk.

Теперь, внедрив offline-решение и добавив в проект нужные языковые модели, при отсутствии доступа к сети у нас автоматически будет выполняться переключение на offline-распознавание.

Замечу, что для того, чтобы не нужно было два раза повторять одну и ту же фразу, я решила записывать аудио с микрофона во временный wav-файл, который будет удаляться после каждого распознавания.

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

Возможно, вы спросите «А зачем поддерживать offline-возможности?»

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

Шаг 2. Конфигурация голосового ассистента

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

Для того, чтобы задать нашему ассистенту голос, мы воспользуемся библиотекой для offline-синтеза речи pyttsx3. Она автоматически найдет голоса, доступные для синтеза на нашем компьютере в зависимости от настроек операционной системы (поэтому, возможно, что у вас могут быть доступны другие голоса и вам нужны будут другие индексы).

Также добавим в в main-функцию инициализацию синтеза речи и отдельную функцию для её проигрывания. Чтобы убедиться, что всё работает, сделаем небольшую проверку на то, что пользователь с нами поздоровался, и выдадим ему обратное приветствие от ассистента:

На самом деле, здесь бы хотелось самостоятельно научиться писать синтезатор речи, однако моих знаний здесь не будет достаточно. Если вы можете подсказать хорошую литературу, курс или интересное документированное решение, которое поможет разобраться в этой теме глубоко — пожалуйста, напишите в комментариях.

Шаг 3. Обработка команд

Теперь, когда мы «научились» распознавать и синтезировать речь с помощью просто божественных разработок наших коллег, можно начать изобретать свой велосипед для обработки речевых команд пользователя 😀

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

Для хранения команд я могу предложить два способа.

1 способ

Можно использовать прекрасный JSON-подобный объект, в котором хранить намерения, сценарии развития, ответы при неудавшихся попытках (такие часто используются для чат-ботов). Выглядит это примерно вот так:

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

Подробно этот способ мы его рассмотрим на 5 шаге данной статьи. А пока обращу ваше внимание на более простой вариант

2 способ

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

Для его обработки нам потребуется дополнить код следующим образом:

В функции будут передаваться дополнительные аргументы, сказанные после командного слова. То есть, если сказать фразу «видео милые котики«, команда «видео» вызовет функцию search_for_video_on_youtube() с аргументом «милые котики» и выдаст вот такой результат:

image

Пример такой функции с обработкой входящих аргументов:

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

Name already in use

If nothing happens, download GitHub Desktop and try again.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching Xcode

If nothing happens, download Xcode and try again.

Launching Visual Studio Code

Your codespace will open once ready.

There was a problem preparing your codespace, please try again.

Latest commit

Git stats

Files

Failed to load latest commit information.

README.md

Voice Assistant Python App for Windows, Linux & MacOS

Данный проект голосового ассистента на Python 3 для Windows и Linux умеет:

  • распознавать и синтезировать речь в offline-режиме (без доступа к Интернету);
  • сообщать о прогнозе погоды в любой точке мира;
  • производить поисковый запрос в поисковой системе Google (а также открывать список результатов и сами результаты данного запроса);
  • производить поисковый запрос видео в системе YouTube и открывать список результатов данного запроса;
  • выполнять поиск определения в Wikipedia c дальнейшим прочтением первых двух предложений;
  • переводить с изучаемого языка на родной язык пользователя (с учетом особенностей воспроизведения речи);
  • искать человека по имени и фамилии в соцсетях ВКонтакте и Facebook;
  • «подбрасывать монетку»;
  • воспроизводить случайное приветствие;
  • воспроизводить случайное прощание с последующим завершением работы программы;
  • менять настройки языка распознавания и синтеза речи;
  • TODO многое другое.

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

pip install requirements.txt

Настройка синтеза и анализа речи с возможностью offline-работы

Голосовой ассистент использует для синтеза речи встроенные в операционные системы возможности (т.е. голоса зависят от настроек операционной системы). Для этого используется библиотека pyttsx3 . Подробнее здесь

В целом, решение работает на Windows, Linux и MacOS с незначительными различиями при установке библиотек PyAudio и Google.

Для установки PyAudio на Windows можно найти и скачать нужный в зависимости от архитектуры и версии Python whl-файл здесь в папку с проектом. После чего его можно установить при помощи подобной команды:

pip install PyAudio-0.2.11-cp38-cp38m-win_amd64.whl

В случае проблем с установкой PyAudio на MacOS может помочь данное решение.

Для избежания проблем с установкой Vosk на Windows, я предлагаю скачать whl-файл в зависимости от требуемой архитектуры и версии Python. Его можно найти здесь. Загрузив файл в папку с проектом, установку можно будет запустить с помощью подобной команды:

pip install vosk-0.3.7-cp38-cp38-win_amd64.whl

Модели для распознавания речи с помощью Vosk можно найти здесь. Я использовала в проекте ru и en модели

Настройка получения прогноза погоды от OpenWeatherMap

Для получения данных прогноза погоды мною был использован сервис OpenWeatherMap , который требует API-ключ. Получить API-ключ и ознакомиться с документацией можно после регистрации (есть Free -тариф) здесь. Примеры использования можно найти здесь

Команды для установки прочих сторонних библиотек:

Команда установки Назначение библиотеки
pip install google Поисковые запросы в Google
pip install SpeechRecognition Распознавание речи (Speech-To-Text)
pip install vosk Offline распознавание речи (Speech-To-Text)
pip install pyttsx3 Offline синтез речи на Windows (Text-To-Speech)
pip install wikipedia-api Wikipedia API
pip install googletrans Google Translate
pip install pyowm Получение данных погоды с помощью OpenWeatherMap
pip install python-dotenv Работа с .env -файлами для хранения API-ключей
pip install scikit-learn Машинного обучение для угадывания намерений

Дополнительную информацию по установке и использованию библиотек можно найти здесь

About

Python Voice Assistant project can: recognize and synthesize speech without Internet access; report the weather forecast anywhere in the world; make a search in the Google; make a video search in the YouTube; make a search for a definition in Wikipedia and read it; translate from the target language to the user’s native language, and much more

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *