В этой статье я покажу вам, как создать собственного виртуального помощника с помощью языка программирования Python! Виртуальный помощник - это приложение, которое может понимать голосовые команды и выполнять задачи за пользователя. Помощник Google и Amazon Alexa - хорошие примеры виртуальных помощников.

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

Начать программирование:

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

Необходимо выполнить следующие команды:

  1. Скажите пользователю случайное приветствие, если он использовал приветственное слово.
  2. Получить дату для пользователя
  3. Получите время для пользователя
  4. Получение информации о человеке для пользователя
    (ПРИМЕЧАНИЕ: для этого мы можем использовать Википедию)

Например, пользователь может сказать «привет, компьютер, который час?» Или «хорошо, компьютер, какая сегодня дата?», И виртуальный помощник ответит соответствующим образом.

Теперь давайте напишем в комментариях краткое описание того, что будет делать эта программа.

# Description: This is a virtual assistant program that will greet 
#              you with a random greeting, get the date, time, and
#              information on a person.

Нам нужно установить несколько пакетов pyadio SpeechRecognition gTTS и wikipedia.

pip install pyaudio
pip install SpeechRecognition 
pip install gTTS
pip install wikipedia

Импортируйте библиотеки и пакеты

Затем импортируйте некоторые библиотеки, которые будут использоваться в этой программе. Мы будем использовать библиотеку warnings, чтобы игнорировать предупреждения, которые мы получаем с помощью этой программы. Библиотека speech_recognition будет использоваться для распознавания речи :).
Библиотека os позволит нам взаимодействовать с операционной системой. Библиотека gtts поможет нам преобразовать текст в речь. Библиотека wikipedia позволит нам получать информацию о человеке из Википедии. Библиотека datetime позволит нам получить текущую дату и время. Библиотека calendar позволит нам получить день недели, а библиотека random будет использоваться для рандомизации.

# Import the libraries
import speech_recognition as sr
import os
from gtts import gTTS
import datetime
import warnings
import calendar
import random
import wikipedia

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

# Ignore any warning messages
warnings.filterwarnings('ignore')

Создавайте полезные функции

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

Сначала нам нужна функция, которая может принимать звук (голосовую команду) и распознавать речь, а затем возвращать эту речь в виде строки (текста). Назовем эту функцию recordAudio ().

# Record audio and return it as a string
def recordAudio():    
    # Record the audio
    r = sr.Recognizer()
    with sr.Microphone() as source:  
       print('Say something!')
       audio = r.listen(source)
    
    # Speech recognition using Google's Speech Recognition
    data = ''
    try:
        data = r.recognize_google(audio)
        print('You said: ' + data)
    except sr.UnknownValueError:
        print('Google Speech Recognition could not understand')
    except sr.RequestError as e:
        print('Request error from Google Speech Recognition')
     return data

Идеально ! Теперь у нас есть функция для записи звука. Давайте создадим функцию для программы, которая будет отвечать пользователю звуком, и назовем ее assistantResponse (). Функция принимает строку (текст) и преобразует ее в аудио. Я также буду использовать эту функцию для вывода текста на экран в целях тестирования.

# Function to get the virtual assistant response
def assistantResponse(text):
    print(text)
    # Convert the text to speech
    myobj = gTTS(text=text, lang='en', slow=False)
    
    # Save the converted audio to a file    
    myobj.save('assistant_response.mp3')
    # Play the converted file
    os.system('start assistant_response.mp3')

Затем мы создадим функцию, которая будет принимать некоторый текст и проверять, было ли в этом тексте задано пробуждающее слово. Для этой программы я создал два слова пробуждения: «хорошо, компьютер» и «, привет, компьютер», похожие на слова пробуждения помощника Google «Привет, Google» и «окей, Google». Если в тексте было обнаружено пробуждающее слово, функция вернет True, в противном случае она вернет False.

# A function to check for wake word(s)
def wakeWord(text):
    WAKE_WORDS = ['hey computer', 'okay computer'] 
    text = text.lower()  # Convert the text to all lower case words
  # Check to see if the users command/text contains a wake word    
    for phrase in WAKE_WORDS:
        if phrase in text:
            return True
  # If the wake word was not found return false
    return False

Теперь я создам функцию для возврата сегодняшней даты в виде строки. Например, он вернет «Сегодня понедельник, 21 октября», если сегодня действительно был понедельник 21 октября. Назовем эту функцию getDate ().

def getDate():
    
    now = datetime.datetime.now()
    my_date = datetime.datetime.today()
    weekday = calendar.day_name[my_date.weekday()]# e.g. Monday
    monthNum = now.month
    dayNum = now.day
    month_names = ['January', 'February', 'March', 'April', 'May',
       'June', 'July', 'August', 'September', 'October', 'November',   
       'December']
    ordinalNumbers = ['1st', '2nd', '3rd', '4th', '5th', '6th', 
                      '7th', '8th', '9th', '10th', '11th', '12th',                      
                      '13th', '14th', '15th', '16th', '17th', 
                      '18th', '19th', '20th', '21st', '22nd', 
                      '23rd', '24th', '25th', '26th', '27th', 
                      '28th', '29th', '30th', '31st']
   
return 'Today is ' + weekday + ' ' + month_names[monthNum - 1] + ' the ' + ordinalNumbers[dayNum - 1] + '.'

Затем мы создадим функцию, которая принимает текст и возвращает случайный ответ приветствия в виде текста для пользователя, если пользователь сказал ввод приветствия, например, «привет» или «привет», функция вернет какое-то случайное приветствие, например «привет» '. Эта функция будет называться приветствие ().

# Function to return a random greeting response
def greeting(text):
    # Greeting Inputs
    GREETING_INPUTS = ['hi', 'hey', 'hola', 'greetings', 'wassup', 'hello']
     # Greeting Response back to the user
    GREETING_RESPONSES = ['howdy', 'whats good', 'hello', 'hey there']
     # If the users input is a greeting, then return random response
    for word in text.split():
        if word.lower() in GREETING_INPUTS:
            return random.choice(GREETING_RESPONSES) + '.'
    # If no greeting was detected then return an empty string
    return ''

И последнее, но не менее важное: мы создадим функцию для получения имени и фамилии человека из текста после определения ключевой команды «who is». Как только мы обнаружим слово «who», за которым следует слово «is», мы вернем следующие два слова как одну строку (следующие два слова должны быть именем человека, за которым следует его фамилия).

Например, если пользователь спрашивает «Кто такой Леброн Джеймс?», Функция примет этот текст и просто вернет «Леброн Джеймс». Мы будем использовать эту функцию позже, чтобы получить краткое изложение о человеке из двух предложений из Википедии. Эта функция будет называться getPerson ().

# Function to get a person first and last name
def getPerson(text):
 wordList = text.split()# Split the text into a list of words     
 for i in range(0, len(wordList)):
   if i + 3 <= len(wordList) - 1 and wordList[i].lower() == 'who' and wordList[i + 1].lower() == 'is':
            return wordList[i + 2] + ' ' + wordList[i + 3]

Создать основную программу

Все самые популярные виртуальные помощники (Google Assistant, Amazon Alexa и Apple Siri) постоянно слушают ваш разговор и ждут, чтобы выполнить команды только после того, как услышат слово пробуждения, такое как «Окей, Google», «Алекса» или «Привет, Siri».

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

После произнесения пробуждающего слова мы проверим, произнес ли пользователь приветствие, «дату», «время» или «кто это», и попросим компьютер ответить соответствующим образом звуком.

while True:
    # Record the audio
    text = recordAudio()
    response = '' #Empty response string
     
    # Checking for the wake word/phrase
    if (wakeWord(text) == True):
         # Check for greetings by the user
         response = response + greeting(text)
         # Check to see if the user said date
        if ('date' in text):
            get_date = getDate()
            response = response + ' ' + get_date
         # Check to see if the user said time
        if('time' in text):
            now = datetime.datetime.now()
            meridiem = ''
            if now.hour >= 12:
                meridiem = 'p.m' #Post Meridiem (PM)
                hour = now.hour - 12
            else:
                meridiem = 'a.m'#Ante Meridiem (AM)
                hour = now.hour
           # Convert minute into a proper string
              if now.minute < 10:
                minute = '0'+str(now.minute)
              else:
                minute = str(now.minute)
             response = response + ' '+ 'It is '+ str(hour)+ ':'+minute+' '+meridiem+' .'
                
        # Check to see if the user said 'who is'
        if ('who is' in text):
            person = getPerson(text)
            wiki = wikipedia.summary(person, sentences=2)            
            response = response + ' ' + wiki
       
       # Assistant Audio Response
       assistantResponse(response)

Вот и все, мы создали эту программу!

Если вам также интересно узнать больше о машинном обучении, чтобы сразу приступить к решению проблем и примерам, я настоятельно рекомендую вам ознакомиться с Практическое машинное обучение с помощью Scikit-Learn и TensorFlow: концепции, инструменты и методы для создания интеллектуальных систем . Это отличная книга, которая поможет новичкам научиться писать программы машинного обучения и понять концепции машинного обучения.

Практическое машинное обучение с помощью Scikit-Learn и TensorFlow: концепции, инструменты и методы для создания интеллектуальных систем

Спасибо, что прочитали эту статью. Надеюсь, она будет вам полезна! Если вам понравилась эта статья и вы нашли ее полезной, пожалуйста, оставьте несколько аплодисментов, чтобы выразить свою признательность. Продолжайте обучение, и если вам нравится машинное обучение, математика, информатика, программирование или анализ алгоритмов, посетите и подпишитесь на мои каналы YouTube (randerson112358 и compsci112358).

Источники:

[1] Начало работы с Pythons Wikipedia API
[2] Создайте своего первого голосового помощника
[3] Распознавание речи Python
[4] Распознавание речи
[5] Персональный помощник Джарвис на Python