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

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


Python и 1000 программ

Сегодня мы покажем как создать своего голосового помощника как у железного человека при помощи 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()


Здесь бот озвучивает все ответы




Пожалуй на сегодня все. В следующей части будет рассказано как сделать "умного" бота, умеющий не только отвечать, но и делать!

Report Page