U današnje vreme smo, više nego ikad pre, zatrpani stvarima koje moramo da uradimo (ili bismo želeli da uradimo). Zašto onda ne bismo iskoristili neke alate koji bi nam automatizovali male zadatke ili pomogli da jednostavno dođemo do informacija koje nam mogu zatrebati u nekom trenutku tokom dana?
U ovom kratkom članku iz našeg LoGeek Magazina - Broj #17, kodiraćemo virtuelnog asistenta od nule, i svaki korak ćemo detaljno objasniti.
Ako vas zanima svet tehnologije i želite da dublje istražite ovu tematiku, pročitajte najnovije izdanje LoGeek Magazina!
Priprema razvojnog okruženja
Pre nego što počnemo sa kodiranjem virtuelnog asistenta, predlažemo da se podesi virtuelno razvojno okruženje. Ovo vam omogućava da instalirate sve zavisnosti (eng. dependencies) projekta lokalno, bez uticaja na sistemsku bazu koda. Evo komandnih linija koje smo koristili za kreiranje i aktiviranje virtuelnog okruženja (skraćeno na engleskom: venv) na mom računaru sa sistemom Windows 10:
py -3.11 -m venv va-venv-3.11
.\va-venv-3.11\Scripts\activate
python -m pip install --upgrade pip
U slučaju da koristite macOS ili Linux distribuciju kao operativni sistem, prva komanda treba da bude zamenjena pokretanjem odgovarajućeg Pajton interpretatora instaliranog u sistemskom okviru:
python3.11 -m venv va-venv-3.11
Čitaocima koji nisu upoznati sa konceptom virtuelnog okruženja (venv) toplo preporučujemo da počnu sa primenom ovoga kada započinju Pajton projekat. Pored razdvajanja zavisnosti (dependencies) projekta od Pajton modula koji su već instalirani u okviru operativnog sistema (samim tim se izbegava njihovo poništavanje), venv vam omogućava da lako kreirate više verzija projekta sa različitim verzijama Pajton interpretatora i povezanih modula.
Glavne komponente virtuelnog asistenta
Gledajuci širu sliku, virtuelni asistent se može rastaviti na tri glavne komponente:
- Prepoznavač govora (eng. speech recognizer), koji može da pretvori zvučni input u tekst.
- Agent, koji može da razume značenje teksta i da generiše odgovor na njega.
- Konvertor teksta u govor, koji pretvara odgovor u audio signal.
U daljem tekstu, detaljnije ćemo opisati implementaciju ove tri glavne komponente.
Implementacija prepoznavača govora
Za ovu komponentu virtuelnog asistenta koristićemo biblioteku SpeechRecognition.
Da biste instalirali povezane module u virtuelno okruženje, koristite sledeću komandu:
pip install SpeechRecognition
Evo osnovne upotrebe modula:
import speech_recognition as sr
# Inicijalizuje se prepoznavač govora
recognizer = sr.Recognizer()
with sr.Microphone() as source:
recording = recognizer.listen(audio_source)
# Objekat snimka se prikazuje nakon što se detektuje audio signal...
sentence = recognizer.recognize_google(recording)
Klasa `Recognizer`, koja je glavni entitet ovog modula, instancira se i povezuje sa mikrofonskim interfejsom kako bi osluškivala dolazne signale. Čim se detektuje govor, snimak se kreira i šalje Google API-ju radi konverzije u tekst.
Implementacija agenta
Suštinska komponenta virtuelnog asistenta je sasvim primitivni AI agent, sposoban da izvrši akcije na osnovu primljenih komandi.
Za ovaj projekat, implementiran je jednostavan upravljač Gugl kalendarom (eng. Google calendar manager).
Za komunikaciju sa API-jem Gugl kalendara i instalaciju neophodnog Pajton modula, koristite sledeću komandu:
pip install gcsa
Evo nekih linija koda pomoću kojih možete daunlodovati sadržaj izabranog Gugl kalendara i odštampati ga u konzoli:
import os
from gcsa.google_calendar import GoogleCalendar
# Inicijalizacija API-ja za Gugl kalendar
this_folder = os.path.dirname(__file__)
google_calendar = GoogleCalendar(‘rodolfo.cangiotti@dxc.com’,
credentials_path=os.path.join(this_folder, ‘credentials.json’))
for event in google_calendar:
print(event)
Za više informacija o konfigurisanju vašeg Gugl naloga i dobijanju potrebnog fajla sa kredencijalima, pogledajte ovaj odeljak dokumentacije.
Konvertor teksta u govor
Za poslednju komponentu virtuelnog asistenta, koristićemo paket pyttsx3, iako nema aktivnih apdejtova od leta 2020.
Evo komande za instalaciju neophodnih modula:
pip install pyttsx3
Evo Pajton koda za osnovnu upotrebu ovog modula:
import pyttsx3
# Inicijalizacija konvertora teksta u govor...
engine = pyttsx3.init()
voices = engine.getProperty(‘voices’)
engine.setProperty(‘voice’, voices[1].id)
# Recite nešto...
engine.say(‘Hello world!’)
engine.runAndWait()
Agregacija komponenata
Kombinovanjem koda gore navedenih komponenti, reorganizacijom na elokventniji način i dodavanjem mehanizama za početak ili završetak razgovora s virtualnim asistentom, proizvedena je sledeća Pajton datoteka main.py:
import datetime
import os
import pyttsx3
import speech_recognition as sr
from gcsa.google_calendar import GoogleCalendar
from speech_recognition import UnknownValueError
# Inicijalizacija prepoznavača govora…
recognizer = sr.Recognizer()
# Inicijalizacija konvertora teksta u govor...
engine = pyttsx3.init()
voices = engine.getProperty(‘voices’)
engine.setProperty(‘voice’, voices[1].id)
# Inicijalizacija Gugl kalendar API-ja...
this_folder = os.path.dirname(__file__)
google_calendar = GoogleCalendar(‘rodolfo.cangiotti@dxc.com’,
credentials_path=os.path.join(this_folder, ‘credentials.json’))
# Definisanje nekih konfiguracionih parametara za skriptu
AGENT_NAME = ‘Penny’
def listen(audio_source):
try:
recording = recognizer.listen(audio_source)
# Objekat snimka se prikazuje nakon što se detektuje audio signal...
sentence = recognizer.recognize_google(recording)
except UnknownValueError:
sentence = None # Konvertor nije mogao da razume rečenicu…
except Exception as e:
print(‘ERROR >>>’, repr(e))
raise e
return sentence
def render(text):
engine.say(text)
engine.runAndWait()
def wait_for_agent_name(audio_source):
while True:
sentence = listen(audio_source)
if not isinstance(sentence, str):
continue
sentence = sentence.strip()
if AGENT_NAME.lower() in sentence.lower():
return
def converse(audio_source):
render(‘Zdravo, treba li vam pomoć?’)
while True:
sentence = listen(audio_source)
if not isinstance(sentence, str):
continue
sentence = sentence.strip()
sentence = sentence.lower()
if ‘sastanak’ in sentence and \
‘danas’ in sentence:
render(f’Evo sastanaka za danas, {datetime.date.today()}:’)
for idx, event in enumerate(google_calendar, 1):
render(f”Događaj br. {idx}: {event.summary} “
f”from {event.start.strftime(‘%H %M’)} to {event.end.strftime(‘%H %M’)}”)
render(“To je sve, nismo pronašli druge događaje!”)
elif ‘Hvala ti’ in sentence or \
‘hvala’ in sentence:
render(“Nema na čemu, drago mi je da mogu da pomognem!”)
break # Kraj razgovora...
elif ‘ništa’ in sentence or \
‘nema problema’ in sentence:
render(‘U redu, slobodno mi se ponovo javite ako vam još nešto zatreba!’)
break # Kraj razgovora...
else:
render(“Bojim se da ne razumem šta ste rekli. Možete li da ponovite?”)
def main():
try:
print(‘Pokretanje agenta...’)
with sr.Microphone() as source:
while True:
wait_for_agent_name(source)
converse(source)
except KeyboardInterrupt:
print(‘Završetak…’)
if __name__ == ‘__main__’:
main()
Zaključak i dalji razvoj
Projekat koji je opisan u ovom članku služi kao skroman primer potencijala programskog jezika Pajton. Posebno treba istaći njegovu jednostavnost, sažetost i nivo zrelosti koji je dostigao — uzimajući u obzir raznolikost dostupnih spoljnih modula u današnje vreme — što pokazuje da je moguće kreirati vredne alate sa samo nekoliko linija koda, čak i bez veoma dubokog znanja o tematici.
Ovaj projekat imao je za cilj da posluži kao polazna tačka sa mnogo prostora za poboljšanja. Zapravo, budući razvoji mogu uključivati korišćenje modernijih modula za konverziju teksta u govor, implementaciju preciznijih algoritama prepoznavanja govora, kao i integraciju prethodno obučenih velikih jezičkih modela (LLM - large language models) kako bi se omogućili prirodniji i sveobuhvatniji razgovori sa virtuelnim asistentom.
Zanima vas svet tehnologije i želite da još dublje istražite slične sadržaje? Pročitajte celo izdanje našeg magazina LoGeek Magazine - Issue #17 i pratite nas na LinkedIn-u.
Literatura
- Python Launcher for Windows documentation
- Python venv documentation
- Speech Recognition Python package
- gcsa Python package
- Google Calendar Simple API documentation
- pyttsx3 Python package
- TIOBE Index
- Build Your Own Alexa With Just 20 Lines of Python
0 komentara