15.07.2024. ·
6 min

Python za svakoga – Napravite sami virtuelnog asistenta sa manje od sto linija koda

Python za svakoga – Napravite sami virtuelnog asistenta sa manje od sto linija koda

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:

  1. Prepoznavač govora (eng. speech recognizer), koji može da pretvori zvučni input u tekst.
  2. Agent, koji može da razume značenje teksta i da generiše odgovor na njega.
  3. 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

  1. Python Launcher for Windows documentation
  2. Python venv documentation
  3. Speech Recognition Python package
  4. gcsa Python package
  5. Google Calendar Simple API documentation
  6. pyttsx3 Python package
  7. TIOBE Index
  8. Build Your Own Alexa With Just 20 Lines of Python

 

Oceni tekst

5
1 glas
Rodolfo Cangiotti Rodolfo Cangiotti

Rodolfo je samouki softverski developer sa posebnim iskustvom u razvoju web i desktop aplikacija. Diplomirao je na konzervatorijumu G. Rossini (Pesaro, Italija) na odseku Elektronske muzike, gde je, iako iz muzičke perspektive, stekao osnove programiranja i algoritamskog razmišljanja. Duboko ga fascinira sve ono što je zajedničko digitalnim informacionim tehnologijama — posebno novijim kao što su mašinsko učenje, veštačka inteligencija, IoT — i umetnosti. Zalaže se za pisanje jasnog i elegantnog koda, za filozofiju otvorenog koda i za deljenje znanja.

0 komentara

Iz ove kategorije

Svi članci sa Bloga

Slični poslovi

Povezane kompanije po tagovima