Простейший голосовой помощник на Python
Для создания голосового помощника не нужно обладать большими знаниями в программировании, главное понимать каким функционалом он должен владеть. Многие компании создают их на первой линии связи с клиентом для удобства, оптимизации рабочих процессов и наилучшей классификации звонков. В данной статье представлена программа, которая может стать основой для Вашего собственного чат-бота, а если точнее — голосового помощника для распознавания голоса и последующего выполнения команд. С ее помощью мы сможем понять принцип работы наиболее часто встречаемых голосовых помощников.
Для начала объявим необходимые нам библиотеки:
import speech_recognition as sr
import os
import sys
import webbrowser
import pyttsx3 as p
from datetime import datetime
import time
import datetime
import random
Также не забудем вести лог файл, который понадобится нам, если же мы все-таки решим улучшить бота для работы с нейронной сетью. Многие компании использую нейронную сеть в своих голосовых помощниках для понимания эмоций клиента и соответствующего реагирования на них.
Также стоит не забывать, что с помощью анализа логов, мы сможем понять слабые места алгоритма бота и улучшить взаимодействие с клиентами.
#Создаем лог
chat_log = [['SESSION_ID', 'DATE', 'AUTHOR', 'TEXT', 'AUDIO_NUM']]
#Узнаем номер сессии
i = 1
exit = 0
while exit == 0:
session_id = str(i)
if session_id not in os.listdir():
os.mkdir(session_id)
exit = 1
else:
i = i + 1
#Первое сообщение пишет bot
author = 'Bot'
text = 'Привет! Чем я могу вам помочь?'
В лог файл мы записываем время сообщения, автора (бот или пользователь) и собственно сам сказанный текст.
#Добавляем данные к логу с помощью этой процедуры
def log_me(author, text, audio):
now = datetime.datetime.now()
i = 1
exit = 0
while exit == 0:
audio_num = str(i)+'.wav'
if audio_num not in os.listdir(session_id):
exit = 1
else:
i = i + 1
os.chdir(session_id)
with open(audio_num , "wb") as file:
file.write(audio.get_wav_data())
chat_log.append([now.strftime("%Y-%m-%d %H:%M:%S"), author, text, audio_num])
Выводим первое сообщение за авторством бота: Привет! Чем я могу вам помочь?
# Выводим первое сообщение на экран и записываем в лог
print("Bot: "+ text)
log_me(author, text, audio)
А с помощью такой процедуры в Jupyter Notebook мы можем озвучить через устройство воспроизведения, настроенное по умолчанию, сказанные слова:
#Произношение words
def talk(words):
engine.say(words)
engine.runAndWait()
Как озвучивать текст мы рассмотрели выше, но как же мы свой голос сможем превратить в текст? Тут нам поможет распознавание речи от Google и некоторые манипуляции с микрофоном.
#Настройка микрофона
def command():
rec = sr.Recognizer()
with sr.Microphone() as source:
#Бот ожидает нашего голоса
print('Bot: ...')
#Небольшая задержка в записи
rec.pause_threshold = 1
#Удаление фонового шума с записи
rec.adjust_for_ambient_noise(source, duration=1)
audio = rec.listen(source)
try:
#Распознание теста с помощью сервиса GOOGLE
text = rec.recognize_google(audio, language="ru-RU").lower()
#Вывод сказанного текста на экран
print('Вы: ' + text[0].upper() + text[1:])
log_me('User', text, audio)
#Если не распознался тест из аудио
except sr.UnknownValueError:
text = 'Не понимаю. Повторите.'
print('Bot: ' + text)
talk(text)
#Начинаем заново слушать
text = command()
log_me('Bot', text, , Null)
return text
Что может сделать наш помощник кроме того, чтобы нас слушать? Все ограничено нашей фантазией! Рассмотрим несколько интересный примеров.
Начнем с простого, пусть при команде открыть сайт — он откроет сайт (не ожидали?).
#Тут расписаны действия, которые будут выполнятся при наличии некоторых словосочетаний
def makeSomething(text):
if 'открой сайт' in text:
print('Bot: Открываю сайт NewTechAudit.')
talk('Открываю сайт NewTechAudit.')
log_me('Bot','Открываю сайт NewTechAudit.', Null)
webbrowser.open('https://newtechaudit.ru/')
Иногда полезно послушать свои слова, да чужими устами. Пусть бот еще умеет и повторять за нами:
#Повторение фразы пользователя
elif 'произнеси' in text or 'скажи' in text or 'повтори' in text:
print('Bot: ' + text[10].upper() + text[11:])
talk(text[10:])
log_me('Bot', text[10].upper() + text[11:] , Null)
Пусть еще и собеседником будет, но начнем мы пока только со знакомства:
#Ответ на вопрос
elif 'своё имя' in text or 'как тебя зовут' in text or 'назови себя' in text:
print('Bot: Меня зовут Bot.')
talk('Меня зовут Bot')
log_me('Bot', 'Меня зовут Bot', Null)
Мы также можем попросить голосового помощника назвать случайное число в выбранных нами пределах в формате: Назови случайное число от (1ое число) до (2ое число).
#Определение случайного числа
elif 'случайное число' in text:
ot=text.find('от')
do=text.find('до')
f_num=int(text[ot+3:do-1])
l_num=int(text[do+3:])
r=str(random.randint(f_num, l_num))
print('Bot: ' + r)
talk(r)
log_me('Bot', r, Null)
Для того, чтобы завершить программу, достаточно только попрощаться с ботом:
#Завершение программы
elif 'пока' in text or 'до свидания' in text:
print('Bot: До свидания!')
talk('До свидания')
log_me('Bot', 'Конец сессии', Null)
os.chdir(session_id)
log_file = open( session_id + ".txt", "w")
for row in chat_log:
np.savetxt(log_file, row)
log_file.close()
sys.exit()
А чтобы все это работало беспрерывно, мы создаем бесконечный цикл.
#Бесконечный цикл для работы
while True:
makeSomething(command())
Проведем тестовый диалог:
В созданной папке-сессии хранятся все файлы-аудиозаписи нашего голоса и текстовый лог-файл:
В текстовый лог-файл записывается:
В данной статье мы рассмотрели простейшего голосового бота и основной полезный функционал для дальнейшей работы бота с нейронной сетью. Для анализа качества оказанной помощи и дальнейшей работы по улучшению мы сможем проверять лог файл.
Этот бот может стать основой для вашего собственного Джарвиса!