This shows you the differences between two versions of the page.
pm:prj2023:danield:gptma [2023/05/28 22:45] farhad_ali.gul |
pm:prj2023:danield:gptma [2023/05/30 18:38] (current) farhad_ali.gul [Download] |
||
---|---|---|---|
Line 41: | Line 41: | ||
===== Hardware Design ===== | ===== Hardware Design ===== | ||
- | {{pm:prj2023:danield:gptma_kicad.png?600x400 | Schema hardware }} | + | {{ pm:prj2023:danield:gptma_kicad.png?700x500 | Schema hardware }} |
+ | |||
Line 70: | Line 72: | ||
===== Software Design ===== | ===== Software Design ===== | ||
+ | Proiectarea software a fost realizata in CircuitPython, care dispune de biblioteci si suport pentru ce am realizat in cadrul proiectului. | ||
- | <note tip> | + | Pentru a realiza un API Request avem în primul rând nevoie de conexiune la internet. |
- | Descrierea codului aplicaţiei (firmware): | + | |
- | * mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR) | + | După conectarea Pico la internet prin WIFI, avem nevoie de o bibliotecă care să poată face request-uri. Am ales biblioteca adafruit_requests, capabilă de requesturi simple. |
- | * librării şi surse 3rd-party (e.g. Procyon AVRlib) | + | |
- | * algoritmi şi structuri pe care plănuiţi să le implementaţi | + | Tot codul este complex și lung, vom pune accentul pe baza acestuia și anume requestul la ChatGPT. |
- | * (etapa 3) surse şi funcţii implementate | + | |
- | </note> | + | Pentru a face acest request, avem nevoie de preconfigurare de socket, ssl, pentru ca mai apoi să deschidem o sesiune de request. |
+ | |||
+ | Formatul prompt-ului trimis este de forma: full_prompt = [{"role": "user", "content": payload},], payload fiind textul primit ca input. În cadrul request-ului, trebuie precizat ce model vrem să folosim, am folosit gpt-3.5-turbo. | ||
+ | |||
+ | De asemenea, am precizat și authorization key-ul, cel obținut de pe pagina celor de la OpenAI. | ||
- | Proiectarea software a fost realizata in CircuitPython, care dispune de biblioteci si suport pentru ce am realizat in cadrul proiectului. | ||
- | Pentru a realiza un API Request avem în primul rând nevoie de conexiune la internet. După conectarea Pico la internet prin WIFI, avem nevoie de o bibliotecă care să poată face request-uri. Am ales biblioteca adafruit_requests, capabilă de requesturi simple. | ||
- | Tot codul este complex și lung, vom pune accentul pe baza acestuia și anume requestul la ChatGPT. Pentru a face acest request, avem nevoie de preconfigurare de socket, ssl, pentru ca mai apoi să deschidem o sesiune de request. | ||
- | Formatul prompt-ului trimis este de forma: full_prompt = [{"role": "user", "content": payload},], payload fiind textul primit ca input. În cadrul request-ului, trebuie precizat ce model vrem să folosim, noi am folosit gpt-3.5-turbo. De asemenea, am precizat și authorization key-ul, cel obținut de pe pagina celor de la OpenAI. | ||
Pentru a trimite request-ul, am folosit requests.post cu parametrii: URL, modelul dorit și mesajul ca JSON și Authorization Key ca header. | Pentru a trimite request-ul, am folosit requests.post cu parametrii: URL, modelul dorit și mesajul ca JSON și Authorization Key ca header. | ||
+ | |||
Răspunsul primit poate fi extras sub formă de JSON din response.content. | Răspunsul primit poate fi extras sub formă de JSON din response.content. | ||
- | Fiecare API poate avea un model de împachetare a datelor diferit, la fel și tipul de cerere care trebuie făcută pentru a afla informațiile. Modelul de request de mai sus se aplică mai departe și pentru alte API-uri pe care le-am folosit în proiect cu modificările necesare aferente. | + | |
+ | Fiecare API poate avea un model de împachetare a datelor diferit, la fel și tipul de cerere care trebuie făcută pentru a afla informațiile. | ||
+ | |||
+ | Modelul de request de mai sus se aplică mai departe și pentru alte API-uri pe care le-am folosit în proiect cu modificările necesare aferente. | ||
API - uri folosite: | API - uri folosite: | ||
ChatGPT | ChatGPT | ||
+ | |||
Vreme - https://openweathermap.org/api | Vreme - https://openweathermap.org/api | ||
+ | |||
Text-to-speech - https://rapidapi.com/voicerss/api/text-to-speech-1 | Text-to-speech - https://rapidapi.com/voicerss/api/text-to-speech-1 | ||
+ | |||
Youtube API - https://github.com/FarhadGUL06/YoutubeAPI | Youtube API - https://github.com/FarhadGUL06/YoutubeAPI | ||
+ | |||
ESP_32_STATS_API - https://github.com/FarhadGUL06/esp32_stats_api | ESP_32_STATS_API - https://github.com/FarhadGUL06/esp32_stats_api | ||
+ | |||
Folosesc proiectul de la IC - ESP32 pe post de tracker pentru statistici de temperature, umiditate, calitatea aerului, acceleratia (In cazul deplasarii) din orice loc cu o conexiune la internet, care trimite date din 10 in 10 secunde catre API-ul ESP_32_STATS_API, date care pot fi preluate ulterior de catre GPT Multimedia Assistant. | Folosesc proiectul de la IC - ESP32 pe post de tracker pentru statistici de temperature, umiditate, calitatea aerului, acceleratia (In cazul deplasarii) din orice loc cu o conexiune la internet, care trimite date din 10 in 10 secunde catre API-ul ESP_32_STATS_API, date care pot fi preluate ulterior de catre GPT Multimedia Assistant. | ||
Line 102: | Line 114: | ||
Schema de comunicare cu API-urile de mai sus: | Schema de comunicare cu API-urile de mai sus: | ||
- | {{pm:prj2023:danield:gptma_software.png?600x500 | Schema software }} | + | {{ pm:prj2023:danield:gptma_software.png?700x500 | Schema software }} |
Line 130: | Line 143: | ||
<code> | <code> | ||
!help: afișează comenzile disponibile | !help: afișează comenzile disponibile | ||
+ | |||
!ping: se poate verifica conexiunea între telefon și Pico. Se va afișa un „Pong!” pe ecran. | !ping: se poate verifica conexiunea între telefon și Pico. Se va afișa un „Pong!” pe ecran. | ||
+ | |||
!restart / !reload: se rulează de la început fișierul code.py | !restart / !reload: se rulează de la început fișierul code.py | ||
+ | |||
!p <payload>: se poate reda piesa cu titlul specificat în <payload> | !p <payload>: se poate reda piesa cu titlul specificat în <payload> | ||
+ | |||
!tell <payload> / !say <payload>: dispozitivul va transmite audio inputul primit | !tell <payload> / !say <payload>: dispozitivul va transmite audio inputul primit | ||
+ | |||
!mem: memoria RAM disponibilă | !mem: memoria RAM disponibilă | ||
- | !wf <payload>: vremea în viitorul apropiat din orașul dat ca input, dacă <payload> este gol, atunci se va analiza vremea în viitorul apropiat din București | + | |
- | !w <payload>: vremea în acest moment din orașul dat ca input, dacă <payload> este gol, atunci se va analiza vremea în acest moment din București | + | !wf <payload>: vremea în viitorul apropiat din orașul dat ca input, dacă <payload> este gol, |
+ | atunci se va analiza vremea în viitorul apropiat din București | ||
+ | |||
+ | !w <payload>: vremea în acest moment din orașul dat ca input, dacă <payload> este gol, | ||
+ | atunci se va analiza vremea în acest moment din București | ||
!last: se va reda ultimul răspuns primit de la ChatGPT | !last: se va reda ultimul răspuns primit de la ChatGPT | ||
- | !lan ro / en: se va seta limba pe ro / en, în funcție de cum este precizat. Limba este utilizată și pentru API-ul text-to-speech, selectându-se vocea potrivită limbii selectate | + | |
+ | !lan ro / en: se va seta limba pe ro / en, în funcție de cum este precizat. | ||
+ | Limba este utilizată și pentru API-ul text-to-speech, selectându-se vocea potrivită limbii selectate | ||
!stats: statistici de temperatură și umiditate din încăperea in care se afla GPT Multimedia Assistant | !stats: statistici de temperatură și umiditate din încăperea in care se afla GPT Multimedia Assistant | ||
+ | |||
!esp - statistici de temperatura, umiditate si altele din locul in care se afla ESP32, cu afisare pe ecran | !esp - statistici de temperatura, umiditate si altele din locul in care se afla ESP32, cu afisare pe ecran | ||
+ | |||
!espv - statistici transmise sub forma audio, prin boxa | !espv - statistici transmise sub forma audio, prin boxa | ||
- | <payload>: scriind direct textul, neprefixat de „!”, acesta va fi prelucrat de ChatGPT și se va oferi un răspuns | + | |
+ | <payload>: scriind direct textul, neprefixat de „!”, acesta va fi prelucrat de ChatGPT și se va oferi un | ||
+ | răspuns | ||
</code> | </code> | ||
- | Spre exemplu, pentru o cerere de vreme, se trimite un API Request către API-ul de vreme, se așteaptă răspunsul. După ce a fost primit, se trimite json-ul mai departe la ChatGPT pentru a fi prelucrat într-un text cursiv. La final, răspunsul primit de la ChatGPT este trimis la API-ul de text-to-speech care prelucrează textul și trimite răspuns fișierul binar mp3 care este salvat pe cardul SD și redat ulterior. | + | Spre exemplu, pentru o cerere de vreme, se trimite un API Request către API-ul de vreme, se așteaptă răspunsul. |
+ | |||
+ | După ce a fost primit, se trimite json-ul mai departe la ChatGPT pentru a fi prelucrat într-un text cursiv. | ||
+ | |||
+ | La final, răspunsul primit de la ChatGPT este trimis la API-ul de text-to-speech care | ||
+ | prelucrează textul și trimite răspuns fișierul binar mp3 care este salvat pe cardul SD și redat ulterior. | ||
===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||
+ | <note> | ||
Un mic demo cu cateva din functionalitatile GPTMA in faza incipienta: | Un mic demo cu cateva din functionalitatile GPTMA in faza incipienta: | ||
+ | |||
[[https://ctipub-my.sharepoint.com/personal/farhad_ali_gul_stud_acs_upb_ro/_layouts/15/stream.aspx?id=%2Fpersonal%2Ffarhad%5Fali%5Fgul%5Fstud%5Facs%5Fupb%5Fro%2FDocuments%2Fprezentare%2Emp4&ga=1|Prezentare GPT Multimedia Assistant]] | [[https://ctipub-my.sharepoint.com/personal/farhad_ali_gul_stud_acs_upb_ro/_layouts/15/stream.aspx?id=%2Fpersonal%2Ffarhad%5Fali%5Fgul%5Fstud%5Facs%5Fupb%5Fro%2FDocuments%2Fprezentare%2Emp4&ga=1|Prezentare GPT Multimedia Assistant]] | ||
+ | </note> | ||
Poza cu proiectul la inceputul proiectarii: | Poza cu proiectul la inceputul proiectarii: | ||
- | {{pm:prj2023:danield:gptma_poza.jpeg?500x250| Demo GPTMA}} | ||
+ | {{pm:prj2023:danield:gptma_poza.jpeg?500x400| Demo GPTMA}} | ||
- | Poze cu proiectul lipit pe placaj de test: | ||
+ | Lipiturile de pe spatele placutei: | ||
+ | |||
+ | {{pm:prj2023:danield:gptma_circuit2.jpg?400x550| GPTMA}} | ||
+ | |||
+ | |||
+ | Poza cu proiectul lipit pe placaj de test: | ||
+ | |||
+ | |||
+ | {{pm:prj2023:danield:gptma_circuit.jpg?400x550| GPTMA}} | ||
+ | |||
+ | |||
+ | Proiectul in stadiu final: | ||
+ | |||
+ | |||
+ | {{pm:prj2023:danield:gptma_circuit3.jpg?400x550| GPTMA}} | ||
===== Concluzii ===== | ===== Concluzii ===== | ||
+ | |||
+ | Lucrul asupra acestui proiect a fost unul destul de indelungat. | ||
+ | |||
+ | De la inceput am plecat de la premisa ca daca nu iese o singura parte din proiect (comunicarea cu GPT de exemplu), se duce toata ideea si sensul | ||
+ | proiectului. | ||
+ | |||
+ | Pana la urma, in prima faza reusisem sa proiectez software proiectul intr-o faza incipienta, pe care am prezentat-o si la SCSS. | ||
+ | |||
+ | Ulterior, am decis sa fac portabil proiectul (am incercat sa-l aduc o data la facultate montat pe breadboard si s-a facut praf). | ||
+ | |||
+ | Aici am mai consumat cateva zile cu lipiturile care se pot vedea in poza, au fost si altele nereusite. | ||
+ | |||
+ | Intr-un final a iesit un proiect complet functional, deschizator de drumuri pentru orientarea asupra proiectarii programelor mai sofisticate pe microcontrolere. | ||
+ | |||
===== Download ===== | ===== Download ===== | ||
- | <note warning> | + | [[https://github.com/FarhadGUL06/PicoAssistant|PicoAssistant]] - fisierul cod si biblioteci pt GPT Multimedia Assistant |
- | O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului: surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-). | + | |
+ | [[https://github.com/FarhadGUL06/YoutubeAPI|YoutubeAPI]] - API-ul care proceseaza audio si trimite catre GPTMA | ||
+ | |||
+ | [[https://github.com/FarhadGUL06/esp32_stats_api|ESP32_STATS_API]] - API-ul care preia si trimite date de la [[https://ocw.cs.pub.ro/courses/icalc/proiect2023|ESP32]] | ||
- | Fişierele se încarcă pe wiki folosind facilitatea **Add Images or other files**. Namespace-ul în care se încarcă fişierele este de tipul **:pm:prj20??:c?** sau **:pm:prj20??:c?:nume_student** (dacă este cazul). **Exemplu:** Dumitru Alin, 331CC -> **:pm:prj2009:cc:dumitru_alin**. | ||
- | </note> | ||
===== Jurnal ===== | ===== Jurnal ===== | ||
Line 180: | Line 248: | ||
07.05.2023 - adaugare componente folosite | 07.05.2023 - adaugare componente folosite | ||
- | 19.05.2023 - pr | + | 19.05.2023 - prezentare proiectare hardware in laborator |
20.05.2023 - adaugare implementare hardware | 20.05.2023 - adaugare implementare hardware | ||
- | 2 | + | 26.05.2023 - prezentare demo functionare in laborator |
+ | |||
+ | 28.05.2023 - adaugare implementare software + concluzii | ||
===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
- | <note> | ||
- | Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. | ||
- | </note> | ||
- | [1] https://docs.circuitpython.org/projects/requests/en/latest/api.html | + | [1] https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods |
- | [2] | + | |
+ | [2] https://docs.circuitpython.org/projects/requests/en/latest/api.html | ||
+ | |||
+ | [3] https://platform.openai.com | ||
+ | |||
+ | [4] https://openweathermap.org/api | ||
+ | |||
+ | [5] https://rapidapi.com/voicerss/api/text-to-speech-1 | ||
+ | |||
+ | [6] https://play.google.com/store/apps/details?id=com.broxcode.arduinobluetoothfree | ||
+ | |||
<html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | ||