Для создания голосового помощника не нужно обладать большими знаниями в программировании, главное понимать каким функционалом он должен владеть. Многие компании создают их на первой линии связи с клиентом для удобства, оптимизации рабочих процессов и наилучшей классификации звонков.
18 293 просмотров
В данной статье представлена программа, которая может стать основой для Вашего собственного чат-бота, а если точнее – голосового помощника для распознавания голоса и последующего выполнения команд. С ее помощью мы сможем понять принцип работы наиболее часто встречаемых голосовых помощников.
Для начала объявим необходимые нам библиотеки:
#Необходимые библиотеки 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
Также не забудем вести лог файл, который понадобится нам, если же мы все-таки решим улучшить бота для работы с нейронной сетью. Многие компании использую нейронную сеть в своих голосовых помощниках для понимания эмоций клиента и соответствующего реагирования на них. Также стоит не забывать, что с помощью анализа логов, мы сможем понять слабые места алгоритма бота и улучшить взаимодействие с клиентами.
Я сделал КЕШУ 2.0 | Голосовой ассистент на Python
#Создаем лог 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
Голосовой ассистент на Python | Голосовое управление компьютером | Распознавание речи Python
Что может сделать наш помощник кроме того, чтобы нас слушать? Все ограничено нашей фантазией! Рассмотрим несколько интересный примеров.
Начнем с простого, пусть при команде открыть сайт – он откроет сайт (не ожидали?).
#Тут расписаны действия, которые будут выполнятся при наличии некоторых словосочетаний 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)
Как создать бота в стиле Alexa и Siri с помощью Python и OpenAI
Создать программу искусственного интеллекта, которая воспринимает человеческую речь и отвечает на вопросы, не так сложно, как кажется. Такое чудо можно сотворить за один день с помощью нескольких пакетов Python и API.
Вот ответы бота на некоторые вопросы.
Я: Какова численность населения Бразилии?
Бот: По оценкам, население Бразилии составляет более 209 миллионов человек.
Бот: Большинство видов мороженого на вкус сладкие и сливочные.
Бот: Чтобы использовать палочки для еды, нужно держать по одной в каждой руке. Поместите палочку для еды в доминирующую руку между большим и указательным пальцами и удерживайте ее средним пальцем. Поместите палочку для еды в недоминирующую руку между большим и указательным пальцами и удерживайте ее безымянным пальцем и мизинцем. Чтобы взять еду, используйте палочку для еды в доминирующей руке, чтобы удерживать еду, а затем используйте эту палочку для еды.
Конечно, это не самые содержательные ответы. А концовка ответа про палочки для еды и вовсе довольно странная. Однако тот факт, что подобное приложение может интерпретировать речь и отвечать на вопросы, какими бы ограниченными ни казались ответы, довольно поразителен. К тому же мы можем посмотреть, как устроен виртуальный ассистент и поэкспериментировать с ним.
Что делает эта программа
- Файл запускается через командную строку, когда пользователь готов задать вопрос.
- PyAudio позволяет микрофону компьютера улавливать речевые данные.
- Аудиоданные хранятся в переменной под названием stream , затем кодируются и преобразуются в JSON-данные.
- JSON-данные поступают в API AssemblyAI для преобразования в текст, после чего текстовые данные отправляются обратно.
- Текстовые данные поступают в API OpenAI, а затем направляются в движок text-davinci-002 для обработки.
- Ответ на вопрос извлекается и отображается на консоли под заданным вопросом.
API и высокоуровневый дизайн
В этом руководстве используются два базовых API:
- AssemblyAI для преобразования аудио в текст.
- OpenAI для интерпретации вопроса и получения ответа.
Дизайн (высокий уровень)
Этот проект содержит два файла: main и openai_helper .
Скрипт main используется в основном для API-соединения “голос-текст”. Он включает в себя настройку сервера WebSockets, заполнение всех параметров, необходимых для PyAudio, и создание асинхронных функций, необходимых для одновременной отправки и получения речевых данных между приложением и сервером AssemblyAI.
openai_helper — файл с коротким именем, используемый исключительно для подключения к OpenAI-движку text-davinci-002 . Это соединение обеспечивает получение ответов на вопросы.
Разбор кода
main. py
Сначала импортируем все библиотеки, которые будут использованы приложением. Для некоторых из них может потребоваться Pip-установка (в зависимости от того, использовали ли вы их). Обратите внимание на комментарии к коду ниже:
#PyAudio предоставляет привязку к Python для PortAudio v19, кроссплатформенной библиотеки ввода-вывода аудио. Позволяет микрофону компьютера взаимодействовать с Python import pyaudio #Библиотека Python для создания сервера Websocket — двустороннего интерактивного сеанса связи между браузером пользователя и сервером import websockets #asyncio — это библиотека для написания параллельного кода с использованием синтаксиса async/await import asyncio #Этот модуль предоставляет функции для кодирования двоичных данных в печатаемые символы ASCII и декодирования таких кодировок обратно в двоичные данные import base64 #В Python есть встроенный пакет json, который можно использовать для работы с данными JSON import json #»Подтягивание» функции из другого файла from openai_helper import ask_computer
Теперь устанавливаем параметры PyAudio. Эти параметры являются настройками по умолчанию, найденными в интернете. Вы можете поэкспериментировать с ними по мере необходимости, но мне параметры по умолчанию подошли отлично. Устанавливаем переменную stream в качестве начального контейнера для аудиоданных, а затем выводим параметры устройства ввода по умолчанию в виде словаря. Ключи словаря отражают поля данных в структуре PortAudio . Вот код:
#Настройка параметров микрофона #Сколько байт данных приходится на каждый обработанный фрагмент звука FRAMES_PER_BUFFER = 3200 #Битовый целочисленный формат аудиовхода/выхода порта по умолчанию FORMAT = pyaudio.paInt16 #Моноформатный канал (то есть нам нужен только входной аудиосигнал, поступающий с одного направления) CHANNELS = 1 #Желаемая частота в Гц входящего аудиосигнала RATE = 16000 p = pyaudio.PyAudio() #Начинает запись, создает переменную stream, присваивает параметры stream = p.open( format=FORMAT, channels=CHANNELS, rate=RATE, input=True, frames_per_buffer=FRAMES_PER_BUFFER ) print(p.get_default_input_device_info())
Далее создаем несколько асинхронных функций для отправки и получения данных, необходимых для преобразования голосовых вопросов в текст. Эти функции выполняются параллельно, что позволяет преобразовывать речевые данные в формат base64, конвертировать их в JSON, отправлять на сервер через API, а затем получать обратно в читаемом формате. Сервер WebSockets также является важной частью приведенного ниже скрипта, поскольку именно он делает прямой поток бесшовным.
#Необходимая нам конечная точка AssemblyAI
URL = «wss://api.assemblyai.com/v2/realtime/ws?sample_rate=16000»
auth_key = «enter key here»
#Создание асинхронной функции, чтобы она могла продолжать работать и отправлять поток речевых данных в API до тех пор, пока это необходимо
async def send_receive():
print(f’Connecting websocket to url $’)
async with websockets.connect(
URL,
extra_headers=((«Authorization», auth_key),),
ping_interval=5,
ping_timeout=20
) as _ws:
await asyncio.sleep(0.1)
print(«Receiving SessionBegins . «)
session_begins = await _ws.recv()
print(session_begins)
print(«Sending messages . «)
async def send():
while True:
try:
data = stream.read(FRAMES_PER_BUFFER, exception_on_overflow=False)
data = base64.b64encode(data).decode(«utf-8»)
json_data = json.dumps()
await _ws.send(json_data)
except websockets.exceptions.ConnectionClosedError as e:
print(e)
assert e.code == 4008
break
except Exception as e:
assert False, «Not a websocket 4008 error»
await asyncio.sleep(0.01)
return True
async def receive():
while True:
try:
result_str = await _ws.recv()
result = json.loads(result_str)
prompt = result[‘text’]
if prompt and result[‘message_type’] == ‘FinalTranscript’:
print(«Me:», prompt)
answer = ask_computer(prompt)
print(«Bot», answer)
except websockets.exceptions.ConnectionClosedError as e:
print(e)
assert e.code == 4008
break
except Exception as e:
assert False, «Not a websocket 4008 error»
send_result, receive_result = await asyncio.gather(send(), receive())
asyncio.run(send_receive())
Теперь у нас есть простое API-соединение с OpenAI. Если вы посмотрите на строку 44 приведенного выше кода ( main3.py ), то увидите, что мы извлекаем функцию ask_computer из этого другого файла и используем ее результаты в качестве ответов на вопросы.
Это отличный проект для всех, кто не прочь взять на вооружение ту самую технологию, благодаря которой функционируют Siri и Alexa. Его реализация не требует большого опыта в программировании, потому что для обработки данных используется API.
Весь код хранится в этом репозитории.
- Решение крупномасштабных задач машинного обучения на Python
- Введение в алгоритмы машинного обучения: линейная регрессия
- Классификация текстов отзывов о фильмах с помощью Scikit-learn
Читайте нас в Telegram, VK и Дзен
Источник: nuancesprog.ru
Путеводитель по вашему собственному ИИ. Виртуальный помощник на Python.
Вы когда-нибудь задумывались, как было бы здорово иметь собственный ИИ. помощник? Представьте, насколько проще было бы отправлять электронные письма, не вводя ни единого слова, выполнять поиск в Википедии, фактически не открывая веб-браузеры, и выполнять множество других повседневных задач с помощью одной голосовой команды.
В этом руководстве вы узнаете, как кодировать и создавать свой собственный A.I. голосовой помощник на Python.
Что может этот А. помощник делать для ВАС?
- Он может отправлять вам электронные письма.
- Он может воспроизводить музыку для вас.
- Он может выполнять поиск в Википедии за вас.
- Он может открывать веб-сайты, такие как Google, Youtube и т. Д., В веб-браузере.
- Он может открыть ваш редактор кода или IDE с помощью одной голосовой команды.
Хватит разговоров! Давайте приступим к созданию нашего собственного помощника по искусственному интеллекту.
Настройка среды для кода:
Я использовал Pycharm, чтобы закодировать это. Не стесняйтесь использовать любую другую удобную среду IDE и начинать новый проект.
P.S: Не забудьте заранее выбрать имя для своего голосового помощника: P
Определение функции речи:
Первое и самое главное для искусственного интеллекта. помощник должен говорить. Чтобы заставить нашего бота говорить, мы закодируем функцию speak (). Эта функция принимает звук в качестве аргумента, а затем произносит его.
def speak(audio): pass #For now. We will write the conditions later.
Теперь нам понадобится звук. Итак, мы собираемся установить модуль с именем pyttsx3.
Что такое pyttsx3?
- Библиотека Python, которая поможет нам преобразовать текст в речь. Короче говоря, это библиотека преобразования текста в речь.
- Он работает в автономном режиме и совместим с Python 2, а также с Python 3.
Установка:
pip install pyttsx3
После успешной установки pyttsx3 импортируйте этот модуль в свою программу.
Использование:
import pyttsx3 engine = pyttsx3.init(‘sapi5’) voices = engine.getProperty(‘voices’) #getting details of the current voice engine.setProperty(‘voice’, voice[0].id)
Что такое sapi5?
- Речевой API, разработанный Microsoft.
- Помогает в синтезе и распознавании голоса
Что такое VoiceId?
- Голосовой идентификатор помогает нам выбирать разные голоса.
- voice [0] .id = Мужской голос
- voice [1] .id = Женский голос
Написание нашей функции speak ():
def speak(audio): engine.say(audio) engine.runAndWait() #Without this command, speech will not be audible to us.
Создание нашей основной функции:
Теперь мы создадим функцию main (), а внутри этой функции main () вызовем нашу функцию Speech.
if __name__==»__main__» : speak(«Hello World! Hope you all are doing well.»)
Все, что вы напишете в этой функции speak (), будет преобразовано в речь. Поздравляю! Таким образом, наш A.I. имеет свой голос, и он готов говорить.
Кодирование функции wishme ():
Теперь мы собираемся создать функцию wishme (), которая заставит наш A.I. пожелайте или поприветствуйте нас в зависимости от времени на компьютере.
Чтобы предоставить текущее время A.I., нам нужно импортировать модуль с именем datetime. Импортируйте этот модуль в свою программу:
import datetime
Теперь приступим к определению нашей функции wishme ():
def wishme(): hour = int(datetime.datetime.now().hour)
Здесь мы сохранили целочисленное значение текущего часа или времени в переменной с именем hour. Теперь мы будем использовать это значение часа внутри цикла if-else.
def wishMe(): hour = int(datetime.datetime.now().hour) if hour>=0 and hour=12 and hour
Определение функции takeCommand ():
Следующая важная вещь для нашего A.I. Помощник заключается в том, что он должен иметь возможность принимать команды с помощью микрофона нашей системы. Итак, теперь мы закодируем функцию takeCommand ().
С помощью функции takeCommand () наш A.I. Ассистент сможет вернуть строковый вывод, взяв у нас микрофонный вход.
Перед определением функции takeCommand () нам необходимо установить модуль под названием speechRecognition. Установите этот модуль:
pip install speechRecognition
После успешной установки этого модуля импортируйте этот модуль в программу, написав оператор импорта.
import speechRecognition as sr
Приступим к написанию нашей функции takeCommand ():
def takeCommand(): #It takes microphone input from the user and returns string output r = sr.Recognizer() with sr.Microphone() as source: print(«Listening. «) r.pause_threshold = 1 audio = r.listen(source)