Голосовой помощник на python

Знакомство с API Yandex SpeechKit

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

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

Синтез текста через cURL

С помощью встроенной в bash команды export запишем данные в переменные:

Теперь их можно передать в POST-запрос с помощью cURL:

Рассмотрим параметры запроса:

speech.raw – файл формата LPSM (несжатый звук). Это и есть озвученный текст в бинарном виде, который будет сохранен в текущую папку.

lang=ru-RU – язык текста.

emotion=good – эмоциональный окрас голоса. Пусть будет дружелюбным.

voice=ermil – текст будет озвучен мужским голосом Ermil. По умолчанию говорит Оксана.

https://tts.api.cloud.yandex.net/speech/v1/tts:synthesize – url, на который отправляется post-запрос на синтез речи дворецкого.

Бинарный файл послушать не получится, тогда установим утилиту SoX и сделаем конвертацию в wav:

speech.wav – приветствие готово и сохранено в текущую папку.

Для проигрывания wav внутри кода Python, можно взять, например, библиотеку simpleaudio. Она простая и не создает других потоков:

Итак, наш первый гость стоит перед входом на долгожданную party. Пытается открыть дверь, и вдруг слышит голос откуда-то сверху:

«Привет, чувак! Назови-ка мне свои имя и фамилию?» (или ваш вариант)

Отлично! Вы научили дворецкого приветствовать гостей, используя командную строку и cURL. А пока гость вспоминает ответ, научимся работать с API на языке Python.

Распознавание текста с помощью requests

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

Создайте готовый аудио-файл с ответом гостя. Сделать это можно через встроенный микрофон на вашем ноутбуке разными инструментами. Для macos подойдет Quick Time Player. Сконвертируйте аудио в формат ogg: name_guest.ogg. Можно онлайн, например, тут

Итак, пишем код на Python:

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

Импортируем в код:

Зададим параметры, которые мы получили в командной строке:

Аудио необходимо передавать в запрос в бинарном виде:

Давайте обернем весь процесс распознавания в функцию recognize:

Итак, чтобы дворецкий смог проверить гостя по списку, вызовем функцию и распознаем ответ:

Теперь очередь за дворецким. В нашем случае, он вежлив ко всем. И прежде чем открыть или не открыть гостю дверь, он обратится лично. Например, так:

“Мы вам очень рады, <имя_и фамилия_гостя>, но вас нет в списке, сорян”

Для последующего синтеза вы можете снова воспользоваться CURL или так же написать функцию на Python. Принцип работы с API для синтеза и распознавания речи примерно одинаков.

Как устроен интерфейс

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

Именно по такому принципу API помогает разработчикам настроить взаимодействие между своей и сторонней программой, не задумываясь о деталях их устройства. Можно не знать, как организован backend сайта Центробанка, но вывести на своем сервисе курсы валют через его API. Так, например, на странице для разработчиков «Знакомство с API ВКонтакте» сказано: «Вам не нужно знать в подробностях, как устроена база, из каких таблиц и полей каких типов она состоит, — достаточно того, что API-запрос об этом “знает”».

Создаем эхо-бот

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

Создаем конфигурационный файл и указываем в нем значение, сгенерированное ботом BotFather. Приступаем к написанию кода самого чат-бота. 

Для начала импортируем конфигурацию и систему логирования. Затем подключаем все необходимые модули из . Указываем уровень логирования, а затем инициализируем бота, создав две переменные — и .

Первая отвечает за прямой доступ к методам API и обеспечивает общее взаимодействие с ботом. Вторая,  — простой обработчик событий. Мы обращаемся к этому обработчику событий и вызываем декоратор , который будет вызываться тогда, когда приходит событие о новом сообщении. 

В данном случае обрабатываются все входящие сообщения, которые бот может читать

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

import config
import logging
from aiogram import Bot, Dispatcher, executor, types
logging.basicConfig(level=logging.INFO)
bot = Bot(token=config.TOKEN)
dp = Dispatcher(bot)
@dp.message_handler()
async def echo(message: types.Message):
    await message.answer(message.text)
if __name__ == "__main__":
    executor.start_polling(dp, skip_updates=True)

Как уже говорилось ранее, обработка событий в Telegram может происходить двумя способами — , когда мы со своей стороны постоянно запрашиваем сервер, а второй вариант — более мощное и быстрое решение . Реализация на Linux имеет большой минус — бот часто зависает и его приходится постоянно перезапускать. 

В случае с бот загружается на сервер, у бота появляется API с url-адресом, сервер Teleram посылает нашему боту сообщения, как только они появляются. По сути, бот на вебхуках постоянно не работает, а включается лишь тогда, когда получает запрос с сервера. Этот метод предпочтительнее, он быстрее, но для тестов обычно используется . 

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

Особенности современного API

В развитии программных интерфейсов наблюдаются следующие тенденции:

  1. Современные API пытаются прийти к общему знаменателю в вопросе форматов. Сейчас чаще всего используются запросы типа HTTP и REST. Разработчики пытаются использовать наиболее доступные способы взаимодействия, которые сможет понять и быстро приспособить большинство программистов.
  2. Сейчас API все чаще рассматривают не как набор строк кода, а как отдельный продукт (спасибо инкапусуляции). Продукт, направленный на особую аудиторию, на разработчиков. Поэтому из разряда инструментов с вечно меняющимся циклом разработки API перерос в подобие программ с предсказуемым выпуском новых версий и длительным сроком поддержки.
  3. Благодаря попыткам крупных корпораций и отдельных программистов привести программные интерфейсы к порядку, заметно выросло их качество. «Мосты» между отдельными приложениями стали значительно надежнее и проще. Отношение к безопасности функций стало основным приоритетом.
  4. К созданию программных интерфейсов подходят как к созданию приложений. Их жизненный цикл включает в себя продумывание идеи, тестирование, разработку, работу менеджеров и контроль версий. Документации также начали делать гораздо понятнее для разработчиков.

Как работает API Gateway

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

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

Для отображения товара у нас задействована цепочка запросов к разным службам — одна хранит отзывы покупателей о конкретной позиции, другая содержит характеристики товара, третья — отвечает за наличие и т.д. Подключив API-шлюз мы можем осуществлять контроль поступающего трафика серверных систем. Для этого составляются четкие правила распределения нагрузки. Обычно API Gateway работает как некий буфер между пользователями и произвольным числом API-сервисов (API), выступая в роли обратного прокси, как Nginx и HAProxy.

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

Telegram Bot API и Telegram API

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

На данный момент есть два основных инструмента API, с помощью которых можно задействовать сервисы Telegram — и . Первый служит для разработки чат-ботов, второй позволяет делать полностью кастомные Telegram-клиенты. Разработчикам также доступна открытая библиотека (Telegram Database Library), с помощью которой можно создавать свою версию мессенджера с уникальными опциями (как например, Telegram X, построенный именно на TDLib). является надстройкой над , поэтому пользоваться можно без знаний о механизме используемого протокола . 

Курс
QA

Вивчайте важливi технології для тестувальника у зручний час, та отримуйте $1300 уже через рік роботи

РЕЄСТРУЙТЕСЯ!

Для его работы задействован промежуточный сервер с HTTPS-интерфейсом, который шифрует трафик и обеспечивает связь с Telegram API. Bot API позволяет легко создавать программы, которые используют интерфейс Telegram для выполнения кода на локальном сервере. Пользователи могут взаимодействовать с ботами, отправляя им сообщения, команды и встроенные запросы. 

Принцип работы любого бота заключается в том, что он перманентно направляет запросы на сервер и регулярно получает обновления. Получать их можно двумя способами. Во-первых, можно использовать вебхуки, когда сервер делает обратный вызов на указанный URL. А во-вторых, можно просто забрасывать запросами Telegram, получая постоянные ответы. 

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

Если вы случайно сотрете/потеряете эту информацию, то вы ее больше никак не восстановите.

В отличие от Bot API, где получать обновление можно только один раз, в Telegram API это ограничение можно обойти, если использовать несколько клиентов. В таком случае бот будет получать все обновления на каждом из запущенных клиентов. Также в Bot API нет возможности рассылки сообщений всем юзерам одновременно. 

На GitHub () можно найти исходники сервера Bot API. Развернув такой сервер вы получите HTTP URL с возможностью организации работы через вебхуки. Также сможете загружать файлы (до двух терабайт) на локальный сервер. Сервер имеет возможность настройки порта и локального IP-адреса для вебхука, а также поддерживает до 100000 одновременных подключений — более чем достаточно для большинства задач.

Список синтезаторов речи:

1. Acapela

Acapela — один из самых распространенных речевых синтезаторов во всем мире. Программа распознает и озвучивает тексты более, чем на тридцати языках. Русский язык поддерживается двумя голосами: мужской голос — Николай, женский — Алена. Женский голос появился значительно позднее мужского и является более усовершенствованным.

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

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

Установка программы проходит без проблем. Разработаны версии для операционных систем Windows, Linux, Mac, а также для мобильных ОС Android u IOS.

Программа платная, скачать ее можно с официального сайта Acapela.

2. Vokalizer

Вторым в нашем списке, но не по популярности является движок Милена от разработчика программы Vocalizer компании Nuance. Голос звучит очень естественно, речь чистая

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

Прекрасно подходит для чтения книг.

Скачать все версии Vokalizer и русскоязычный движок Милена можно на официальном сайте производителя программы.

3. RHVoice

Синтезатор речи RHVoice был разработан Ольгой Яковлевой. Программа озвучивает русские тексты тремя голосами: Елена, Ирина и Александр. Подробнее об установке и применении, а также прослушать голоса Вы сможете в прошлой статье

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

4. ESpeak

Первая версия бесплатного синтезатора речи eSpeak была выпущена в 2006 году. С тех пор компания-разработчик постоянно выпускает все более усовершенствованные версии. Последняя версия была представлена в конце весны две тысячи тринадцатого года.

  • Microsoft Windows,
  • Mac OS X,
  • Linux,
  • RISC OS

Возможна также компиляция кода для Windows Mobile, но делать ее придется самостоятельно. А вот с мобильной ОС Android программа работает без проблем, хотя русские словари еще не до конца разработаны. Русскоязычных голосов много, можно выбрать на свой вкус.

Для разработчиков будет интересно узнать, что C++ код программы доступен в сети. Скачать программу, а также посмотреть ее код можно на официальном сайте.

5. Festival

Festival — это целая система распознавания и синтеза речи, которая была разработана в эдинбургском университете. Программы и все модули абсолютно бесплатно и распространяются по системе open source. Скачать их и ознакомиться с демо-версиями можно на официальном сайте университета Эдинбурга.

Русский голос представлен в одном варианте, но звучание довольно хорошее и ясное, без акцента и с правильной расстановкой ударений. К сожалению, программа пока может быть установлена только в среде API, Linux. Также есть модуль для работы в Mac OS, но русский язык пока поддерживается не очень хорошо.

Работа со сложными программами

В музыкальных приложениях настройки гораздо сложнее. В речевом модуле программы FL Studio пользователь может выбрать несколько видов голосов, а также указать тональность и скорость воспроизведения. Постановка ударений перед слогами осуществляется с помощью символа «_». С помощью подобного речевого синтезатора можно создать лишь роботизированный голос.

Программа Vocaloid относится к приложениям профессионального типа. Помимо обычных параметров, пользователь может выбирать артикуляцию и глиссандо. В утилите есть база с вокалом профессионалов. При желании можно подгонять под ноты целые предложения. Одна только библиотека с вокалом занимает более 4 Гб в сжатом виде.

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

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

Даем возможность бана в группе

Помимо основного кода нам понадобится сделать файл , который поместим рядом с главным файлом нашего бота:

from aiogram import types
from aiogram.dispatcher.filters import BoundFilter

class IsAdminFilter(BoundFilter):
    key = "is_admin"
    def __init__(self, is_admin):
        self.is_admin = is_admin
    async def check(self, message: types.Message):
        member = await message.bot.get_chat_member(message.chat.id, message.from_user.id)
        return member.is_chat_admin()

В коде бота мы его импортируем:

import config
import logging

from aiogram import Bot, Dispatcher, executor, types
from filters import IsAdminFilter
logging.basicConfig(level=logging.INFO)

bot = Bot(token=config.TOKEN)
dp = Dispatcher(bot)

dp.filters_factory.bind(IsAdminFilter)
@dp.message_handler(is_admin=True, commands=, commands_prefix="!/")
async def cmd_ban(message: types.Message):
    if not message.reply_to_message:
        await message.reply("это должен быть ответ на сообщение")
        return

    await bot.kick_chat_member(chat_id=message.chat.id, user_id=message.reply_to_message.from_user.id)
    await message.delete()

    await message.reply_to_message.reply("пользователь наказан!")


@dp.message_handler()
async def filter_messages(message: types.Message):
    if "мат" in message.text:
        await message.delete()


if __name__ == "__main__":
    executor.start_polling(dp, skip_updates=True)

Также необходимо в конфигурационном файле указать чата ().

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

В токене бота первая часть — это его . Например, токен принадлежит боту с . В перед супергрупп и каналов добавляется -100 (например, превращается в ).

json-server

Последний инструмент этого тура — json-server, это еще один пакет NPM для создания stubbing API. json-server — это HTTP-сервер, который может прослушивать локальную (или удаленную) сеть.

Установка и запуск json-server

Чтобы установить json-сервер в свой проект используйте следующую команду:

npm i json-server --save-dev

Затем создайте новый файл с именем db.json в папке проекта. Этот файл будет содержать поддельную базу данных для нашего сервера. В нем может быть что-то в этом роде:

{
  "users": 
}

Теперь откройте package.json и настройте скрипт с именем «stubapi» для запуска json-сервера:

  "scripts": {
    "stubapi": "json-server db.json",
    "test": "jest",
    "e2e": "cypress open"
  },

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

npm run stubapi

В консоли вы должны увидеть следующий вывод:

  Resources
  http://localhost:3000/users

  Home
  http://localhost:3000

Это означает, что теперь вы можете получить доступ к http://localhost:3000/users, чтобы получить список поддельных пользователей.

Как видите, эта вся эта структура URLов — это первая проблема с json-server. Нелегко получить что-то вроде http://localhost:3000/api/users, не засорив конфигурацию дополнительным кодом.

json-server требует собственный список маршрутов и ответов, и в большинстве случаев это усложняет проект.

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

Модульный тест с Jest и json-сервером

Чтобы протестировать заглушку с помощью Jest, откройте __tests__/APITest.spec.js, очистите все и внесите следующий код:

const { getUsers } = require("../src/common/usersAPI");

beforeAll(() => {
  require("whatwg-fetch");
});

describe("Users API", () => {
  test("it returns an array of users", async () => {
    const expected = ;

    const json = await getUsers("http://localhost:3000/users");

    expect(json).toMatchObject(expected);
  });
});

В этом тесте нам больше не нужно имитировать (mock), мы просто вызываем API-заглушку.

Теперь откройте src/common/usersAPI.js и настройте функцию, чтобы она принимала следующий параметр:

function getUsers(endpoint) {
  return fetch(endpoint)
    .then(response => {
      if (!response.ok) throw Error(response.statusText);
      return response.json();
    })
    .then(json => json);
}

module.exports = { getUsers };

Теперь запустите в терминале:

npm run stubapi

В другом терминале запустите модульные тесты:

npm test

Тест должен пройти:

 PASS  __tests__/APITest.spec.js
  Users API
    ✓ it returns an array of users (3 ms)

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        0.962 s, estimated 1 s
Ran all test suites.

Теперь посмотрим на функциональный тест.

Функциональный тест с Cypress и json-server

Этот тест тоже простой. Откройте integration/APITest.spec.js, очистите все и внесите следующий код:

describe("Users API", () => {
  it("should see a list of users", () => {
    cy.visit("http://localhost:8080/");

    cy.contains("FETCH").click();

    cy.contains(/Jonas|Chris|Juliana/);
  });
});

В src/index.js не забудьте вызвать API-заглушку:

const button = document.getElementById("fetch-btn");

button.addEventListener("click", function() {
  // AJAX request with XMLHttpRequest
  const request = new XMLHttpRequest();
  request.open("GET", "http://localhost:3000/users/");
  request.onload = function() {
    const jsonResponse = JSON.parse(this.response);
    buildList(jsonResponse);
  };
  request.send();
});


function buildList(data) {
  const ul = document.createElement("ul");
  for (const user of data) {
    const li = document.createElement("li");
    li.innerText = user.name;
    ul.appendChild(li);
  }
  document.body.appendChild(ul);
}

Теперь, когда json-сервер все еще запущен, запустите приложение в терминале:

npm start

В другом терминале запустите Cypress:

npm run e2e

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

Это mocking или stubbing? json-server — типичный пример stubbing, потому что мы предоставляем фальшивую внешнюю службу нашим тестам, не затрагивая ничего в нашем коде (кроме небольшой корректировки URL-адреса в нашем примере).

Парад изобретений

Роботы, созданные с использованием Java-технологий и элементов LEGO, действительно впечатляют. В мае 2001 года евангелисты Java-технологии в Sun устроили соревнование в Bay Area университетах, чтобы посмотреть, кто же сможет изобрести самого непревзойденного робота на основе блока RCX от LEGO. UC Santa Cruz выдали “SlugBot”, робота, который одним пальцем играет мелодии на небольшой клавиатуре. Stanford произвели “MazeBot”, который решал задачу по прохождению лабиринтов. А UC Berkeley разработали выигравшего в этом соревновании робота “PaperBot”, который выбирал и сортировал цветные бумажки по их цвету.

Рисунок 2. SlugBot от UC Santa Cruz
Рисунок 3. MazeBot от Stanford
Рисунок 4. PaperBot от UC Berkeley.

Саймон Риттер демонстрировал ряд своих LEGO-роботов на конференции SunNetwork 2002 в Сан-Франциско. Один из них – это LEGO-блок на колесиках, запрограммированный обнаруживать и следовать по неравномерному черному следу на белом фоне. “Один поток обнаруживает события, — говорит Риттер, — а второй берет на себя управление моторами и поиском направления”.

Другой робот из серии Риттера LEGO-ботов работает в качестве крупье игры blackjack. Система распознает команды, озвучивает действия и визуально воспринимает выполняемые действия. “Начнем игру”, — объявляет робот. “У игрока шесть карт пиковой масти”, — говорит он.

Если брать во внимание ограниченные возможности обработки информации блока RCX от LEGO, то естественно, что для реализации демонстрационных роботов Риттера невозможно было бы обойтись функциями одного лишь блока RCX. С другой стороны, этот блок берет на себя функций гораздо больше, чем обычный набор моторов, управляемых компьютером

“Понятно, что часть обработки визуальной информации производится на персональном компьютере”, — говорит Риттер. “Например, если брать моего робота, который приносит мяч заданного цвета, то здесь задача определения местоположения мяча ложится на компьютер. После этого координаты мяча посылаются роботу. Но и то, что на RCX-блок накладываются задачи определения возможности взять мяч, поднять его, и принести обратно, говорит о многом. Помимо этого робот должен запомнить координаты своего изначального местоположения, чтобы знать, куда возвращаться обратно”.

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

Код, написанный Риттером для своих демонстрационных роботов, также как и его SDK для робототехники, доступны в сети для скачивания (смотри ссылки в конце статьи).

Преимущества облачных API Gateway

Различные облачные реализации API Gateway удобны в использовании и значительно экономят время разработки. Они принимают и обрабатывают клиентские запросы к различным службам, управляют функциями сервисов и реализуют бизнес-логику. Кроме того, облачные API Gateway поддерживают интеграцию с облачными сервисами и настраивается это очень быстро, буквально за пару минут. 

Система автоматического масштабирования обеспечивает минимально возможный отклик на запрос. Облачные Gateway могут контролировать периодичность запросов для каждого HTTP-метода и формировать кеш с настраиваемыми ключами и определением таймаута в секундах. Обычно, облачные системы API Gateway позволяют выполнять контроль различных показателей, показывая в удобном интерфейсе, например, число ошибок или задержку вызова. 

Определение функции воспроизведения речи

Интеллектуальному голосовому помощнику прежде всего полагается говорить. Чтобы бот говорил, мы определим функцию , которая принимает на входе аудио и произносит его.

def speak(audio): pass #пока так, позже мы напишем все условия.

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

Что такое ?

Это библиотека Python, которая поможет нам конвертировать текст в устную речь. Она работает оффлайн и доступна как для Python 3, так и для Python 2.

Установка:

pip install pyttsx3

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

Использование:

import pyttsx3

engine = pyttsx3.init('sapi5')
voices = engine.getProperty('voices') #даёт подробности о текущем установленном голосе
engine.setProperty('voice', voice.id)  # 0-мужской , 1-женский

Что такое sapi5? Microsoft Speech API (SAPI5) – технология для распознавания и синтеза речи, предоставленная Microsoft.

VoiceId помогает нам выбирать разные голоса:

  • = мужской голос
  • = женский голос

Английский для программистов

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

Подробнее

×

Будущее

Мир робототехники стремительно демонстрирует мощь своей платформонезависимости и гибкость благодаря Java-технологии – начиная с полнофункциональных Java Speech и Java Media Framework API, до ограниченной в количестве ресурсов, но эффективной open-source среды leJOS. “Java Speech API – это очень подходящий, недорогой путь к добавлению голосового контроля, распознавания и синтеза речи в ваши приложения”, — говорит Риттер. “А Java Media Framework API – это полезный и очень мощный набор технологий, которые позволяют получать информацию от web-камеры и производить обработку полученной информации. Ну а leJOS – это великолепный open-source проект, предоставляющий мощность и простоту Java-технологии для управления роботами”.

Когда объединяются Java и робототехника, то даже небо не является какой-то границей в сфере применения роботов. В 2001 году, LEGO, Siemens, Hitachi и Introspace организовали соревнование на лучшего LEGO-робота. Система-победитель была взята на борт Международной Космической Станции (декабрь, 2001). “Робот парил вокруг и собирал куски строительного мусора”, — говорит Риттер. “Таким образом, он представлял собой самый настоящий уборщик мусора, в программном обеспечении которого сборщика мусора не было J!”

И совсем недавно, Джеймс Гослинг (James Gosling) из Sun Labs консультировался с учеными и инженерами из NASA и JPL, с целью рассмотрения возможности использования Java-технологии в вездеходе, предстоящая миссия которого – Марс. “Красная” планета примерно в двадцати световых минут от Земли. И получается, что, даже используя связь на скорости света (и радио волны), передача сообщения планетарному вездеходу будет осуществляться в течение двадцати минут. Плюс к этому, чтобы получить ответ и подтверждение о получении сообщения потребуется еще двадцать минут. Такие расстояния делают неосуществимым возможность контроля над транспортным средством в режиме реального времени. Поэтому роботы – исследователи планет – должны принимать множество решений самостоятельно. Программное обеспечения следующего поколения для марсианского вездехода в оригинале было спроектировано и построено с помощью C++. Однако Гослинг работает совместно с NASA и JPL, чтобы создать Java-версию кода, который будет послан вместе с вездеходом на Марс в 2009 году.

Как работает голосовой ассистент

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

Естественно, передать всю базу и все наработки по распознаванию текста и синтезу речи на смартфон не представляется возможным. Именно по этой причине ассистенты работают только при наличии подключения к Сети. В остальных случаях они просто говорят о том, что у них проблемы с соединением. Это чуть ли не единственная фраза, которая у них есть оффлайн.

В итоге, ваш запрос отправляется на сервер для определения того, что вы сказали, данные обрабатываются и ответ прилетает обратно. Ассистент как бы переспрашивает у сервера: “Что он сказал?”. Все это происходит за секунды или даже доли секунд, но за редким исключением работает именно так.

После обработки команды на сервере команда или отправляется обратно в виде обратной команды, или формируется поисковой запрос, по результатам которого генерируется голосовой ответ (в случае со смартфоном еще и визуальный). В первом случае включается свет, открывается дверь и тому подобное, а во втором — озвучивается погода или, например, свежие новости.

Стоит себе и команды выполняет.

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

Повторяем изученное

  • Сначала мы создали функцию , которая предоставляет функционал для приветствия пользователя в соответствии с системным временем.
  • После  мы создали функцию , которая позволяет ассистенту принимать команды пользователя и действовать в соответствии с ними. Эта функция возвращает запрос пользователя в формате строки.
  • Мы проработали логику для открывания различных сайтов: Google, YouTube, Stackoverflow, freecodecamp, Wikipedia.
  • Мы также добавили возможность открывать IDE PyCharm и другие приложения.
  • В конце мы разработали функцию отправки электронных писем (без написания единого слова, разве не круто?)

И тут последует самый противоречивый вопрос…

Рейтинг
( Пока оценок нет )
Editor
Editor/ автор статьи

Давно интересуюсь темой. Мне нравится писать о том, в чём разбираюсь.

Понравилась статья? Поделиться с друзьями:
Бизнес журнал Мономах
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: