From 808c5b87ad1cb8c29773803b6bc2d42632fae371 Mon Sep 17 00:00:00 2001 From: omegaui Date: Sun, 1 Jan 2023 12:46:00 +0530 Subject: [PATCH] =?UTF-8?q?Public=20Preview:=20=F0=9F=9A=80=20Live=20Mode,?= =?UTF-8?q?=20a=20rough=20structure=20is=20prepared=20until=20fluent=20fun?= =?UTF-8?q?ctionality=20is=20implemented=20#5!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/modules.xml | 1 + live_mode_manager.py | 2 + live_mode_setup.py | 4 -- lvc_gui_flutter/lib/main.dart | 1 + main.py | 67 +++++++++++++++++++++++++++++++--- misc/execution-feedback.mp3 | Bin 4608 -> 4896 bytes misc/exiting-feedback.mp3 | Bin 14016 -> 14016 bytes misc/greeting.mp3 | Bin 5568 -> 5568 bytes 8 files changed, 65 insertions(+), 10 deletions(-) diff --git a/.idea/modules.xml b/.idea/modules.xml index 80d5e66..57775d3 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -4,6 +4,7 @@ + \ No newline at end of file diff --git a/live_mode_manager.py b/live_mode_manager.py index 1b8b8a9..20ad82f 100644 --- a/live_mode_manager.py +++ b/live_mode_manager.py @@ -4,6 +4,7 @@ import numpy as np import soundfile + threshold = [] trainingDataSet = [] @@ -51,3 +52,4 @@ def compare(): print(distance) return distance <= threshold + diff --git a/live_mode_setup.py b/live_mode_setup.py index bdeaed2..80ea501 100644 --- a/live_mode_setup.py +++ b/live_mode_setup.py @@ -129,10 +129,6 @@ def compare(key1, key2): for key in training_data_set: frames = b''.join(training_data_set[key]) - file = open(f'training-data/live_mode_training_data{key}.bin', 'wb') - file.write(frames) - file.close() - wf = wave.open(f'training-data/live_mode_training_audio{key}.wav', 'wb') wf.setnchannels(2) wf.setsampwidth(pyAudio.get_sample_size(pyaudio.paInt16)) diff --git a/lvc_gui_flutter/lib/main.dart b/lvc_gui_flutter/lib/main.dart index c9dc93a..f6a8c8f 100644 --- a/lvc_gui_flutter/lib/main.dart +++ b/lvc_gui_flutter/lib/main.dart @@ -16,6 +16,7 @@ Future main() async { appWindow.minSize = initialSize; appWindow.size = initialSize; appWindow.alignment = Alignment.center; + appWindow.position = Offset(200, 200); appWindow.show(); }); diff --git a/main.py b/main.py index 2b05039..2e82f8e 100755 --- a/main.py +++ b/main.py @@ -28,6 +28,8 @@ print('unable to create training directory') exit(1) +# initializing PyAudio ... +pyAudio = pyaudio.PyAudio() def log(text, color=None, attrs=None): if attrs is None: @@ -70,9 +72,6 @@ def main(model='base', ui='false'): WAVE_OUTPUT_FILENAME = "misc/last-mic-fetch.wav" # default file which will be overwritten in every RECORD_SECONDS SPEECH_THRESHOLD = config_manager.config['speech-threshold'] # speech threshold default 4000 Hz - # initializing PyAudio ... - pyAudio = pyaudio.PyAudio() - # Opening Microphone Stream with above created configuration ... stream = pyAudio.open(format=FORMAT, channels=CHANNELS, @@ -106,11 +105,13 @@ def main(model='base', ui='false'): # well, this is under development, # I don't recommend activating live mode until it is ready! if config_manager.config['live-mode']: + voice_feedback.speak("initializing live mode ...", wait=True) live_mode_manager.init() + voice_feedback.speak("say my name to trigger actions ...", wait=True) while True: frames = [] chunk_array = array('h') - log("listening ...", "blue", attrs=["bold"]) + log("sleeping ...", "blue", attrs=["bold"]) for i in range(0, int(44100 / 1024 * 2)): data = stream.read(1024) frames.append(data) # stacking every audio frame into the list @@ -134,9 +135,11 @@ def main(model='base', ui='false'): log("comparing ...", "blue", attrs=["bold"]) if live_mode_manager.compare(): - voice_feedback.speak('yes sir!', wait=True) - exit(0) + voice_feedback.speak('match test succeeded', wait=True) + log("listening ...", "blue", attrs=['bold']) + listen_for_live_mode(stream, audio_model, CHUNK, FORMAT, CHANNELS, RATE, RECORD_SECONDS, WAVE_OUTPUT_FILENAME, SPEECH_THRESHOLD) else: + log('live mode: match test failed!', "red", attrs=['bold']) voice_feedback.speak('match test failed!', wait=True) frames.clear() @@ -206,5 +209,57 @@ def analyze_text(text): command_manager.launch_if_any(text) +def listen_for_live_mode(stream, audio_model, chunk, audio_format, channels, rate, record_seconds, wave_output_filename, speech_threshold): + frames = [] + chunk_array = array('h') + log("listening ...", "blue", attrs=["bold"]) + for i in range(0, int(rate / chunk * record_seconds)): + data = stream.read(chunk) + frames.append(data) # stacking every audio frame into the list + chunk_array.extend(array('h', data)) + chunk_array = trim(chunk_array) + if len(chunk_array) == 0: # clip is empty + log('no voice') + return + elif max(chunk_array) < speech_threshold: # no voice in clip + log('no speech in clip') + return + print("saving audio ...") + + # writing the wave file + wf = wave.open(wave_output_filename, 'wb') + wf.setnchannels(channels) + wf.setsampwidth(pyAudio.get_sample_size(audio_format)) + wf.setframerate(rate) + wf.writeframes(b''.join(frames)) + wf.close() + + # checking if master control mode is enabled + # and performing audio analysis if enabled + if config_manager.config['master-mode']: + log('performing master mode analysis ...', "green", attrs=['bold']) + if not isMasterSpeaking(): + log('performing master mode analysis ... failed', "red", attrs=['bold']) + if config_manager.config['master-mode-barrier-speech-enabled']: + voice_feedback.speak(config_manager.config['master-mode-barrier-speech'], wait=True) + return + log('performing master mode analysis ... succeeded', "green", attrs=['bold']) + voice_feedback.give_transcription_feedback() + log("transcribing audio data ...") + # transcribing audio ... + # fp16 isn't supported on every CPU using, + # fp32 by default. + result = audio_model.transcribe(wave_output_filename, fp16=False, language='english') + + log("analyzing results ...", "magenta", attrs=["bold"]) + # analyzing results ... + analyze_text(result["text"].lower().strip()) + + frames.clear() + + + + + # spawning the process main() diff --git a/misc/execution-feedback.mp3 b/misc/execution-feedback.mp3 index 7c35885818218f10fbfa574f7575ca7576aeb128..470251418629822dce81f99b16b3d9c0ca4784f6 100644 GIT binary patch literal 4896 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 literal 4608 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 ez|caYYzI&yRBb_@y?Xmds=En zE)+kb68gAEVd zj6hy>nh zp^>X+AAwFM-%w!MUl+eoMsD231Jv|CzZU`%l(?#PIuU~^$;|8N#!QPAE_%$}-Cv4_ zIFGIR!Cl6k%ysK@f0j9!IcQDp@Z+;}YDonKgdUB)^UdI-O&`cJZvG>fRONc@JkCYR zI_A!7=(PBN8w?MS)Aim@20l+=va{Cif-TjO{pfJ97>-Vj~Chz8z6S2seV)XDgU!3Ji=n4llep)@ifO3O-0V_jZ zi*Q={$GyIC)}t({UV6Dh&s}FeAN4O8A2;Yv*OBXk&Nsvm{9NR`K|2?xJ_Mg`Ufx`l z*(UX}UbY6_F?=OPCOBI*X}GvN(O`Z*OJckZfxp#%Ga^o;?S(Du9upvZg-SiYsYM1$ zxh+qaL?|B`R<1o*-j{K#_IZw!X}FLN+i=l+5%p-0rHU;`!jrH5m1o7x`VsArJJNk) zGoYeZ;#@~qfFx5tBlB$q+M++P0*lJ6w(bS zLf(P?oi$XSs4@&u^EUr_!uG9Ii#T#yM6u);K`;U%r|DFFpA0jF_V7a!^!E396IQI_ zza<pdEDY3U38_#YJAzPL*VxC6)+;-8Px*X zW0;Z1vfZriJqgW}K1;7P80uD|LTh9*?^H_f)UY%$)1C(lOU|evbkNqld1d;w>X7iO zk-b62cTFYb2cS(vl>W9c9C*b&%l&Zmf;RD5Q;LV#@qg`@8^uh5yKKka2ZgagWGvVh z{?SF0=>=}OE8QZ}PsK#d1Lvw3y-a;P@|oEe_;*bk9 z>l`coct8nN8WIZ3@7-!N7k2z9j+iD+tEbWnxcAE+A^oR)odNe#Ws@f?*&>B9{AJH5 zA7NNMU`WLi!9fy2s>=F{mogm8C|u*ejTkT0H z8?0w1C=A4W?z1KYtL0U?S-Du=rGgU_`R^!XVrK?N(W@Wu2dX+j=^X971f7%<*&Z|> z-MQZ6@%KJJrb~64C+?XXL@Zn)FqT^R4-Z%%7Gz_9i2-k4^0a_nowuI{WACM=+&vfd{HZ;Edc;qAqddexQk8zfbRH#TJscVXPj@Gt zQ-7^cR9W3gOZ#iYwcQvGxFTOn#{e?}Sb}s>^dX$*6vqal(ik} zGqrkhR^b6(6!Ll`F!Ra#cK-sY`R|z**Lz^awYeNG7oWBUW9qt+UBEr-}mozpQLi*3y4SMwz=Ye;+Bbp zB|F;%S1E>O4bhR02&T+P@ZGRz90DHBLeV?$h7=tZ@$!dQubYUOZanPIFOfy(zE}IXl^Oc*= z;yuEIA@E+~ZS%L$7$>>IZxME3KNph&>{+9N!jDp9B5SkI&Q;gua_) zxIvIEvraj_f;2kirY+#U&gyDDA$>@Nx z->g@Z0Q}dA0D$loaJeN*S((o~kUf$W&}d-vsg)sdR(qtmC~I!OW3bO7Va-&apkXF! z;<94(10i84D0SQPR5sWt)#|UC^eurE>aZtLH?$k>%Dj@^m778N2uf2M6FiF5&Cx<2ewq-8F2IRHOrvJn6&~UtN zji#MY45;gWbapg~^mAl~aFb`#KZcQT&@dYic=i7PQMbWp!G9)-tmENuaTo#5Wlg#f zuv}_!C1&G$bdWfLssKcQz3~9V(Blfg?gIeXpT?InK4J2Wam89$Z~S)>E=qiq$^%3+@JJGh;^HH#A?=i63Rux730brl$G}j!#NFizx@)9)9F+49>_70H zCCZa;gt~Gpv6|J#%G1=)OdKz+(Xk*`qi}Bw^YF`6EhB4n%SuTnru1qJ8oTIJKk$rfws9d;pf?t zvxZeaDK&jxAD=KAsm8=7h0&{@z`kpZl0L=gvPf1C_Qu{QFYyhWUMW&=bW3N)pWl*r z&O6~9?=?1Jc&=M07Z=cF{*BtUV~hb`0T#Vmt_&P%Vt6SLq_+i?Nz%J4;6O!)bjljZ z?GmzU<;tE^y>%8fH}+f;B}<#FDo|y2f+qYQT?9U1aojo&{oX4Gv{tW)I+>!!x?iTS zf*;e_HEuL@DYg^c_=pD_IeY8nfo)Cf=8K&`=R58lJ#%sAQr^%`@H>x_TSqp9#qv zxk%KFCt2s+UdsMqMP&QEC-8c^15H|NGU1(^?2(y5AIq0~cmPQsSbVv51;=O!`W-ze zq+sYEzk~GFjOUH%RIqg#xGHE|mJk?I(47XQYl?tp$~l_*-RJZNcHe*-y7>f|rG36g zY6(Mi^1xF~n~lhjCsHRtTXy^`!5PG|nHTd0a|y7W z>nz<2N=jF4ekNY?a|?yfr=kxmuLLHjF>Ku|V0(fB*U_u{#ownnS(}Wic+0a1d=zG- zQm2V)u&+Pxb^bDW>-n`~_ECD3W{vOTFhfy6MeP*dWlg)cG^A;@y5^=dU;oaquV1uq z@P!*DnlIx4IGx+&;@AWc=BhYZaYN!`qkYS)&ogQ6F&R%3j)ICU(th09yZGE9tohRs z+y;-$9uCqi35?v)_^TQhn1yI=tDo2;U{hhMlQ%bb@jBztf@}TXF&HI5PbQAvoB$6{ z&`AtkzKAzD%yWDsAMwJdz zgE=<+q1l(&=u?l>`0aFB-<7EpxV?H8=DQ4Te>0GidV&_%6bde+nf5#~DA3AUx0tlT zu)n92e7u%iH%a)od)M9h%amTP(LPV4tF`%KBdIs|d;~Huwibv-V89_Dmupmeov82* z-@I~Cg)e->bW)IoxS5V!Rpu+SL-qnZ|InT%LGeqkcyGh&@9V+Dya?L&OE=ik_bedMm=LZU4WB5=41{SwF^3`EBG!R<#BFROk@5=WOlItFcV+bbX(>8j(67Vl^)NUjqRk~+RgOWY8e8Yj z;3RxJ78=hrSw~46Dji=?Dom71NAjXL)FdXBMvdGV9I80>d{lY7xsLU?am8sU)Je4Q z?thb6NhI_AMj%KRQ>D4XAIxa&hV(hCt0+K^Ohw2*$EtP{NekB0* z8exAW9LMRIYK36ezm4?~YX#OOBs?)?66)rDUqb@8AC*2$m7OU3AbKd<#eUkdHre)U zJ@;jpBPjuzK{Gy|AEA_HN1}rq;6c(8$!`w$zIyldi76h?K^dAA0)1oHwN0)K$K>%N z-tFtWpLhhbsJ}WB60eWMa|+w9fE|mkK6mdN>i3hjA*>y>ds~T=M3gX@3p7-G$wFcg z!iQCohg7qoGx`=l`|a|+0To|@g$mpM{up75(ssrH@8+?#POG_(=5TIDs{Tc?Y`+&K zPnwmyMX4VwRxOoS@zgabKKP!yPX^@b)()H8G7S9gC^BdsUl9&C-ADx6g4k5uEwnfi zav$OAI>7*(Z_J+!>&A>f8ck{V!$`*aVz7HL#F z>T2Jry$Hja z-q*+xMa?^*)iQ+x7FPIuMAnROT&d?pEB6le*llLX=CFk2S)0Kpb^V z#~k)i8K@}Zf3I8$C=<|V667)v_a3AOzfFUmOiY3P4V#)0wGsxpVY=Dov+fVA=7`C) z!!Uj)hDm$bS1*Q^)5j_6!e_nd)a3hU$SKgwbCt!4qe562Ej)0YKJbJH=o!J8VJ}7< z^Sdk+9jcNj--@m{wjlR}N2)fAC*AoB`ob$X=)+Sb-gCXc&6#hqRJs=yv6M+^`YmLs zk-YfCWa61=LhtV_zTF%3Bet8#{LM_1>bom6ct8#%Au$Uu4SCDjb*jg$VV2Ze#;Z)XFGL^1LI01Ml-4*&oF delta 9002 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