Джарвис для самых маленьких

Думаю, что многие смотрели фильм про эксцентричного изобретателя Тони Старка, и видели, как работает его ИИ Джарвис. Многие хотели создать такого же, чтобы можно было также быстро, с помощью голоса, контролировать собственный компьютер. На данную тематику написано много статей. Все они довольно сложны, в них используется много строк кода, библиотек и совсем непростые алгоритмы.
Но…я попробую создать рабочий прототип голосового ассистента используя буквально 4-5 библиотек и не самый замысловатый скрипт, что позволит, на начальном уровне знания python создать полезного помощника для работы.
Нам понадобятся библиотеки:
- pyAudio
- speech_recognition
- Os
- PyAutogui
- time
Мы скачали библиотеки и импортировали их в код
import %libname%
Теперь давайте определимся, какая самая распространенная манипуляция, которую мы проводим за компьютером. На мой взгляд, открытие приложений.
Честно говоря, когда рабочий стол сильно захламлен, довольно много времени уходит на то, чтобы отыскать нужный ярлык. Или же, когда не хочешь отрываться от задачи, которую выполняешь в данный момент, но тебе резко требуется другое приложение, которое нужно искать, прерывать задачу, выходить из потока, и вообще неудобно, и не хочется. Можно просто сказать компьютеру об этом, и он сам его откроет.
Итак, в основном вся логика будет строится на библиотеке speech_recognition, которая и будет обрабатывать нашу речь. Библиотека Speech_recognition — это своего рода обертка для известных речевых api от гугла,wit’a, Бинга и других it компаний, она даже может работать оффлайн (подробнее про нее можно прочитать тут)
Ну что же, приступим:
import speech_recognition as speech_r import os rc = speech_r.Recognizer()
Импортируем библиотеки в код и создадим экземпляр класса recognizer
Было бы неплохо, если бы скрипт работал бесконечно. Что за голосовой ассистент, который нужно постоянно запускать (Используем конструкцию while True).
while True: with speech_r.Microphone() as voice: print("Приветствую вас, Сэр. Какие будут указания?") rc.adjust_for_ambient_noise(voice) audio = rc.listen(voice)
Собственно, что я здесь делаю.
- Выбираю источник звука(микрофон)
- Приветственная фраза
- Очищаю звук от шумов
- Захватываю звук с микрофона
Хорошо, половина дела сделана, осталось его распознать.
Не выходя из бесконечного цикла, пишем метод для распознавания речи, и отлавливаем исключения. На всякий, а то вдруг Джарвис не услышит:
try: x = rc.recognize_google(audio, language="ru-RU") x = x.lower()
Хорошо, сейчас под переменной ‘x’ у нас хранится строчка нашего приказа или просьбы.
И я привел строчку к нижнему регистру, ну так, в целях единообразия.
Так, приказ есть — пол дела сделано. Осталось описать, что этот приказ означает.
Система будет воспринимать нашу речь и путем сравнения понимать, что ей нужно делать.
В нашем случае какое именно приложение открыть, но не ограничивайтесь этим, вы можете заставить его делать не только это.
Собственно, заведем небольшой словарик, в котором будут описаны необходимые нам приложения. Его можно вставить перед объявлением экземпляра класса.
loc_dict =
Дальше нам остается сделать простой сравнительный алгоритм.
Если в строку, которая хранится в переменной x входит ключ, то выполни значение ключа:
for i in loc_dict: if x.find(i) >= 0: os.startfile(loc_dict[i])
Ну и отлавливаем исключения:
except speech_r.UnknownValueError: print("Я вас не расслышал, повторите пожалуйста приказ") except speech_r.RequestError as e: print ("Ошибка сервиса; ". Format (e))
Так же, в принципе, можно разнообразить нашего голосового помощника некоторыми полезными функциями для более удобной работы, здесь нам поможет библиотека pyautogui.
Допустим переключение вкладки(alt + tab)
def alt_tab(): pyautogui.keyDown('alt') time.sleep(.2) pyautogui.press('tab') time.sleep(.2) pyautogui.keyUp('alt')
Или вызов диспетчера задач:
def disp_(): pyautogui.hotkey('ctrl', 'shift', 'esc')
Функция создания скриншота будет довольно полезной:
pyautogui.screenshot('my_screenshot.png')
Идентичным способом вплетаем проверку на эти фразы в код. Общий код выходит таким:
import speech_recognition as speech_r import os import pyautogui import time rc = speech_r.Recognizer() def alt_tab(): pyautogui.keyDown('alt') time.sleep(.2) pyautogui.press('tab') time.sleep(.2) pyautogui.keyUp('alt') def disp_(): pyautogui.hotkey('ctrl', 'shift', 'esc') loc_dict = <'оперу':r'C:\Users\User\AppData\Local\Programs\Opera\launcher.exe', 'блокнот': r'C:\WINDOWS\system32\notepad.exe', 'калькулятор':'C:\Windows\System32\calc.exe', >while True: with speech_r.Microphone() as voice: print("Какие будут пожелания, Сэр?") rc.adjust_for_ambient_noise(voice) audio = rc.listen(voice) try: x = rc.recognize_google(audio, language="ru-RU") x = x.lower() print(x) for i in loc_dict: if x.find(i) >= 0: os.startfile(loc_dict[i]) if x.find('следующий') >= 0: alt_tab() elif x.find('скриншот') >= 0: pyautogui.screenshot('my_screenshot.png') elif x.find('диспетчер') >= 0: disp_() else: continue except speech_r.UnknownValueError: print("Я вас не расслышал,Сэр. Повторите пожалуйста запрос") except speech_r.RequestError as e: print("Ошибка сервиса; ".format(e))
Таким образом, всего за пару десятков строк кода, у нас получился довольно полезный, но безмолвный голосовой помощник, который облегчит жизнь, и сделает работу за компьютером чуточку удобнее. Его можно применять, как в собственных целях, так и при помощи людям, для которых коммуникации с ПК затруднены.
Создание голосового ассистента на Python, часть 1
Добрый день. Наверное, все смотрели фильмы про железного человека и хотели себе голосового помощника, похожего на Джарвиса. В этом посте я расскажу, как сделать такого ассистента с нуля. Моя программа будет написана на python 3 в операционной системе windows. Итак, поехали!
Работать наш ассистент будет по такому принципу:
- Постоянно «слушать» микрофон
- Распознавать слова в google
- Выполнять команду, либо отвечать
Для начала мы установим в систему windows русские голоса. Для этого переходим по ссылке и скачиваем голоса в разделе SAPI 5 -> Russian. Там есть 4 голоса, можно выбрать любой, какой вам понравится. Устанавливаем и идём дальше.
Нам нужно поставить библиотеку pyttsx3 для синтеза речи:
pip install pyttsx3
Затем можно запустить тестовую программу и проверить правильность её выполнения.
import pyttsx3 text = 'какой-нибудь текст' tts = pyttsx3.init() rate = tts.getProperty('rate') #Скорость произношения tts.setProperty('rate', rate-40) volume = tts.getProperty('volume') #Громкость голоса tts.setProperty('volume', volume+0.9) voices = tts.getProperty('voices') # Задать голос по умолчанию tts.setProperty('voice', 'ru') # Попробовать установить предпочтительный голос for voice in voices: if voice.name == 'Anna': tts.setProperty('voice', voice.id) tts.say(text) tts.runAndWait()
2) Распознавание речи
Существует много инструментов для распознавания речи, но они все платные. Поэтому я пытался найти бесплатное решение для моего проекта и нашёл её! Это библиотека speech_recognition.
pip install SpeechRecognition
Также для работы с микрофоном нам необходима библиотека PyAudio.
pip install PyAudio
У некоторых людей возникает проблема с установкой PyAudio, поэтому следует перейти по этой ссылке и скачать нужную вам версию PyAudio. Затем ввести в консоль:
pip instal название скачанного файла
Затем запускаете тестовую программу. Но перед этим вы должны исправить в ней device_index=1 на своё значение индекса микрофона. Узнать индекс микрофона можно с помощью этой программы:
import speech_recognition as sr for index, name in enumerate(sr.Microphone.list_microphone_names()): print("Microphone with name \"\" found for `Microphone(device_index=)`".format(index, name))
Тест распознавания речи:
import speech_recognition as sr def record_volume(): r = sr.Recognizer() with sr.Microphone(device_index = 1) as source: print('Настраиваюсь.') r.adjust_for_ambient_noise(source, duration=0.5) #настройка посторонних шумов print('Слушаю. ') audio = r.listen(source) print('Услышала.') try: query = r.recognize_google(audio, language = 'ru-RU') text = query.lower() print(f'Вы сказали: ') except: print('Error') while True: record_volume()
Если всё отлично, переходим дальше.
Если вы хотите, чтобы ассистент просто общался с вами (без ИИ), то это можно сделать с помощью бесплатного инструмента DialogFlow от Google. После того, как вы залогинетесь, вы увидите экран, где уже можно создать своего первого бота. Нажмите Create agent. Придумайте боту имя (Agent name), выберете язык (Default Language) и нажмите Create. Бот создан!
Чтобы добавить новые варианты ответов на разные вопросы, нужно создать новый intent. Для этого в разделе intents нажмите Create intent. Заполните поля «Название» и Training phrases, а затем ответы. Нажмите Save. Вот и всё.
Чтобы управлять ботом на python, нужно написать такой код. В моей программе бот озвучивает все ответы.
import apiai, json, re import pyttsx3 import speech_recognition as sr tts = pyttsx3.init() rate = tts.getProperty('rate') tts.setProperty('rate', rate-40) volume = tts.getProperty('volume') tts.setProperty('volume', volume+0.9) voices = tts.getProperty('voices') tts.setProperty('voice', 'ru') for voice in voices: if voice.name == 'Anna': tts.setProperty('voice', voice.id) def record_volume(): r = sr.Recognizer() with sr.Microphone(device_index = 1) as source: print('Настраиваюсь.') r.adjust_for_ambient_noise(source, duration=1) print('Слушаю. ') audio = r.listen(source) print('Услышала.') try: query = r.recognize_google(audio, language = 'ru-RU') text = query.lower() print(f'Вы сказали: ') textMessage( text ) except: print('Ошибка распознавания.') def talk( text ): tts.say( text ) tts.runAndWait() def textMessage( text ): request = apiai.ApiAI('ваш токен').text_request() # Токен API к Dialogflow request.lang = 'ru' # На каком языке будет послан запрос request.session_id = 'ваш id' # ID Сессии диалога (нужно, чтобы потом учить бота) request.query = text # Посылаем запрос к ИИ с сообщением от юзера responseJson = json.loads(request.getresponse().read().decode('utf-8')) response = responseJson['result']['fulfillment']['speech'] # Разбираем JSON и вытаскиваем ответ # Если есть ответ от бота - присылаем пользователю, если нет - бот его не понял if response: request.audio_output = response talk(response) else: talk('Простите. Я Вас не совсем поняла.') while True: record_volume()
На сегодня всё. В следующей части я расскажу как сделать умного бота, т.е. чтобы он мог не только отвечать, но и что-либо делать.
- голосовой ассистент
- голосовой помощник
- python
- Python
- Программирование
- Разработка под Windows
Голосовой помощник Джарвис. Python.Новичок!
выдает какую-то ошибку, и выполняет команды сволочь .
все модули, все скачено .

Дополнен 4 года назад
Голосование за лучший ответ
Скажи мне честно, нахрена вы полезли в такие дебри. Голосовые ассистенты нужны крупным компаниям. И обзывать свой код сволочью тоже не вариант.
Тем более Питон человеческий язык. Там написано что в строке 11 и тд. Учите английский и поймете
в чем ошибка
Очередной нахватавшийся идей у Хауди Хо с его помощником? Ты ведь у него весь код тупо скопировал, не думая при этом своей головой. Разберись с самим языком, а потом английский тебе в руки и мануалы в браузер.
Хотя я и сам только пару дней назад доделал похожее чудо, только он у меня ищет в Яндексе/Гугле по словам после «найди» и открывает страницы по адресу, но я это сотворил при помощи мануалов.
Petr0Знаток (277) 4 года назад
ой, ну давай будем честны, все мы когда-то будем брать код у других разрабов, а если ты считаешь иначе, то зря
«Чтобы стать классным специалистом в ИИ, нужно иметь представление обо всем, что происходит в науке»
В конце апреля НИУ ВШЭ — Санкт-Петербург и Яндекс открыли Лабораторию естественного языка (ЛЕЯ). Ее руководителем стал Иван Ямщиков, научный сотрудник Яндекса, автор и ведущий подкаста «Проветримся». Узнали у Ивана, какие проблемы в области искусственного интеллекта сейчас актуальны, в каком направлении идут исследования естественного языка, и чем будет заниматься его научная группа.

— Иван, почему для возвращения в Россию вы выбрали Петербург? Говорят, у нас меньше возможностей, чем в Москве.
— Я родом из Петербурга и считаю, что это лучший североевропейский город, а возможно, и лучший город мира с точки зрения истории и культуры. Когда я обсуждал с Александром Крайновым из Яндекса свою релокацию в Россию, мы думали или про Москву, или про Петербург. Сошлись на том, что в Москве я уже пожил, теперь хочу поработать и в Петербурге. Дальше связались с Евгенией Куликовой, которая в Петербурге занимается образовательными и научными проектами Яндекса, и так и пришли к идее совместного проекта с ВШЭ.
Мне кажется, все зависит от того, что считать возможностями. Если говорить о деньгах, то в Петербурге их, действительно, намного меньше. Зато здесь есть несколько вузов, которые готовят программистов и математиков мирового уровня. Что бы ни пытались делать московские университеты, чемпионы ICPC в основном учатся в Петербурге. Григорий Перельман стал математиком и решил проблему тысячелетия в Петербурге. Здесь находится одни из самых сильных физмат школ страны.
Поэтому с точки зрения кадров Петербург для меня интереснее. Мне кажется, здесь остаются люди, для которых «возможности» не равно «деньги». Эти люди больше подходят для того, чтобы становиться учеными.
В науке обычно так: если ты можешь найти хороших, сильных людей, всё остальное не важно. А чтобы решить вопрос с финансированием, надо просто его привлекать.
— Чем вы будете заниматься в Питерской Вышке?
— Я исследую естественный язык. Мне интересны вопросы, связанные с обработкой дискретных последовательностей. Есть большая разница между красивой математикой, которую преподают в университетах, и наблюдаемыми свойствами реальных объектов окружающего мира. Простой пример: в школе мы все проходили ряды, которые по формуле сходятся к какому-то числу. Но большинство последовательностей, которые мы видим вокруг, гораздо сложнее, и при этом нам надо с ними работать. Например, роман «Война и мир» — тоже дискретная последовательность из некоторого количества символов. И этот набор буковок может повлиять на молодой неокрепший ум гораздо сильнее математики.
Естественные языки живут по определенным правилам. Мы достаточно хорошо понимаем, что в них происходит на локальном уровне. Например, можем смоделировать слово или даже несколько слов: современные языковые модели отлично решают задачи, когда нужно заполнить пропуск в предложении. Однако нейронная сеть не может ничего толкового написать: ни «Войну и мир», ни школьное изложение. А человек может.
Недавно я придумал название тому, чем хочу заниматься — «вычислительная эпистемология». Эпистемология вообще — это раздел философии, исследующий знание: его природу и возможности, границы. До появления искусственных нейронных сетей мы ничего содержательного на эти темы сказать не могли.
Вычислительная эпистемология — это когда мы берем вопросы из философии и смотрим на них под углом конкретных моделей и машинного обучения.
Как мы можем сформулировать, что такое знание для этой модели? Какие количественные шкалы есть для того, чтобы эпистемологически оценить ее работу? Как мы можем проверить, что одна модель знает больше, чем другая? Мне это жутко интересно.
Для того, чтобы эти вопросы исследовать, мы сейчас вместе с Яндексом и Высшей Школой Экономики создаём лабораторию естественного языка ЛЕЯ.
— В каком направлении сейчас развиваются исследования естественных языков?
Есть два принципиальных подхода к развитию языковых моделей. Одни исследователи говорят: «Ребята, наш мозг устроен очень сложно. Мы в действительности не понимаем, насколько мощным инструментом он является. Мы пытаемся разобраться с нейронными механизмами мышления, а есть еще и другие параметры, связанные с нейромедиаторами и биохимией. Давайте делать наши модели еще больше и еще мощнее, тогда рано или поздно мы достигнем впечатляющих результатов». И последние годы происходит именно это: большинство проектов вокруг NLP (Natural language processing — Прим.ред.) про то, чтобы сделать модель еще больше.
И есть другая группа исследователей, которые говорят: «Кажется, что модели становятся объемнее, а фундаментальную проблему все еще не решают. Это значит, что мы не понимаем, как устроен язык, или неправильно строим наши модели». Возможно, дело не в вычислительных способностях мозга, а в его внутренней структуре. Люди, в отличие от машин, понимают глобальный контекст. Вот мы прочли «Войну и мир» и давно забыли, какого цвета был кафтан на Пьере Безухове. А что он сделал предложение Элен — помним. Мы как-то понимаем, что первое — неважно, а второе имеет большое значение. Также и с языковыми моделями. Правильная модель должна понимать, какая информация ей потребуется в процессе обработки последовательностей, а про что можно забыть.
— А сейчас машины этого не умеют?
— Можно научить нейросеть находить элемент текста, который, судя по всему, является важным для сюжета. Но это будет специфическая модель, умеющая делать одну определенную операцию — возможно даже не очень хорошо. Тут вообще не стоит сравнивать с человеком. Пятилетние дети могут моментально сгенерировать какую-нибудь сказочную историю: жил-был лев, он пошел гулять и встретил обезьяну, они подружились и так далее. Существующие сейчас модели умеют детектировать предвзятое изложение новостей в политических медиа, но рассказать историю про льва и обезьяну не могут.
— Хороший специалист в области искусственного интеллекта должен быть и программистом, и математиком, и немного философом. А нужно ли ему разбираться в нейробиологии?
— Мне кажется, что сейчас маятник качнулся в сторону эпохи Возрождения. Поясню, что я имею в виду: считается, что современную науку человечество придумало в эпоху Ренессанса. Я говорю о науке, которая опирается на принципы доказательности, базируется на полученных ранее результатах, которая предполагает, что любое утверждение должно быть подкреплено экспериментом и так далее. В эпоху Возрождения все занимались всем. Нужно было знать анатомию и физику, чтобы портреты правильно рисовать, и чтобы летающие вертолеты делать.
Потом наука стала развиваться в сторону специализации.
Сейчас мы живем с идеей, что для достижения результата в определенной сфере нужен узкий специалист. При этом самые интересные задачи возникают на стыке областей. Мне кажется, что потихоньку началось обратное движение, когда все вспомнили, что наука — это нечто единое и большое.
Сейчас в науке происходит много интересного. Например, ученые из одной области берут и используют методы из другой. Там этот инструмент известен уже 30 лет, а тут только придумали, где он может быть полезен. Возвращаясь к исходному вопросу: чтобы стать классным специалистом в ИИ, нужно следить за новостями не только в нейробиологии. Хорошо бы иметь общее представление обо всем, что происходит в науке, потому что базовые принципы везде одинаковые.
— Какие проблемы в области ИИ сейчас наиболее актуальны?
— Недавно вышла любопытная статья исследователей из Google BrainSwitch Transformers. Люди с упорством, достойным лучшего применения, рапортуют, что сделали модель с триллионом параметров. С одной стороны, это впечатляет. А с другой, возникает вопрос: а новизна-то в чем? Авторы собрали большой датасет, сделали очень мощный кластер, который работает лучше предыдущих. Но насколько лучше? Как количественно оценить этот прогресс, если нас интересует понимание естественного языка, способность модели разговаривать?
Давайте условно представим, что хотим получить Джарвиса из фильма «Железный человек». Чтобы понимать, какой путь еще нужно пройти, надо определить некую шкалу: существующие модели вот тут, а Джарвис — вот тут. И каждый новый результат оценивать в терминах того, как близко мы подошли к желаемому.
Сейчас же исследователи делают так: вроде все хотят Джарвиса, но новые модели сравнивают не с ним, а с какими-то предыдущими и по какой-то другой шкале. Мы вообще не знаем, приближаемся ли к Джарвису. Считается, что если по существующим шкалам мы продвинулись вперед, значит это хорошо. Но понимания, куда ведет эта траектория, у большинства исследователей попросту нет. И более того, сейчас этот вопрос считается праздным, задавать его — дурной тон. Мне кажется, что это неправильно, и я хочу это изменить.
— А сам Джарвис отшкалирован?
— В том-то и дело, что нет! У нас есть интуитивное представление, что такое разумность, но формализовано оно достаточно плохо. Например, существует бенчмарк GLUE — это набор задач для проверки способности системы понимать естественный язык в духе «прочтите текст, ответьте на вопросы». Это довольно хорошая штука, но и в ней есть спорные моменты. Например, все системы сравниваются на неком фиксированном наборе текстов. А что, если на другом наборе результаты будут иные?
Другой пример: есть популярная задача по переписыванию текста. Нужно изменить его так, чтобы смысл сохранился, а стилистика поменялась. Например, сделать из вежливого «Соболезную вашей утрате» невежливый. Оказалось, что это довольно сложно. Получается, что стилистика и смысл на каком-то уровне языка связаны. Как понять, где начинается эта связь, и что она вообще такое — никто не знает. Все просто решают задачу: собрали датасет, обучили модель переписывать одно в другое, посмотрели, как часто она попадает в правильные ответы. И чем чаще ваша модель выдает правильный результат, тем вы большие молодцы.
У нас с Алексеем Тихоновым есть статья What is wrong with style transfer for texts. До того, как мы ее написали, 90% исследований в области переноса стиля были сделаны на отзывах на рестораны. Разные модели переписывали позитивные отзывы в негативные и наоборот — и все были довольны. Мы в нашей статье говорим, что сентимент — позитивный отзыв или негативный — это не стиль, а смысл. Ты можешь написать приятный отзыв в разных стилях, но негативный отзыв — это не другой стиль, это другой смысл. К сожалению, множество исследователей до сих пор называют это style transfer и с блеском публикуются.
В любой дисциплине больших достижений есть люди, которым процесс важнее результата. И хотя мы все хотим построить Джарвиса, 90% статей в области ИИ не задаются вопросом, куда копать, а просто улучшают уже опубликованные результаты.
— Какие возможности для совместной работы с вами есть у студентов Питерской Вышки?
— Если ребят тоже интересуют вопросы понимания естественного языка, они могут написать мне на почту или в мессенджер и рассказать о себе. Мы вместе придумаем тему для дипломной работы или публикации. Что важно: нужно хорошо знать английский язык, писать на Python и не бояться много и продуктивно работать. Если есть мотивация и желание глубоко разбираться в проблеме, мы попробуем сделать что-то вместе.