From aab14d538c9cf34abe8caffd5f7d00cf21e08a90 Mon Sep 17 00:00:00 2001 From: Ruan Rabello <142259703+Ruanrabello@users.noreply.github.com> Date: Thu, 11 Dec 2025 15:52:22 -0300 Subject: [PATCH] Add files via upload --- .../Config/__pycache__/keys.cpython-310.pyc | Bin 0 -> 221 bytes .../Config/__pycache__/keys.cpython-313.pyc | Bin 0 -> 239 bytes .../AssistenteVirtual/Config/keys.py | 1 + .../AssistenteVirtual/Core/Personalidade.py | 100 +++++++++++++++++ .../__pycache__/Personalidade.cpython-313.pyc | Bin 0 -> 4641 bytes .../Core/__pycache__/comandos.cpython-310.pyc | Bin 0 -> 1279 bytes .../Core/__pycache__/comandos.cpython-313.pyc | Bin 0 -> 3857 bytes .../Core/__pycache__/gui.cpython-313.pyc | Bin 0 -> 4713 bytes .../__pycache__/historico.cpython-310.pyc | Bin 0 -> 1225 bytes .../__pycache__/historico.cpython-313.pyc | Bin 0 -> 1925 bytes .../Core/__pycache__/ia.cpython-310.pyc | Bin 0 -> 608 bytes .../Core/__pycache__/ia.cpython-313.pyc | Bin 0 -> 1049 bytes .../Core/__pycache__/voz.cpython-310.pyc | Bin 0 -> 1429 bytes .../Core/__pycache__/voz.cpython-313.pyc | Bin 0 -> 2354 bytes .../AssistenteVirtual/Core/comandos.py | 101 ++++++++++++++++++ .../AssistenteVirtual/Core/historico.py | 33 ++++++ .../AssistenteVirtual/Core/ia.py | 42 ++++++++ .../AssistenteVirtual/Core/voz.py | 47 ++++++++ .../AssistenteVirtual/data/Historico.json | 82 ++++++++++++++ .../__pycache__/historico.cpython-313.pyc | Bin 0 -> 1918 bytes AssistenteVirtual/AssistenteVirtual/main.py | 31 ++++++ 21 files changed, 437 insertions(+) create mode 100644 AssistenteVirtual/AssistenteVirtual/Config/__pycache__/keys.cpython-310.pyc create mode 100644 AssistenteVirtual/AssistenteVirtual/Config/__pycache__/keys.cpython-313.pyc create mode 100644 AssistenteVirtual/AssistenteVirtual/Config/keys.py create mode 100644 AssistenteVirtual/AssistenteVirtual/Core/Personalidade.py create mode 100644 AssistenteVirtual/AssistenteVirtual/Core/__pycache__/Personalidade.cpython-313.pyc create mode 100644 AssistenteVirtual/AssistenteVirtual/Core/__pycache__/comandos.cpython-310.pyc create mode 100644 AssistenteVirtual/AssistenteVirtual/Core/__pycache__/comandos.cpython-313.pyc create mode 100644 AssistenteVirtual/AssistenteVirtual/Core/__pycache__/gui.cpython-313.pyc create mode 100644 AssistenteVirtual/AssistenteVirtual/Core/__pycache__/historico.cpython-310.pyc create mode 100644 AssistenteVirtual/AssistenteVirtual/Core/__pycache__/historico.cpython-313.pyc create mode 100644 AssistenteVirtual/AssistenteVirtual/Core/__pycache__/ia.cpython-310.pyc create mode 100644 AssistenteVirtual/AssistenteVirtual/Core/__pycache__/ia.cpython-313.pyc create mode 100644 AssistenteVirtual/AssistenteVirtual/Core/__pycache__/voz.cpython-310.pyc create mode 100644 AssistenteVirtual/AssistenteVirtual/Core/__pycache__/voz.cpython-313.pyc create mode 100644 AssistenteVirtual/AssistenteVirtual/Core/comandos.py create mode 100644 AssistenteVirtual/AssistenteVirtual/Core/historico.py create mode 100644 AssistenteVirtual/AssistenteVirtual/Core/ia.py create mode 100644 AssistenteVirtual/AssistenteVirtual/Core/voz.py create mode 100644 AssistenteVirtual/AssistenteVirtual/data/Historico.json create mode 100644 AssistenteVirtual/AssistenteVirtual/data/__pycache__/historico.cpython-313.pyc create mode 100644 AssistenteVirtual/AssistenteVirtual/main.py diff --git a/AssistenteVirtual/AssistenteVirtual/Config/__pycache__/keys.cpython-310.pyc b/AssistenteVirtual/AssistenteVirtual/Config/__pycache__/keys.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ae0f1bf25cf158075a66b209f5e97877f2748c0e GIT binary patch literal 221 zcmd1j<>g`k0=F;bnO;EpF^Gc<7=auIATH(r5-AK(3@MDk44O<)7U{*=@dc62S)sYv zkx^czS#Ey0W+5Jd{^9N^l}W~KksgL==2-z@$yo*^X2t%={(*u1iAENMX?~iFw|Lxx z`~%}113crsT_aaA6fptK1{1%`ldWPxi&Kk=V~R=>^O9m*^2_sb@)J{vfvn`>7{}t` s%;J*Nypq%y=ls01%=DP-)XHMLg34PQHo5sJr8%i~AO{zN4CG({07Qg4XaE2J literal 0 HcmV?d00001 diff --git a/AssistenteVirtual/AssistenteVirtual/Config/__pycache__/keys.cpython-313.pyc b/AssistenteVirtual/AssistenteVirtual/Config/__pycache__/keys.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7a33e744eee23a70e303e501c125638977412408 GIT binary patch literal 239 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 literal 0 HcmV?d00001 diff --git a/AssistenteVirtual/AssistenteVirtual/Core/__pycache__/gui.cpython-313.pyc b/AssistenteVirtual/AssistenteVirtual/Core/__pycache__/gui.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a8f91da55e7f794962d7ac0000f0185b1d42fd65 GIT binary patch literal 4713 zcmb7IU2qh~5uUx@xgSYz0wGHXtppMrHd67MAP~09{|RGs%VCmJa<$wo(!yz1ncb5F zeo<1cSSsuQAq1$T3MJ)=ah|BW<}ojM)Rm4p)kaiOjw@BXDHbmLnC{uzTS>X3%&2ar zXQroTdb+3kTdma9g$b0Y*b(*jAwvF%9jEv!#L6c?+$R!|gh9fv^$ZFL5A!6v%$x8r zU&7D)i2w^Ef-IPzjEczP9SkMHEX--&U?dS`QBL~@>k{>>KGDD$ct0?>A+eEdy`&aHqqB2@+u*NnqX-IUq=$7IKX;pX3Ei{gMyrfaHfdCgRln{k)*+Y?BYmIk$hEly3U!E{ElpxuS$k< z)H@t*o80Kq4wY_nC@CNX4_5Bfk;%_nOVVa%mD{G996H(TP;Q%SacPHIvkQMY&WznA z+t&86S6eezQo7w)v+CY9IAgF{bZECtZg**ilBg>aR({oY7UMt6Bi| z>2~JbHW_zmhmu0B%-1?y4f(F5^qW=rVP_P)s%lr*=`DxDZIeAN?NG_R4&}D6dY{{K zC}$t;Y2W>pYn;QCv`UYNGYWcCJrGWEz}eqzUqg>W?kb0J_IXV`YMf(@q{EJUx2e78!n?;& zKW2sGT+YsO48x}t8U@vLre<}%eNvHg?`!!RjN+tU)y5$Q#$byJdAQM0J)ct;=0Jvd z!U|t8wT!|Qw}M&7q}P=k5W1!*S<|YwXPjhag^-)4M9XhCArNfmS;&??L&;yYLYYi9 zFB?WCV_*{M-*C!Mm@&+lq2?##;S>6#me=K+F??LlDZ{S$D%OKxrVNi1)SmGh z41=>3t7g0&=k_rS8F#=NzMUpZv~D(7q|GJT@(&s<)7Bzwo!|QX5m|AyWVdYpO)JQ)M~3>@`ZDb-($2X9 zCAw?<677*zqI+OTQ~SL%ED0k+cs5+7T}9e8-<>GY!S!pdJ-Sw+aahyZJvX}0(hJKP zkf&j`p-kJ0w7pDs7U|9>zVfak#a%~A^yqpC`XjwWd+?xL^Ib<4-Z;AEu-l4sTbXtj zY4@D@`OV+mEYW@I1=z=i8%Oo-m=8X@`{6UXeFY3dvJTq84&o7xNf7zm$DD|x>q-(i z)|J#MBr-z25YERvtP^;wfIL2~XgTQa!LFYpGTY%q){8@pGR6V*CV(;bg|xYDRAc&k zu+G5uKTS|mZZd9D`q&!&&ENKibysVk4E!ms$tdm^DaH&=M{SR9`Urv9z{P>rD7BA`9zx=UJEZ|1Vk3ajhXj`jKj8nD)#w;J2 z8N#s1)NzJMjp05F0UyIfmOq)6;gW+L*`=O_k zPu2O3cS>~NtH$oR$%V$=8M+v0EJj+Fwup0E7PiD^&Q$s5`kyvG4bOMr16`txcg~b( z+j4+}>g@NAq3aoK`ETz-O}O{X0l~cw{A7JujpWnF&5L6R^s!x)F&PjF*b;quU8&`F zuK#fSP{sc4QfCjeHrU&9zJRcdC)RnkLRR834}!GA?!i_s0Y6SIkObXzgH z?cro8x)Vmq(e`4r{aLhQ*-xU4{Kn$}h6t4H#tH)uKOSpEYAaOnFrooX9#a4fgfp2j zJy*yh9nEBZ0^z4J(~!wrRhePt;fqt#GZ~)KY@Ja-TanF>F-`cA&1Pg19Q;bbR3M33 zb(MUYRr2{vCN409uLj!s9UkZyekAbgyZ~~7;($(%6L`F~wwmFyZ&x)U9; z8g!~Bt$w~bd!vi7{V*R7GE~9x8aE8fC$o_Wt|tJKQGL?#DO2#-54Dm7u;PUTVg;_r zngU=2RjdRBD+1Uq3qUXf@PiG(#6|cS`=A1t5pMdG@nGui)IwOCKE71fbSpi5YS9<| zc<`r#AHBEa3x0g&XJ=-l+m~lA-}>P*U$gB)O)LSctp<){dxiip;(sX&epZI}&Y>a) zWE|3Q=w>6vh_mK29L7eA&Im#z8!b{Kd*CTC{(yKO4DvBh17o9A$9t7%XxKrMyAA61 z1+iU%XH9z4cHv{}2QY X=cVs$q4Q4gC4pw;gvTem!DaskfdGGT literal 0 HcmV?d00001 diff --git a/AssistenteVirtual/AssistenteVirtual/Core/__pycache__/historico.cpython-310.pyc b/AssistenteVirtual/AssistenteVirtual/Core/__pycache__/historico.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..db9e750c4d55a24be07c77a4f0daebb8bce7333a GIT binary patch literal 1225 zcmZuwO-~y!5VgI|W`P7kiquc_OI4*kv{C5=AygHGBB<0vYFeR2kc|2o#z4P9@Rr&lZ0W1Doi4I*teql0g43gI{ z%nCR`1Z|W0c&2qKSe*$+@NcBUPy<{~RRm@{HV%);ynS|k441-wlvM{DKP(nlk; zDd}Die=cpPe%w}pFc5{Nv~Emf5*a75B!VO;Z9%4V6sqSfqv8UJ&!3PbtCY6O0|w zgjEi2w6cfG7LIkmg>t)FWGyxa!#!$<4}nxZu*{O%2?hFl6~vSuTZ_Q zi{IfC`QhIORy;HN|2~@x5t^am~*HiGA(B zg_?ugyuc6n%;scldRp!VCX6EMMzH`r_*|n*^$fZ>aF&Z+rwhktCb;xGZX#o2SHNQh z6SNPe(IapJLMH{bL?4gzEeJ!b;>s}2z(|F)48ed50o{NJ`h%T;P!c*ICm^jaT;G5_ zkXX739Gt-J0I~53RK~SxOPdW9$T?0f@WUF3^|^I}E+{})rwuxAx~iL&;XC>!9=eV0 z4!VE96ax{3k%|FN2UrT4vU3-X8KkDba%`4*j8pvp(h$a9hOkmd_aT`2SMmuN!oPwL zuq|n8XvNQH%Fy(61}#3g%lcWwMRV4ndf+UFPoeD13l6Qwg3PC literal 0 HcmV?d00001 diff --git a/AssistenteVirtual/AssistenteVirtual/Core/__pycache__/historico.cpython-313.pyc b/AssistenteVirtual/AssistenteVirtual/Core/__pycache__/historico.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..917f130035db823cbf403a3f3009741cc10f5e90 GIT binary patch literal 1925 zcmb_c&2Jl35TE_9ch`xN*l|)w0K561*^0ysQk4(Ul#qfF5Q*e%P?0S~EAPf#WP8nf zPE8PsQaBWHX~c)};LaqD_J$c2h6!W%j(BzD5n8|5MEm}5fNw3zv53pNo>vpO*?{MTKuu@(g9>2#qvRTa9hE>d| zvcucd5ledcx)U@%!VFUw^h0Fpa3CqSDmN>))^4saYL&BLE$-z4rc{_Wl}hO80(e z*T&qDfYJ#a!CUXQPY=U)-P66ocDsV&c5i6(D;vtDy0!RlbXUHFId;fp!Cc-G*rqiJdncDQn~WDwYplMP1@1SagDV3ERnVggiEtP_j#e zWknUp^GxXl#$H55S%e8Ml~LWWvX))MY!T4RYjdbTA2P!wO1_(1DY#b9db6r3>L1Gr{8|FPA{cP_PdwHu+ z`Um#T;aMDCI)v=s$H##jVgRg0`+t@Pjs%cZ*P|-Am_NPSZ2>ll+_JevAj~y+nXyIy z@@oa#Sjn4Hgx$v=Ne7YPFyXkz(DE3RUt?DvLF8DJxVGaM&rKbNB(AH5(xB_+Z_;6H Ag+Fn?S}AhZCh@Yn4z{DVXmjIQ zi3i{XcqLys@d6w;0AticN1D%Lk7xYZpUvLhh@gG_^-%kakRNe!-4dJ}p}YGCl1OMt z2OJ>Aw546b6CesyB9lwtOy)9`*%#ocWN%4X{KP6!LSQG>e8O>j^5*61#qq1>ix6O)7KgUO@QiSC^jy)S7< zJ0n#aicUEvmdaT`9%UY~y46_6S-ldT@7AVUx5{hNJ4{(6eC)k4x>hdaSH(77s7yIF z>tnMn?5wo&#_HPG9CN&|%B>Ba9a68(z4=b;KCb^hs2^AFkhiPsM)arEQ*+k0Mo5QI z?W$wvun*Ev)y!B`X)#@2gdL>T3A@k&6(#NtLIDgYEg<__FbWj1Kl>>IdlOS7%*!mW zB?@Gt2z+;D`VV?JMOmDU`r9Hx-20!@HMoImp*X~++O+CPd?6RV)0m85L`Rg}`Uk5z BmN@_b literal 0 HcmV?d00001 diff --git a/AssistenteVirtual/AssistenteVirtual/Core/__pycache__/ia.cpython-313.pyc b/AssistenteVirtual/AssistenteVirtual/Core/__pycache__/ia.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..70885c1e0f783040dd7c99680a690c858735bedf GIT binary patch literal 1049 zcmZuwK~EDw6rS0g-EEqzjN7rSZg=aU=xxylaOfi;;jk(0B0JI2)<-@zW3(MH{ZN@a}Zh3>|}`DFHqL3s`UwEI%b7d*FCISYoI>l#XXW3Td z(qq%asEY3hL8&PZ*ub49TjOF2Nu~u3Nhz!Yi#w<18;yBIQ z&`(m#$O$?f%~lOheTmHYzrOS=lvgZmT=CSrYIgi*UYBCbwL^Zc{Bvl#xmF0 z4hu*nt#CwrmvF=Oy?}TDM_Y{0R~KCuS8(Q5_GaeJ`#C2S)wnp1^T9o!C4tTrmSE?=v9N%MHw<*Da+;-D6|0!yqPT7zp@da^p^s~U*xzSTN=h1^wC@)3;xw#4 zDRbOyT$uG=c&?92tS}?aQJ7{-a0`j#kwb$m?20fY1qWxVJ3J~>S1>I)nDz-u(dmG_ z5x*K}7|GDM)VR?7Hu`Pw`qy~advE{p{66Ywpq@JF4^jV~bAU$wdY`txjD}Zd4$$n+ zMECpMcf0k(aF`gbCo*9o)94s#bPhH(kjyrLn$&Cen{6Q8U61vJvA(_4Fm|mT8wq10 z_1IV#8>`JV+LN`1M?!~q8O!MiM`iIisO(wZKI3~&oN`vY07m6YPIkNBpP(>n;DvHLjqXopwHf)1=bNoGeMxMg@06m151%8ZOe zSbkzv!pF%(&5}%wlY)O$a;cKk>eQ&DNOhVFK}aifqIsbeE6<*v{iu3-=dPRb6%coS#(`n&2_<|<_dw9NEx8zYS6 zkfwh}Y2Js++G=2Z|8@i8GWj`0Tk+c>9VF1eBD4b*F zv*4602%Hwq$t8w!a)4@-(Wo)qz1Rg24VMqljn=+s`UP+R&Ib+<)|`8n`)dw>=dtHv zS*_I^i1$j@jNv;;`8HS_{(HcQ#NE1NB2fvj2sm{W*sDU>>s?{OXw+%+~7Kj)}z@;|c{+k4jRUwQBOO*?SZ=@g4J}c oGrrV8-Amm@^uZWjbk09?kJ-EiB0>?=8+kGG(8e*@0=?b&4~4ODwg3PC literal 0 HcmV?d00001 diff --git a/AssistenteVirtual/AssistenteVirtual/Core/__pycache__/voz.cpython-313.pyc b/AssistenteVirtual/AssistenteVirtual/Core/__pycache__/voz.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7baae16ae5c700748b5ebb632cc52b63bcdf231a GIT binary patch literal 2354 zcmah~&2Jk;6rbJo+H0@vIB}91XzESVk60wBLK}&uq?HK;Aw)o4xfO~fYw=E;EzYhr zyH48BsyVi4A-#YsK}9N%TKEfk4Y^mgV&t&Rp#m;F5s^btd*O}k^}0aSS$XDt&6}C` z-tT!Y6bc|1{s$+uKZ6MUP8nzLEn=^qLFg+aBboUCk><(}w!w3R%djcI+2XDT(L{?O zdl`zOrnoqoV-lX3WkJUJyg^2!$20^bn$_QK-;~Z0Vn~W1%_#+iOiBp>Vs8lq zFItApV3USXlI*G6WF~E5VrB?2wZfv3dB<4N3x=YanQ24CnWSlIriJ04a~iQqN&&$^p)y&Ik&Q zUx1T;5RD+mKZW=l#4C;@_-3v)VKNAG$Lj*_?l|mkK}nn`(dX@c_vH`LN2NtgSBl0cIL zBcdwcPbvZ!7l|UNSORB@%I4k8?+qK3XiKM{odH&&K+#ogEFs#gN$kLfT8p$2m+f8&lK^CDY2z86>MLe5%3jtZrx~w!MW0>g))$&+FPU&gKmxUjXnI zj3o@7O-mt`xujY1Hdnwpp?xdivAG2;XY)!))eJ&2W&4+u&v16hAgW0lrUZk~RM}ky z1d3$Ao)~lVf;11W!Oz@;X$9^0#kGOeft&I2G(}%HUK6ASHb<+%=)K(iWJLh#^iE`d zJu*}Ua87SUhOhBYd?@hBZXm?>G&G~t$ml(MKVONARwD0S**QHM_%&sk%5+6^GW}uZv?Ja3sCxU`;sqYghME^8mc#>xpR(x6zv%n(jkCzbV4J=?P5t z_%{1O(}%c3*!C4KS(bV6gxzBnG0x3rTM?)ALZIT|pAaTHka7}12=!}wG+nbun3AH2 zt&btim{`yf^DaYtRLyE?qc=7J{3F@}8EU3Lcx%B>O9gzIya6&Oe`J0R6Err4d5FRf zQT!nicfBamvvy_m%8jcl!R@a8wacrQ%kOP<9Rdyo>nK)5v2y=t v@2mRZ~e%q>=-6LgKa<#tMVTHl4(I;^8L{Xq literal 0 HcmV?d00001 diff --git a/AssistenteVirtual/AssistenteVirtual/Core/comandos.py b/AssistenteVirtual/AssistenteVirtual/Core/comandos.py new file mode 100644 index 0000000..3277ae0 --- /dev/null +++ b/AssistenteVirtual/AssistenteVirtual/Core/comandos.py @@ -0,0 +1,101 @@ +import webbrowser #? Importa o modulu que permite que o python abra urls no navegador, como youtube etc +import datetime #? módulo de data/hora +import os #? módulo do sistema operacional +from googleapiclient.discovery import build #? importa a função build da biblioteca googleapiclient. Esta função é crucial para conectar seu código à API de Dados do YouTube. +import pyautogui #? Importa biblioteca que simula comandos do teclado +import time #? Importa biblioteca com funçoes de tempo + +YOUTUBE_API_KEY = "AIzaSyCPtKQkPYuKihl1RRmNsEe9HFfy-b7ZxMw" +youtube = build("youtube", "v3", developerKey=YOUTUBE_API_KEY) #? Cria um objeto chamado youtube que será usado para fazer todas as chamadas à API, meio que o telefone para ligar para o servidor + + +def abrir_youtube(): + webbrowser.open("https://www.youtube.com/") + return "Abrindo YouTube." + +def Pausar_video(): #? Função que pausa o video do youtube + pyautogui.press("k") + return "" + +def fechar_aba_atual(): #? Função que vai fechar a aba atual do youtube para abrir outra + pyautogui.press("ctrl", "w") + return "" + +def abrir_google(): + webbrowser.open("https://www.google.com.br/index.html") + return "Abrindo Google." + + +def dizer_hora(): #? pega a hora atual e retorna uma string formatada. + agora = datetime.datetime.now().strftime("%H:%M") #? retorna um objeto datetime com data e hora atuais e converte esse objeto em uma str formatada, %H = hora com 2 dígitos, %M = minuto com 2 dígitos + return f"Agora são {agora}" + + +def abrir_programa(caminho): #? abre um programa no Windows pelo caminho completo. + try: + os.startfile(caminho) + return f"Abrindo programa em: {caminho}" + except Exception as e: + return f"Erro ao abrir o programa: {e}" + + +def buscar_video(termo): #? Busca o primeiro vídeo correspondente ao termo. + req = youtube.search().list( #? constrói a requisição para a API + q=termo, #? termo de busca + part="snippet", #! especifica que quer o trecho snippet dos resultados (título/descrição). + maxResults=1, #? pede só 1 resultado + type="video" #? restringe a busca a vídeos (não playlists ou canais) + ) + + res = req.execute() + + if not res["items"]: #? resposta da API tem uma estrutura JSON; se nada for encontrado, none em caso de erro e tals + return None + + video_id = res["items"][0]["id"]["videoId"] + return f"https://www.youtube.com/watch?v={video_id}" + + +def abrir_video(termo, fechar_anterior=True): + if fechar_anterior == True: + fechar_aba_atual() + time.sleep(0.5) + url = buscar_video(termo) #? chama a função para obter a url. 1- envia a requisição para a API do YouTube, 2- recebe a lista de resultados, 3- pega apenas o primeiro vídeo retornado, 4- extrai o videoId, 5- e monta a url(exempli: https://www.youtube.com/watch?v=VIDEO_ID_AQUI) + + if not url: + return "Não encontrei esse vídeo. Verifique o nome ou sua API KEY." + + webbrowser.open(url) + return f"Reproduzindo {termo} no YouTube." + + +def interpretar_comando(texto): + texto = texto.lower() #? Deixa tudo em minusculo + + comandos_musica = ["tocar", "ouvir", "música", "reproduzir"] #? Palavras chaves para exexutar a função + + for cmd in comandos_musica: #? Faz loop dentro da lista de palavras de ativação + if cmd in texto: #? Procura essa palavra no testo que vc falou + indice = texto.find(cmd) #? ele pega o indice aonde esta a plavra de ativação + termo_busca = texto[indice + len(cmd):].strip() #? e pega o texto a frente(exemplo: tocar ride, ele pega ride para pesquisar) + + if termo_busca: + return abrir_video(termo_busca) + else: + return "Qual música você quer ouvir?" + + # ---------------------------------- + # 📌 Comandos básicos + # ---------------------------------- + if "youtube" in texto: + return abrir_youtube() + elif "google" in texto: + return abrir_google() + elif "pausar" in texto: + return Pausar_video() + elif "hora" in texto: + return dizer_hora() + elif "calculadora" in texto: + return abrir_programa("C:\\Windows\\System32\\calc.exe") + + return None diff --git a/AssistenteVirtual/AssistenteVirtual/Core/historico.py b/AssistenteVirtual/AssistenteVirtual/Core/historico.py new file mode 100644 index 0000000..e57cdcf --- /dev/null +++ b/AssistenteVirtual/AssistenteVirtual/Core/historico.py @@ -0,0 +1,33 @@ +import json # ? importa biblioteca para salvar e carregar estruturas python em JSON +import os # ? Importa funçoes relacionadas ao sistema + +CAMINHO_HISTORICO = "C:/Users/rrsilva/Downloads/Code/Assistente/data/Historico.json" + +def carregar_historico(): # ? Carrega o historico do arquivo JSON + if os.path.exists(CAMINHO_HISTORICO): # ? Verifica se o ficheiro data/historico.json existe. Se não existir, a função vai retornar uma lista vazia no final. + try: + with open(CAMINHO_HISTORICO, "r", encoding="utf-8") as f: # ? Abre o ficheiro em modo leitura ("r") com codificação UTF-8. + return json.load(f) + except json.JSONDecodeError: + return [] + return [] + + +def salvar_historico(historico): # ? recebe a lista historico e a grava no ficheiro JSON.. + with open(CAMINHO_HISTORICO, "w", encoding="utf-8") as f: # ? Abre o ficheiro em modo escrita ("w"), + json.dump(historico, f, ensure_ascii=False, indent=2) + + +def adicionar_mensagem(historico, role, content): # ? Adiciona nova mensagem ao historico. + historico.append({"role": role, "content": content}) # ? Acrescenta um dicionário com as chaves role e content à lista historico. Exemplo: {"role": "user", "content": "Olá"}. + + if len(historico) > 50: # ? Se o tamanho do histórico exceder 20 entradas, + historico.pop(0) # ? remove a primeira (mensagem mais antiga) + + salvar_historico(historico) + return historico + + +def limpar_historico(): # ? Apaga todo o historico + if os.path.exists(CAMINHO_HISTORICO): + os.remove(CAMINHO_HISTORICO) diff --git a/AssistenteVirtual/AssistenteVirtual/Core/ia.py b/AssistenteVirtual/AssistenteVirtual/Core/ia.py new file mode 100644 index 0000000..e9b5401 --- /dev/null +++ b/AssistenteVirtual/AssistenteVirtual/Core/ia.py @@ -0,0 +1,42 @@ +from groq import Groq #? 📌 Importa a classe groq que é responsável por fazer chamadas para o endpoint +from Config.keys import GROQ_API_KEY #? 📌 Esta importando a variavel/chave do arquivo ja criado da past config +from Core.Personalidade import SYSTEM_PROMPT + +client = Groq(api_key= GROQ_API_KEY) #? 📌 Equivale a abrir a conexão para chamar a API. + +def chamar_ia(mensagem, historico=None): #? 📌 função que recebe o texto que o usuario digitou e a lista de mensagens anteriores + if historico is None: #? 📌 Se for a primeira vez chamando a função, ainda não existe histórico entap cria uma função + historico =[] + + mensagens_para_api = [{"role": "system", "content": SYSTEM_PROMPT}] #? Criamos uma lista Nova para envio começando sempre coma personalidade + mensagens_para_api.extend(historico) #? Adicionamos todo o histórico da conversa (User + Assistant anteriores) + mensagens_para_api.append({"role": "user", "content": mensagem}) #? # 3. Adicionamos a pergunta ATUAL do usuário + + resposta = client.chat.completions.create( #! Chama o endpoint chat/completions + model="llama-3.1-8b-instant", #! Passa o modelo + messages=mensagens_para_api #! Envia as mensagens (histórico + nova) + ) + + texto = resposta.choices[0].message.content #! Pega só o texto que a IA gerou + return texto + + +''' + A resposta da Groq vem dentro de um array choices. +1-Você pega a primeira resposta (0) +2-Depois pega o atributo message +3-E por fim pega somente o texto (content) + +💡 Exemplo da estrutura real: +{ + "choices": [ + { + "message": { + "role": "assistant", + "content": "Olá! Como posso ajudar?" + } + } + ] +} +''' + \ No newline at end of file diff --git a/AssistenteVirtual/AssistenteVirtual/Core/voz.py b/AssistenteVirtual/AssistenteVirtual/Core/voz.py new file mode 100644 index 0000000..9e4fdbc --- /dev/null +++ b/AssistenteVirtual/AssistenteVirtual/Core/voz.py @@ -0,0 +1,47 @@ +import pyttsx4 #? Importa biblioteca para sintese de voz +import speech_recognition as sr #? Importa biblioteca que converte oque eu falo em texto +import time #? importa biblioteca com funcoes relacionadas ao tempo + +# Inicializadores +reconhecedor = sr.Recognizer() #! Objeto que gerencia a captura/interpretacão de áudio +sintetizador = pyttsx4.init('sapi5') #? Inicializa o engine do pyttsx4 e escolhe o driver sapi5 +sintetizador.setProperty('rate', 220) #? Ajusta a velocidade de fala (palavras por minuto). +sintetizador.setProperty('volume', 1.0) #? Define o volume da fala; 1.0 + +voices = sintetizador.getProperty('voices') #? Recupera a lista de vozes disponíveis do engine +sintetizador.setProperty('voice', voices[0].id) #? Define a voz a ser usada; aqui usa a primeira voz disponível + + +def falar_texto(texto): #? Converte texto em voz + texto = (f"Senhor, {texto}") #? (adiciona no início) a string "Senhor, " ao texto recebido + if not texto.strip(): #? Verifica se texto está vazio ou contém só espaços(strip() remover espaços em branco nas extremidades). Se estiver vazio, vai evitar tentar falar algo.) + return + try: + time.sleep(1) #? Pausa de 1 segundo antes de falar + sintetizador.say(texto) #? Faz o computador falar. + sintetizador.runAndWait() #? Bloqueante: espera terminar de falar + except Exception as e: + print(f"❌ Erro ao falar: {e}") #? Captura qualquer exceção que ocorra dentro do try (por exemplo, problema com driver de áudio) + + +def ouvir_microfone(): #? Ouvindo o microfone e retornando texto transcrito + with sr.Microphone() as mic: #? Cria um objeto que representa o dispositivo de microfone do seu computador. as mic significa: dê o nome mic a esse objeto do microfone. + print("🎤 Ouvindo...") + reconhecedor.adjust_for_ambient_noise(mic, duration=1) #? Ajusta o ruído + audio = reconhecedor.listen(mic) #? grava até detectar silêncio + + try: + texto = reconhecedor.recognize_google(audio, language="pt-BR") #? Usa o sistema de voz do Google grátis para converter áudio → texto + print(f"Você disse: {texto}") + + wake_word = "jarvis" #? palavra de ativação + + if texto.lower().startswith(wake_word): #? Verifica se o texto transcrito, em letras minúsculas, começa com a wake word + return texto[len(wake_word):].strip() #? Remove o nome antes de mandar pra IA, Retorna a parte do texto após a wake word: usa slicing para pular os primeiros caracteres + else: + print("Aguardando palavra de ativação") + return "" + except: + print("❌ Não entendi.") + return "" + diff --git a/AssistenteVirtual/AssistenteVirtual/data/Historico.json b/AssistenteVirtual/AssistenteVirtual/data/Historico.json new file mode 100644 index 0000000..fb8438c --- /dev/null +++ b/AssistenteVirtual/AssistenteVirtual/data/Historico.json @@ -0,0 +1,82 @@ +[ + { + "role": "user", + "content": "me fodendo que não funcionou" + }, + { + "role": "assistant", + "content": "Parece que estamos em um loop de expressões idiomáticas frustrantes!\n\nVou tentar mudar de assunto e criar um novo fluxo de conversa. Você está se sentindo frustrado ou estressado em algum momento da sua vida? Quer falar sobre isso?" + }, + { + "role": "user", + "content": "pode perguntar qualquer coisa" + }, + { + "role": "assistant", + "content": "Você está se sentindo um pouco como um boneco de palavras!\n\nVamos fazer algo diferente. Qual é o seu hobby favorito? É ler, jogar videogame, praticar esportes, cozinhar ou algo completamente diferente?\n\n(Vou perguntar algo que seja simples e fácil de responder!)" + }, + { + "role": "user", + "content": "cinema" + }, + { + "role": "assistant", + "content": "Parece que estamos nos afundando no cinema!\n\nVamos dar um salto e criar um novo cenário. Se você estivesse em um filme de cinema, qual seria o seu papel? Você seria um herói que salva o mundo, um vilão que busca o poder, um personagem comum que se encontra em um mundo de fantasia, ou algo completamente diferente?\n\n(Vamos criar uma nova história!)" + }, + { + "role": "user", + "content": "no Instituto res" + }, + { + "role": "assistant", + "content": "Parece que estamos em X-Men!\n\nNo Instituto Charles Xavier, você é... Magneto, o líder dos mutantes com poderes sobre a magnetização?\n\n(Vamos explorar a realidade de X-Men!)" + }, + { + "role": "user", + "content": "Instituto ha" + }, + { + "role": "assistant", + "content": "Parece que estamos em um loop de \"Instituto ha\"!\n\nVamos dar um salto e criar um novo cenário. O Instituto que você está me perguntando sobre... é o Xavier Institute para jovens superdotados em X-Men ou é outro tipo de instituição?\n\n(Vamos tentar entender o que você está perguntando!)" + }, + { + "role": "user", + "content": "conte uma piada" + }, + { + "role": "assistant", + "content": "Parece que estamos em um loop de \"conte uma piada\"!\n\nVou tentar contar uma piada:\n\nPor que o PC foi ao doutor?\n\nPorque estava com um problema de \"processamento\"!\n\n(Espere um minuto, vou tentar novamente!)\n\nPor que o homem levou um cavalo para o bar?\n\nPorque queria um sério \"tratamento\"!\n\n(Espere, vou tentar mais uma vez!)\n\nPor que o cientista abandonou a pesquisa sobre os gatos?\n\nPorque os resultados eram um \"purr-blemo\"!\n\n(Vamos ver se a próxima piada funciona!)" + }, + { + "role": "user", + "content": "Jarvis Pará" + }, + { + "role": "assistant", + "content": "Parece que estamos em um loop de \"Jarvis Pará\"!\n\nVou tentar entender... Você está se referindo a Edgar Jarvis, o assistente lógico de Tony Stark em Iron Man?\n\n Ou talvez você esteja se referindo a Pará, um estado da Amazônia brasileira?\n\n Ou talvez seja algo completamente diferente?\n\n(Vamos tentar encontrar o que você está procurando!)" + }, + { + "role": "user", + "content": "Quantos graus está fazendo hoje" + }, + { + "role": "assistant", + "content": "Parece que estamos em um loop de \"quantos graus está fazendo hoje\"!\n\nInfelizmente, eu não tenho acesso a informações em tempo real, então não posso fornecer a temperatura atual. Além disso, eu não sei onde você está, portanto, não consigo informar a temperatura local.\n\nSe você quiser saber a temperatura, eu sugiro verificar um site de notícias online, um aplicativo de clima ou um localizador de temperatura em sua região." + }, + { + "role": "user", + "content": "você tem acesso para acessar esse site e verificar informação" + }, + { + "role": "assistant", + "content": "Eu tenho acesso limitado a informações online, mas não posso acessar sites específicos nem verificar informações em tempo real da mesma forma que um navegador ou um search engine.\n\nNo entanto, posso tentar encontrar a resposta de forma indireta. Poderia você me dizer qual é a sua localização ou qual é o tipo de informação que você está procurando (por exemplo, temperatura em uma cidade específica, temperatura global, previsão do tempo, etc.)?\n\nEssa informação pode me ajudar a procurar por informações relevantes e fornecer uma resposta aproximada." + }, + { + "role": "user", + "content": "eu quero saber a temperatura do Rio de Janeiro eu moro na Taquara" + }, + { + "role": "assistant", + "content": "Entendi melhor agora!\n\nSe você está em Taquara, que é uma cidade localizada no estado do Rio de Janeiro, Brasil, eu posso tentar encontrar a temperatura atual para você.\n\nNo entanto, como eu disse anteriormente, eu não tenho acesso ao tempo real. Mas posso sugerir algumas opções para que você possa saber a temperatura atual de Taquara ou do Rio de Janeiro:\n\n1. Verifique o aplicativo do tempo no seu telefone: você pode baixar aplicativos como ClimaTem, Tempo, ou Weather Channel que fornecem previsão de tempo e temperatura atual.\n2. Visite o site do National Weather Service (NWS) da América do Norte, que fornece informações sobre temperatura e previsão de tempo para locais em todo o mundo.\n3. Verifique no Google: você pode simplesmente digitar \"temperatura atual de Taquara\" ou \"temperatura atual de Rio de Janeiro\" e o Google fornecerá a informação mais recente disponível.\n\nInfelizmente, eu não tenho acesso a essas informações em tempo real, então não posso fornecer a temperatura atual para você.\n\nMas posso sugerir que você verifique um dos métodos acima para saber a temperatura atual de Taquara ou do Rio de Janeiro!" + } +] \ No newline at end of file diff --git a/AssistenteVirtual/AssistenteVirtual/data/__pycache__/historico.cpython-313.pyc b/AssistenteVirtual/AssistenteVirtual/data/__pycache__/historico.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4840fd37d7e99e5f1bf1c5f589cdb31b394b6b20 GIT binary patch literal 1918 zcmb_c%}*Ow5TE_9ch_LRjv+0y#o?o2qk_XB;zJ23C9R-ULGlJEl`Wx_y%<-v*L}~# zrK%8V4{4FApnj-1=16+VF};=k1%bK+Z8%hFF5D2V6p3Csvv_Scs(R|Ic6Q!-GxKKW zH#5~>FaStjt&C?C8Q>3EcqG<@>SYwZ0|N}J8i|LInVNvRVZ1pv{^D^E4Z>* zHf4`|$n8R^7KHopBbV^4h6Rc!Q9p}&vDSA0;=ZOuO-zsnm#&}(qM@@7nD~>gK|-r7 zp`mHupBmDHBtiiaZnj7#-s)*KzJ0I=o?k9vzVNwHi!2HQ5X1KZyivb1jWH~XQRsyz zK6H9b>V;+DLi0Us4ga2`fQkP`7F_H_tL2)VF3&pxJN2!WmWRh53XWh;9GUX&$OMto{;shwf5SpI z*4vEPOcxwsnPc1#b*`o+lPpTo~;>Py5N9DcH^`Ax$&-Z-4_VwC> z&^MnxmmvJ6up7F5tU_zs#@us_)|LADuRndz5!r9=-)--&f}nLCgd>}?#}Z1Xd<1X( zp?!K7e(aj=k#^cO6nA<8)0dQ;L5bu`E+6iC%P;-x6OgAU6CSB3xYhX?3Rs=>vqZf* zn`%i&V85MFyk3>w4nQB=5)AAq!#^QM-AZb%rObcSQO2tV1*@UVs0$cf@Xis1p^Hwd zRp6`4S~7Vmn|1uzLK>S-ml;(wYatdy=E&*Qd=b^P20k6Q&&f+P%0i^m!A8qv6*hzs(QCgbB zGENajy;O$HbT*Z>3z*G30%T^aJnKURa?B@?ZNPyX+?OM}a^!w`w{xr_k3UlaUrcW6=wf=So5=p>IobowbD1!G zf%=+eYa`tm$bc@)>pn&%jOH+-Ve1y8<7ZahzHL1O)=zt9wU^80i~p#-i+JWHb_j)k zA0LNmfC{h@?*COCIF>-wU5~or*8JJsZVS*Ta$$2pVC0&;POK4tdNpsSS98`Bqx+~N p`5-bJCW7!3TAqUTd*tR52%X4^&~_3Lg{c!&5jv}3Q5baH{0%BcX;J_H literal 0 HcmV?d00001 diff --git a/AssistenteVirtual/AssistenteVirtual/main.py b/AssistenteVirtual/AssistenteVirtual/main.py new file mode 100644 index 0000000..1ed8b58 --- /dev/null +++ b/AssistenteVirtual/AssistenteVirtual/main.py @@ -0,0 +1,31 @@ +from Core.voz import ouvir_microfone, falar_texto +from Core.ia import chamar_ia +from Core.comandos import interpretar_comando +from Core.historico import carregar_historico, adicionar_mensagem + + +historico = carregar_historico() # ? Hisótico da conversa + +print("Assistente iniciado. Diga 'PARAR' para encerrar.") + +while True: # ? Loop infinito que mantém o assistente escutando até receber o comando de encerrar (break). + + comando = ouvir_microfone() # ? Chama a função eque pega oque vc fala e retorna o texto transcrito(string) e associa a variavel + if comando == "": # ? Se a função retorna "", então continue reinicia o loop sem processar nada. + continue + + if "parar" in comando.lower(): #? Se ele indenticar parar no que o usuario falar, ele interrompe o loop com o break e chama a função que converte texto em voz. + falar_texto("Encerrando assistente. foi um prazer auxiliá-lo SENHOR Ruan.") + break + + resposta_comando = interpretar_comando(comando) # ? Ele chama função que abre as urls e apps de acordo com a palavra chave q a gente fala, se a funçlãoindetificar a palavra chave vai abrir, exemplo o youtube + if resposta_comando: # ? e vai retornar um texto (Exemplo: ("Abrindo Youtube...")) + falar_texto(resposta_comando) + continue + # ? Se não for comando direto, enviar para a IA + resposta_ia = chamar_ia(comando, historico) # ? Vai adicionar assim no meu historico.json historico.append({"role": "user", "content": comando}), comando é oque eu falei + adicionar_mensagem(historico, "user", comando) # ? e depois vai adicionar nese formato porem a resposta da ia + adicionar_mensagem(historico, "assistant", resposta_ia) + + # ? Falar a respsota da IA + falar_texto(resposta_ia)