{"id":14291,"url":"\/distributions\/14291\/click?bit=1&hash=257d5375fbb462be671b713a7a4184bd5d4f9c6ce46e0d204104db0e88eadadd","hash":"257d5375fbb462be671b713a7a4184bd5d4f9c6ce46e0d204104db0e88eadadd","title":"\u0420\u0435\u043a\u043b\u0430\u043c\u0430 \u043d\u0430 Ozon \u0434\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u0442\u0430\u043c \u043d\u0435 \u043f\u0440\u043e\u0434\u0430\u0451\u0442","buttonText":"","imageUuid":""}

Cвой Джарвис на языке программирования Python

Привет, любитель Python! Эта статья с телеграм канала PythonGuru, подпишись если любишь Python!

Я думаю что все знают голосового помощника Джарвиса из фильма «Железный человек». И много кто мечтал сделать голосового помощника своими руками. В этой статье мы его напишем.

Что понадобится

  • Python версии 3.6.8
  • Установленные по порядку модули: Librariespywin32, pipywin32, pyttsx3, SpeechRecognition, PyAudio, fuzzywuzzy, pyowm, python‑Levenshtein, CurrencyConverter.

Написание самого помощник

Создаём в папке вот такие файлы:

functions.py

Открываем файл functions.py и импортируем библиотеки и остальные файлы:

import pyttsx3 import speech_recognition as sr import os from fuzzywuzzy import fuzz import datetime import win32com.client as wincl import site import calculator import envelope import translator

После этого вставляем данный код и вписываем в строку alias название помощника(у нас pythonguru):

opts = {"alias": ('pythonguru', 'пайтонгуру', 'гурупайтон'), "tbr": ('скажи', 'расскажи', 'покажи', 'сколько', 'произнеси', 'как','сколько','поставь','переведи', "засеки",'запусти','сколько будет'), "cmds": {"ctime": ('текущее время', 'сейчас времени', 'который час', 'время', 'какое сейчас время'), 'startStopwatch': ('запусти секундомер', "включи секундомер", "засеки время"), 'stopStopwatch': ('останови секундомер', "выключи секундомер", "останови"), "stupid1": ('расскажи анекдот', 'рассмеши меня', 'ты знаешь анекдоты', "шутка", "прикол"), "calc": ('прибавить','умножить','разделить','степень','вычесть','поделить','х','+','-','/'), "shutdown": ('выключи', 'выключить', 'отключение', 'отключи', 'выключи компьютер'), "conv": ("валюта", "конвертер","доллар",'руб','евро'), "internet": ("открой", "вк", "гугл", "сайт", 'вконтакте', "ютуб"), "translator": ("переводчик","translate"), "deals": ("дела","делишки", 'как сам', 'как дела')}}

Дальше подключаем микрофон и голос самого помощника

startTime = 0 speak_engine = pyttsx3.init() voices = speak_engine.getProperty('voices') speak_engine.setProperty('voice', voices[2].id) r = sr.Recognizer() m = sr.Microphone(device_index=1) voice = "str"

Если у вас не работает микрофон то пробуйте менять значение device_index=1 (например на device_index=2)

Далее вставляем весь этот код (функции разговора ассистента, фунции прослушки микрофона и возможности самого ассистента):

def speak(what): print(what) speak = wincl.Dispatch("SAPI.SpVoice") speak.Speak(what) def callback(recognizer, audio): try: global voice voice = recognizer.recognize_google(audio, language="ru-RU").lower() print("[log] Распознано: " + voice) if voice.startswith(opts["alias"]): cmd = voice for x in opts['alias']: cmd = cmd.replace(x, "").strip() for x in opts['tbr']: cmd = cmd.replace(x, "").strip() voice = cmd # распознаем и выполняем команду cmd = recognize_cmd(cmd) execute_cmd(cmd['cmd']) except sr.UnknownValueError: print("[log] Голос не распознан!") except sr.RequestError as e: print("[log] Неизвестная ошибка, проверьте интернет!") def listen(): with m as source: r.adjust_for_ambient_noise(source) stop_listening = r.listen_in_background(m, callback) while True: time.sleep(0.1) def recognize_cmd(cmd): RC = {'cmd': '', 'percent': 0} for c, v in opts['cmds'].items(): for x in v: vrt = fuzz.ratio(cmd, x) if vrt > RC['percent']: RC['cmd'] = c RC['percent'] = vrt return RC ef execute_cmd(cmd): global startTime if cmd == 'ctime': now = datetime.datetime.now() speak("Сейчас {0}:{1}".format(str(now.hour), str(now.minute))) elif cmd == 'shutdown': os.system('shutdown -s') speak("Выключаю...") elif cmd == 'calc': calc.calculator() elif cmd == 'conv': convert.convertation() elif cmd == 'translator': translate.translate() elif cmd == 'stupid1': anekdot.fun() elif cmd == 'internet': browser.browser() elif cmd == 'startStopwatch': speak("Секундомер запущен") startTime = time.time() elif cmd == "stopStopwatch": if startTime != 0: Time = time.time() - startTime speak(f"Прошло {round(Time // 3600)} часов {round(Time // 60)} минут {round(Time % 60, 2)} секунд") startTime = 0 else: speak("Секундомер не включен") elif cmd == 'deals': speak("Пока отлично.") else: print("Команда не распознана!")

start.py

Этот файл будет служить для запуска всего ассистента

import functions import time import datetime now = datetime.datetime.now() if now.hour >= 6 and now.hour < 12: funcs.speak("Доброе утро!") elif now.hour >= 12 and now.hour < 18: funcs.speak("Добрый день!") elif now.hour >= 18 and now.hour < 23: funcs.speak("Добрый вечер!") else: funcs.speak("Доброй ночи!") funcs.listen()

site.py

С его помощью мы будем открывать любые сайты.

import webbrowser import funcs def browser(): sites = {"https://vk.com":["vk","вк"], 'https://www.youtube.com/':['youtube', 'ютуб'], 'https://ru.wikipedia.org': ["вики", "wiki"], 'https://ru.aliexpress.com':['али', 'ali', 'aliexpress', 'алиэспресс'], 'http://google.com':['гугл','google'], 'https://www.amazon.com':['амазон', 'amazon'], 'https://www.apple.com/ru':['apple','эпл'] ' https://telete.in/gurupython':['пайтонгуру', 'pythonguru']} site = funcs.voice.split()[-1] for k, v in sites.items(): for i in v: if i not in site.lower(): open_tab = None else: open_tab = webbrowser.open_new_tab(k) break if open_tab is not None: break

calculator.py

Самый простейший калькулятор на пайтоне

import funcs def calculator(): try: list_of_nums = funcs.voice.split() num_1,num_2 = int((list_of_nums[-3]).strip()), int((list_of_nums[-1]).strip()) opers = [list_of_nums[0].strip(),list_of_nums[-2].strip()] for i in opers: if 'дел' in i or 'множ' in i or 'лож' in i or 'приба' in i or 'выч' in i or i == 'x' or i == '/' or i =='+' or i == '-' or i == '*': oper = i break else: oper = opers[1] if oper == "+" or 'слож' in oper: ans = num_1 + num_2 elif oper == "-" or 'выче' in oper: ans = num_1 - num_2 elif oper == "х" or 'множ' in oper: ans = num_1 * num_2 elif oper == "/" or 'дел' in oper: if num_2 != 0: ans = num_1 / num_2 else: funcs.speak("Делить на ноль невозможно") elif "степен" in oper: ans = num_1 ** num_2 funcs.speak("{0} {1} {2} = {3}".format(list_of_nums[-3], list_of_nums[-2], list_of_nums[-1], ans)) except: funcs.speak("Скажите, например: Сколько будет 5+5?")

envelope.py

Конвертер денег

from currency_converter import CurrencyConverter import funcs def convertation(): class CurrencyError(Exception): pass c = CurrencyConverter() money = None from_currency = None to_currency = None list_of_conv = funcs.voice.split() if len(list_of_conv) > 4: list_of_conv = list_of_conv[1:] else: print() while money is None: try: money = list_of_conv[0] except ValueError: funcs.speak("Скажите, к примеру: 50 долларов в рубли") break while from_currency is None: try: list_of_conv[0] = int(list_of_conv[0]) except ValueError: funcs.speak("Скажите, к примеру: 50 долларов в рубли") break try: if "руб" in list_of_conv[1]: from_currency = "RUB" elif "дол" in list_of_conv[1]: from_currency = "USD" elif "евр" in list_of_conv[1]: from_currency = "EUR" if from_currency not in c.currencies: raise CurrencyError except (CurrencyError, IndexError): from_currency = None funcs.speak("Скажите, например: 50 долларов в рубли") break while to_currency is None: try: list_of_conv[0] = int(list_of_conv[0]) except ValueError: return None try: if "руб" in list_of_conv[3]: to_currency = "RUB" elif "дол" in list_of_conv[3]: to_currency = "USD" elif "евр" in list_of_conv[3]: to_currency = "EUR" if to_currency not in c.currencies: raise CurrencyError except (CurrencyError, IndexError): to_currency = None funcs.speak("Скажите, например: 50 долларов в рубли") break while True: try: funcs.speak(f"{money} {from_currency} в {to_currency} - " f"{round(c.convert(money, from_currency, to_currency), 2)}") break except ValueError: funcs.speak("Скажите, например: 50 долларов в рубли") break

translator.py

Простой переводчик

import requests import funcs def translate(): url = 'https://translate.yandex.net/api/v1.5/tr.json/translate?' key = 'trnsl.1.1.20190227T075339Z.1b02a9ab6d4a47cc.f37d50831b51374ee600fd6aa0259419fd7ecd97' text = funcs.voice.split()[1:] lang = 'en-ru' r = requests.post(url, data={'key': key, 'text': text, 'lang': lang}).json() try: funcs.speak(r["text"]) except: funcs.speak("Обратитесь к переводчику, начиная со слова 'Переводчик'")

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

Совершенствуй знания по Python каждый день у нас на телеграм канале, PythonGuru.

0
19 комментариев
Написать комментарий...
Дмитрий Назаров

Помогите пожалуйста реализовать на Manjaro linux

Ответить
Развернуть ветку
Dr Chelovek

помогите пожалуйста у меня при установке пай аудио выходит ERROR: Command errored out with exit status 1: 'c:\python projects\vas\venv\scripts\python.exe' -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'C:\\Users\\9
B80~1\\AppData\\Local\\Temp\\pip-install-ue3zpsmx\\PyAudio\\setup.py'"'"'; __file__='"'"'C:\\Users\\9B80~1\\AppData\\Local\\Temp\\pip-install-ue3zpsmx\\PyAudio\\setup.p
y'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))'
install --record 'C:\Users\9B80~1\AppData\Local\Temp\pip-record-k4o2but4\install-record.txt' --single-version-externally-managed --compile --install-headers 'c:\python
projects\vas\venv\include\site\python3.7\PyAudio' Check the logs for full command output.

Ответить
Развернуть ветку
Никита Жуков

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

Ответить
Развернуть ветку
Айваз Насибуллин

Скачай отсюда whl файл PyAudio под твою версию питона и ОС
https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyaudio
введи в консоль: pip install название файла PyAudio
например:
pip install PyAudio‑0.2.11‑cp38‑cp38‑win_amd64.whl

Ответить
Развернуть ветку
Кирилл Кирилл

подскажите, funcs подчеркивается красным и при запуске такая ошибка
Traceback (most recent call last):
File "D:/Python/Джарвис/start.py", line 1, in
import functions
File "D:\Python\Джарвис\functions.py", line 8, in
import calculator
File "D:\Python\Джарвис\calculator.py", line 1, in
import funcs
ModuleNotFoundError: No module named 'funcs'

Ответить
Развернуть ветку
Lsnowl

походу автор опечатался и имел ввиду import functions вместо funcs.

Ответить
Развернуть ветку
Pix1314

Подскажите как решить
Traceback (most recent call last):
File "start.py", line 16, in
functions.listen()
File "C:\Users\R\Desktop\Новая папка\Пятница\Friday\functions.py", line 68, in listen
while True: time.sleep(0.1)
NameError: name 'time' is not defined

Ответить
Развернуть ветку
Tua Beatitudo

import time 
в фaйле functions.py

Ответить
Развернуть ветку
PINGUIN

File "d:\Jarvis\functions.py", line 78
ef execute_cmd(cmd):
^

Ответить
Развернуть ветку
PINGUIN

File "d:\Jarvis\functions.py", line 78
ef execute_cmd(cmd):
^
Как исправить?

Ответить
Развернуть ветку
nickname

def execute_cmd(cmd) :*
Опечатка на сайте

Ответить
Развернуть ветку
Polad Mammadli

когда дважды кликаю на файл start.py появляется черное окно меньше чем на 1 сек ничего не получается что делать?

Ответить
Развернуть ветку
Atlas Soldatow

как создать эти папки под названием calculator.py и тд

Ответить
Развернуть ветку
Atlas Soldatow

я новенький в этой сфере

Ответить
Развернуть ветку
Adam Kad

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

Ответить
Развернуть ветку
Иван Лабинский

А как запустить джарвис

Ответить
Развернуть ветку
Иван Лабинский

просто я код сделал, а как включить не знаю

Ответить
Развернуть ветку
Adam Kad

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

Ответить
Развернуть ветку
DRAGON MAGMA

а через визиуал код студио

Ответить
Развернуть ветку
16 комментариев
Раскрывать всегда