April 7, 2019

Свой голосовой ассистент на Python + google

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

Начнём с установок.

pip install SpeechRecognition
pip install gTTS

После успешной установки пакетов (у меня Win10 x64, py3.7.1) можем начинать писать код.

начнём как обычно с импортов:

import speech_recognition as sr

Импортируем либу от гугла, которая использует всю мощь их серверов что бы распознать что мы там сказали, импортируем как 'sr', я думаю вам бы тоже не хотелось писать каждый раз обращение "speech_recognition.Microphone()" когда можно кратко и красиво написать "sr.Microphone()".

Итак, начнём с главной функции в которой нас будут слушать.

def command():
	r = sr.Recognizer()

	with sr.Microphone() as source:
		print("Говорите")
		r.pause_threshold = 1
		r.adjust_for_ambient_noise(source, duration=1)
		audio = r.listen(source) 

Что же тут происходит?

Всё довольно таки просто, сначала мы инициализируем объект "r" как sr.Recognizer() а затем с помощью цикла with мы подключаем микрофон.

После print("Говорите") мы записываем звук с микрофона в течении секунды, но если говорим то дольше. Затем мы убираем посторонние шумы, то есть тот кто ближе к микрофону (точнее громче, кхе-кхе) того наша программа и будет слушать. Затем мы создаем переменную audio где будем слушать микрофон который открыли как source.

	try:
		task = r.recognize_google(audio, language="ru-RU").lower()
		print("Вы сказали " + task)
	except:
		task = command()
	return task

Далее в try except мы заключаем код, ибо ошибок может быть очень и очень много (Добавлял эту либу к одному из своих старых проектов) . Задаем переменную task откуда будем брать то что нам отдаст гугл С: Внимательно посмотрите, мы выбираем русский язык, если же вы хотите тренировать свой английский то такой необязательный аргумент как language можно убрать. И да, желательно, что бы потом не мучатся, сделаем возврат слова в маленьких буквах.

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

def makeSomething(task):
	print(task)
	if "сайт" in task:
		print("hello")
	elif "питон" in task:
		print("Python <3")
	else:
		print("Иех, скукота")

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

Для тестов я сначала выводил то что сказал. Итак, тут мы видим что если я говорю "сайт" то он будем выводить мне "hello"

Вы же можете добавить условий и функций сколько хотите для вашего удобства.

Что бы вас постоянно слушали - создаем цикл:

while True:
	makeSomething(command())

Минутка скриншотов :)

Не знаю почему там катер, я говорил кодер, но да ладно, гугл считает что я катер :D

теперь я приведу полный листинг программы а ниже функции из своего старого проекта в виде скриншотов. Кому будет интересно - можете глянуть С:

import speech_recognition as sr


def command():
	r = sr.Recognizer()

	with sr.Microphone() as source:
		print("Говорите")
		r.pause_threshold = 1
		r.adjust_for_ambient_noise(source, duration=1)
		audio = r.listen(source) 

	try:
		task = r.recognize_google(audio, language="ru-RU").lower()
		print("Вы сказали " + task)
	except:
		task = command()
	return task


def makeSomething(task):
	print(task)
	if "сайт" in task:
		print("hello")
	elif "питон" in task:
		print("Python <3")
	else:
		print("Иех, скукота")


while True:
	makeSomething(command())
Я не пишу идеальный код, я пишу лишь костыли. Вы всегда можете улучшить мой код.

Поисковики. Открывает вкладку и ищет в гугле то что я скажу. Например я говорю "ИМЯ_БОТА найди окна" и он вбивает в гугл "окна". Тоже самое с ютубом.

Здесь я парсил погоду после чего озвучивал её с помощью другой функции.

И кое что интересное, тут я создал разговорную функцию что бы бот мог поговорить со мной. Но не просто по шаблонам а подключил его к сервису DialogFlow (Dialogflow является разработчиком Google технологий взаимодействия человека с компьютером, основанных на разговорах на естественном языке.) что бы он со временем мог обучаться и разговаривать со мной. Но проект я забросил по некоторым причинам и вот хочу поделиться им с вами С: