Создаем свою Алису при помощи Python

Сегодня мы покажем как создать своего голосового помощника как у железного человека при помощи Python 3.
Реализация
1. Постоянно прослушивать микрофон
2. Уметь распознавать слова в гугле
3. Выполнять или отвечать на команду
Если вы параноик, то после 1 пункта можете смело закрывать данную статью!
Синтез речи
В начале установим русские голосва в систему windows. Я оставлю ссылку на скачивание, перейдя по ней зайдите в раздел SAPI 5 -> Russian. Выбираем понравившийся голос, устанавливаем, и идем дальше.
Устанавливаем библиотеку 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()
Распознавание речи
Множество инструментов для распознавания речи увы, но платные. Но существует бесплатная библиотека speech_recognition.
pip install SpeechRecognition
Для работы с микрофоном нам понадобится библиотека PyAudio
pip install PyAudio
Некоторые пользователи испытывают проблему с ее установкой, поэтому по этой ссылке вы сможете скачать нужную вам версию. Далее введите в консоль:
pip instal название скачанного файла
Опять проверяем установку на тестовой программе. Только исправьте "device_incex=1" на свое значение индекса микрофона. Узнать индекс своего микрофона можно так:
import speech_recognition as sr
for index, name in enumerate(sr.Microphone.list_microphone_names()):
print("Microphone with name \"{1}\" found for `Microphone(device_index={0})`".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'Вы сказали: {query.lower()}')
except:
print('Error')
while True:
record_volume()
Для управления ботом на 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'Вы сказали: {query.lower()}')
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()
Здесь бот озвучивает все ответы
Пожалуй на сегодня все. В следующей части будет рассказано как сделать "умного" бота, умеющий не только отвечать, но и делать!