Рубрики
Без рубрики

Как построить простой виртуальный помощник с помощью Python

Узнайте, как построить простой виртуальный помощник в Python с использованием распознавания речи Google и текст IBM Watson в речь.

Автор оригинала: Abel Joshua.

Виртуальные помощники повсюду от Alexa, в Google домой, до Apple Siri. Они помогают нам проверить погоду, делать телефонные звонки, контролировать термостат, дверные замки и другие умные домашние устройства E.T.c

В этой статье я буду ходить за вами, как создать простой виртуальный помощник, используя распознавание Google Reading и текст IBM Watson в речь в Python. Эта статья предполагает, что у вас есть базовое понимание следующих предпосылок:

Функции Классы Запросить библиотеку

Что мы будем строить

В этой статье мы будем строить простой виртуальный помощник по имени CALI.

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

CALI состоит из следующих файлов исходного кода:

Util.py: Использует модуль WebBrowser Python для открытия нового вкладки браузера.

Timeservice.py: Проверяет и возвращайте местное компьютерное время и местное время в других городах.

Weather.py: Использует API OpenWeatherMap для извлечения погодных данных для любого города.

Speaker.py: Использует текст IBM Watson Text в речевой библиотеку для синтеза текста к речи, сохранить его в качестве аудиофайла и воспроизводить его с помощью игрока команды MPG321.

Main.py: Основная программный файл, получает вход с использованием распознавания речи Google и отображает полученный текст к действию.

Чтобы следовать вместе с этим постом блога, идите вперед и клонировать Cali из GitHub в https://github.com/iamabeljoshua/cali/tree/online-tts-only Или загрузить нагрузку кода, используя эту ссылку: https://github.com/iamabeljoshua/cali/archive/online-tts-only.zip.

Для этого учебника мы будем использовать онлайн-филиал только на Github.

После того, как вы загрузили или клонированные CALI из GitHub, вы должны следовать за шагами в Readme.md Файл для загрузки и установки зависимостей CALI.

Кодирование Cali.

Исходный код CALI довольно прямой и не так сложно понять. В этом разделе я пойду на вас, как работает весь исходный код Cali.

Util.py

ITIL.PY File – это самый простой из всех файлов исходных кодов CALI, он содержит код, который мы будем использовать, чтобы открыть новую вкладку браузера. Он использует модуль WebBrowser Python для этого.

Если вы не знакомы с WebBrowser в Python, посетите это ссылка Чтобы узнать больше о том, как это работает.

import webbrowser
def open_page(url):
    webbrowser.open_new_tab(url)

Timeservice.py

Timeservice.py Файл отвечает за проверку местных системных и местных времен в других городах. Он использует модуль DateTime Python, чтобы проверить и вернуть текущее системное время.

from datetime import datetime

class TimeService(object):

    def __init__(self):
        pass

    def get_time(self, city_name):
        #Todo implement to fetch local time in any city, using city name
        #As an exercise, you can implement this function.
        pass 

    def get_local_time(self):

        current_time = datetime.now().strftime("%I:%M %p")

        output = "Your current local time is " + current_time

        return output

dateTime.now () возвращает новый объект dateTime для текущей системной даты и времени. Мы просто использовали STRFTIME («% I:% m% P»), чтобы создать отформатированную строку из объекта TATETIME.

Возвращение «% I» возвращает часы с начала дня в 12-часовом формате часов.

«% M» возвращает счетную минуту в течение текущего часа и возвращается «% p» AM или PM в зависимости от текущего времени.

Чтобы узнать больше о DateTime в Python, проверить это ссылка на сайт

Weather.py

Файл Weather.py использует API OpenWeathermap, чтобы получить текущие данные о погоде в городе.

Этот файл использует библиотеку запросов Python для отправки получения запроса http://api.openweathermap.org/data/2.5/weather Отказ Мы отправим идентификатор приложения, который мы получили от регистрации в OpenWeatherMap.org и название города как часть параметра запроса.

Если вы не знаете, как работает HTTP-запросы и библиотека запросов Python. Проверьте это Статья и И это тоже

import requests

import json

class WeatherService(object):

    API_URL = "http://api.openweathermap.org/data/2.5/weather?q={}&APPID={}&units=metric";

    API_KEY = "3b31a7e394e41c3a30759dfde1a3383e";

    def __init__(self):
        pass


    def get_weather_data(self, city_name):

        r = requests.get(WeatherService.API_URL.format(city_name, WeatherService.API_KEY))

        weather_data = (r.json())

        temp = self._extract_temp(weather_data)

        description = self._extract_desc(weather_data)

        return "Currently, in {}, its {} degrees with {}".format(city_name, temp, description)


    def _extract_temp(self, weatherdata):

        temp = weatherdata['main']['temp']

        return temp


    def _extract_desc(self, weatherdata):

        return weatherdata['weather'][0]['description']
        

Функция Get_Weather_Data получает City_Name в качестве аргумента и использует название города для получения погодных данных. Функция отправляет запрос на получение библиотеки запросов и декодирует ответ запроса как JSON, используя .json ()

.Json () считывает содержимое ответа как JSON и преобразует его в список Python и объект словаря в зависимости от содержимого ответа.

Мы можем просто использовать индексирование (список и дикт индекса) для получения части ответа, которую мы заботимся о. И это то, что делает _extract_temp и _extract_desc. Они извлекают температуру погоды и описание данных о погоде из объекта ответа соответственно.

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

Speaker.py

Файл Speaker.py использует IBM Watson Text в речь для синтеза текста к речи. Для этого мы импортируем и используем библиотеку ibm_watson Python.

Вы должны были установить эту библиотеку, если вы следите за шагами в Readme.md Страница на странице репозитория GitHub Cali.

# A python program that converts text to speech using tts
from ibm_watson import TextToSpeechV1
from ibm_cloud_sdk_core.authenticators import IAMAuthenticator
import random
import os

# import pyttsx3 


class TTSSpeaker(object):

    voice = "online"  # set to offline to use pyttsx

    def __init__(self):

        #initialize offline tts
        # self.pyttsxengine = pyttsx3.init()

        #initialize an authenticator with our UNIQUE key
        self.authenticator = IAMAuthenticator('1-D9_Ydjmq8Hg72JkLFBZTNWtC9i6X6NEb6LffHi2LBH')

        #initialize  texttospeech  mdoule with the authenticator
        self.text_to_speech = TextToSpeechV1(
            authenticator=self.authenticator
        )

        #set the service url is recommended on IBM Watson Tutorial page. 
        self.text_to_speech.set_service_url('https://api.eu-gb.text-to-speech.watson.cloud.ibm.com/instances/1915a1e6-e3b2-43a7-a600-91c6810567ac')

    def speak(self, input_texts):

        print(input_texts)

        if(TTSSpeaker.voice == "offline"):

            pass

        else:

            filename = "ibmvoice.mp3"

            with open(filename, 'wb') as audio_file:
                audio_file.write(self.text_to_speech.synthesize(
                        input_texts,
                        voice='en-US_AllisonV3Voice',
                        accept='audio/mp3'
                    ).get_result().content)


            os.system("mpg321 "+ filename)

На init Функция класса TTSPeaker, мы инициализировали модуль IBM TextToScecheCech с объектом аутентификатора, который мы настроили с уникальным ключом, который мы получили от регистрации на IBM Облако Отказ Это необходимо для текста IBM Watson Text к API для проверки подлинности нашей просьбы.

Мы также устанавливаем URL-адрес сервиса, поскольку нам проинструктировано делать на IBM TTS Страница документации

Функция Speak получает input_text в качестве аргумента и использует модуль IBM Watson TextTepeChev1 для синтеза IPTEXT_TEXT, вызывая .sytesize (input_text,)

Input_Text – это текст для синтеза.

Параметр голоса – это голос IBM TTS, который мы хотим использовать для синтеза текста. Вы можете изменить голос к одному из голосов в IBM TTS Demo.

Параметр Accept – это формат файла, который мы хотим получать обратно из IBM.

Обратите внимание, что мы уже инициализировали TextTOSCECHV1 на init Функция и назначена его Self.text_to_speech.

Как только IBM синтезировал текст в речь, мы получаем двоичное содержание синтезированного звука и напишите его в файл.

Мы просто использовали MPG321 игрока командной строки для воспроизведения вновь созданного аудиофайла. У вас должна быть установлена MPG321 Player Command Line Player, если вы соблюдате шаги на странице ReadMe.md, найденную на странице «Репозитория GitHUB CALI».

Main.py

Main.py использует библиотеку распознавания речи Google для прослушивания и синтеза речи к тексту. Затем мы постараемся сопоставить полученный текст на правильное действие, чтобы взять. Если мы не понимаем полученный текст, наш класс докладчика синтезет: «Извините, я не получил это« речи и играть в нее ». Ниже приведен исходный код для этого файла:

import speech_recognition as sr

from speaker import * 

from timeservice import * 

from weather import *

from util import * 

import re

import json


#the following functions uses regex to match recognized text to validate actions to take.


def is_twitter_profile_action(recognized_text):

    #demonstrates how to use regex for pattern matching and extraction.

    pattern = "open up (\S+) on twitter"

    matches = re.findall(pattern, recognized_text, re.IGNORECASE)

    return len(matches) > 0


def is_youtube_search_action(recognized_text):

    text = recognized_text.lower() #convert everything to lower case

    return "search for" in text and "on youtube" in text


def extract_youtube_search_term(recognized_text):

    text = recognized_text.lower()

    text = text.replace("search for","")

    text = text.replace("on youtube","")

    return text.strip() #remove any leading or trailing whitespace


def get_twitter_profile(recognized_text):
    pattern = "open up (\S+) on twitter"

    matches = re.findall(pattern, recognized_text, re.IGNORECASE)

    return matches[0]


def is_weather_search_action(recognized_text):

    text = recognized_text.lower() #convert everything to lower case

    return "what is the weather in" in text


def extract_city_name_for_weather_action(recognized_text):

    text = recognized_text.lower()

    return text.replace("what is the weather in","").strip()



def main():

    tts_speaker = TTSSpeaker()

    recognizer = sr.Recognizer()


    while True:

        with sr.Microphone() as source:
            print("Say something!")
            audio = recognizer.adjust_for_ambient_noise(source) # listen for 1 second to calibrate the energy threshold for ambient noise levels
            audio = recognizer.listen(source)                   # now when we listen, the energy threshold is already set to a good value, and we can reliably catch speech right away

        # Speech recognition using Google Speech Recognition

        try:
            # To use your API Key use: `r.recognize_google(audio, key="GOOGLE_SPEECH_RECOGNITION_API_KEY")`
            # instead of `r.recognize_google(audio)`

            recognized_text  = recognizer.recognize_google(audio)

            print("You said: " + recognized_text)

            #Here we will use simple if statements to map the captured text to appropriate actions.

            if "local time" in recognized_text:
                tts_speaker.speak(TimeService().get_local_time())

            #should open a twitter profile?, sentence to match: open up iamabeljoshua on twitter. 
            if is_twitter_profile_action(recognized_text):

                open_page("https://twitter.com/" + get_twitter_profile(recognized_text))

            #should open a youtube search page?, sentence to match: search for {searchterm} on youtube
            if is_youtube_search_action(recognized_text):

                open_page("https://www.youtube.com/results?search_query=" + extract_youtube_search_term(recognized_text))

            #should fetch weather data for a particular city?
            if is_weather_search_action(recognized_text):

                tts_speaker.speak(WeatherService().get_weather_data(extract_city_name_for_weather_action(recognized_text)))

            else:
                tts_speaker.speak("I am sorry. I didn't get that!. There is no procedure available to handle your request")

        except sr.UnknownValueError:
            tts_speaker.speak("I am sorry. I didn't get that!")
            print("Google Speech Recognition could not understand audio")

        except sr.RequestError as e:
            tts_speaker.speak("I am sorry. I didn't get that!")
            print("Could not request results from Google Speech Recognition service; {0}".format(e))

if __name__ == "__main__":

    main() 

Код выше прослушивает речи, преобразует речь в текст, используя библиотеку «Репродукция» и пытается сопоставить полученный текст к действию. Он использует простые шаблоны Regex и строковые функции для поиска определенных ключевых слов, таких как «на YouTube», чтобы знать, что команда – открыть страницу поиска видео на YouTube или «В Twitter», чтобы узнать, что команда – открыть профиль Twitter.

CALI не Super-Smart, поэтому он может обрабатывать конкретные команды. Например, он понимает, что «открыть Iamabeljoshua в твиттере», и даже что «какая погода в Абудзе» означает, но это не понимает, что «какова погода в Абудзе».

Чтобы Cali умнее этого, и научите его иметь возможность понимать и извлечь намерение из текста, нам нужно будет использовать обработку естественного языка, которая находится за пределами объема этого учебника.

На данный момент наслаждайтесь тестированием и добавлением дополнительных функций в Cali. Надеюсь, в будущем я буду публиковать новую серию в блоге о том, как использовать методы NLP, чтобы сделать CALI Smarter.

ЗАКЛЮЧЕНИЕ

Спасибо за чтение этого блога. CALI – это простой проект, который демонстрирует, как вы можете использовать распознавание речи и текст для речи, чтобы создать простой виртуальный помощник. Не стесняйтесь загружать и повторно использовать часть или все исходные кодиру CALI, подкидывание и отправку запросов на GitHub.

ОБО МНЕ

Я Авель Джошуа, самостоятельный разработчик программного обеспечения Full-Stack Software в настоящее время здание и соучреждено https://clique.ng.

Вы также можете следовать за мной в Twitter в https://twitter.com/iamabeljoshua

Если у вас есть какие-либо вопросы, бросьте комментарий ниже, и я буду рад ответить на них.