From e456d647db597acb47b00b576e4d1560c72a11c0 Mon Sep 17 00:00:00 2001 From: Abraham Date: Tue, 28 Mar 2023 19:03:36 +0500 Subject: [PATCH] PicoVoice added + Hogwarts Legacy assistent test --- _stt.py | 1 + .../A-Knocks_en_windows_v2_1_0.ppn | Bin 0 -> 3504 bytes .../Can-finger_en_windows_v2_1_0.ppn | Bin 0 -> 4360 bytes .../Conceal_en_windows_v2_1_0.ppn | Bin 0 -> 2812 bytes .../Disillusion_en_windows_v2_1_0.ppn | Bin 0 -> 3340 bytes .../Expellee-aramus_en_windows_v2_1_0.ppn | Bin 0 -> 9544 bytes .../In-St-Your_en_windows_v2_1_0.ppn | Bin 0 -> 7528 bytes .../Lady-also_en_windows_v2_1_0.ppn | Bin 0 -> 3140 bytes .../Lumas_en_windows_v2_1_0.ppn | Bin 0 -> 2612 bytes .../Proud-to-go_en_windows_v2_1_0.ppn | Bin 0 -> 5584 bytes .../R-Vail-leo_en_windows_v2_1_0.ppn | Bin 0 -> 3172 bytes .../The-pool-so_en_windows_v2_1_0.ppn | Bin 0 -> 4132 bytes .../aloha-mora_en_windows_v2_1_0.ppn | Bin 0 -> 3304 bytes .../terrifical-status_en_windows_v2_1_0.ppn | Bin 0 -> 6176 bytes stt.py | 2 +- stt_google.py | 34 ++++ stt_picovoice.py | 146 ++++++++++++++++++ stt_vosk.py | 50 ++++++ utils/benchmark.py | 27 ++++ utils/time.py | 15 ++ 20 files changed, 274 insertions(+), 1 deletion(-) create mode 100644 pv_custom_keywords/A-Knocks_en_windows_v2_1_0.ppn create mode 100644 pv_custom_keywords/Can-finger_en_windows_v2_1_0.ppn create mode 100644 pv_custom_keywords/Conceal_en_windows_v2_1_0.ppn create mode 100644 pv_custom_keywords/Disillusion_en_windows_v2_1_0.ppn create mode 100644 pv_custom_keywords/Expellee-aramus_en_windows_v2_1_0.ppn create mode 100644 pv_custom_keywords/In-St-Your_en_windows_v2_1_0.ppn create mode 100644 pv_custom_keywords/Lady-also_en_windows_v2_1_0.ppn create mode 100644 pv_custom_keywords/Lumas_en_windows_v2_1_0.ppn create mode 100644 pv_custom_keywords/Proud-to-go_en_windows_v2_1_0.ppn create mode 100644 pv_custom_keywords/R-Vail-leo_en_windows_v2_1_0.ppn create mode 100644 pv_custom_keywords/The-pool-so_en_windows_v2_1_0.ppn create mode 100644 pv_custom_keywords/aloha-mora_en_windows_v2_1_0.ppn create mode 100644 pv_custom_keywords/terrifical-status_en_windows_v2_1_0.ppn create mode 100644 stt_google.py create mode 100644 stt_picovoice.py create mode 100644 stt_vosk.py create mode 100644 utils/benchmark.py create mode 100644 utils/time.py diff --git a/_stt.py b/_stt.py index efa903d..870cc09 100644 --- a/_stt.py +++ b/_stt.py @@ -13,6 +13,7 @@ model, decoder, utils = torch.hub.load(repo_or_dir='snakers4/silero-models', (read_batch, split_into_batches, read_audio, prepare_model_input) = utils + def callback(_r, audio): try: # CONVERT raw wav data to NumPy array diff --git a/pv_custom_keywords/A-Knocks_en_windows_v2_1_0.ppn b/pv_custom_keywords/A-Knocks_en_windows_v2_1_0.ppn new file mode 100644 index 0000000000000000000000000000000000000000..42a6564bf59d825177b26f2e0362ed9b55b84878 GIT binary patch literal 3504 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 literal 0 HcmV?d00001 diff --git a/pv_custom_keywords/Can-finger_en_windows_v2_1_0.ppn b/pv_custom_keywords/Can-finger_en_windows_v2_1_0.ppn new file mode 100644 index 0000000000000000000000000000000000000000..f9ec755127353444bc651b269934e8148aaaa8b4 GIT binary patch literal 4360 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 W0LxVS_Y4r;hO$AjyIEu>Zw>DRyln&k literal 0 HcmV?d00001 diff --git a/pv_custom_keywords/Expellee-aramus_en_windows_v2_1_0.ppn b/pv_custom_keywords/Expellee-aramus_en_windows_v2_1_0.ppn new file mode 100644 index 0000000000000000000000000000000000000000..58d4a3d413660a23b3eca143938db53a70ad375a GIT binary patch literal 9544 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 literal 0 HcmV?d00001 diff --git a/pv_custom_keywords/In-St-Your_en_windows_v2_1_0.ppn b/pv_custom_keywords/In-St-Your_en_windows_v2_1_0.ppn new file mode 100644 index 0000000000000000000000000000000000000000..f4a1980b3001d62f33028cec360fb3c9e700671c GIT binary patch literal 7528 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 literal 0 HcmV?d00001 diff --git a/pv_custom_keywords/Lumas_en_windows_v2_1_0.ppn b/pv_custom_keywords/Lumas_en_windows_v2_1_0.ppn new file mode 100644 index 0000000000000000000000000000000000000000..c3977d247edacac68550957dd9418a17697e21ad GIT binary patch literal 2612 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 literal 0 HcmV?d00001 diff --git a/pv_custom_keywords/R-Vail-leo_en_windows_v2_1_0.ppn b/pv_custom_keywords/R-Vail-leo_en_windows_v2_1_0.ppn new file mode 100644 index 0000000000000000000000000000000000000000..7ade6b008ae4f7b4f5bc7be8018b7d39b6c4f988 GIT binary patch literal 3172 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 K;$jhOk#3cf literal 0 HcmV?d00001 diff --git a/pv_custom_keywords/The-pool-so_en_windows_v2_1_0.ppn b/pv_custom_keywords/The-pool-so_en_windows_v2_1_0.ppn new file mode 100644 index 0000000000000000000000000000000000000000..f44fcfbca537d3bc4f95fa29c6da9527c251617e GIT binary patch literal 4132 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 literal 0 HcmV?d00001 diff --git a/pv_custom_keywords/aloha-mora_en_windows_v2_1_0.ppn b/pv_custom_keywords/aloha-mora_en_windows_v2_1_0.ppn new file mode 100644 index 0000000000000000000000000000000000000000..19945eca3260f6b278cf4c813b08b92032c13daf GIT binary patch literal 3304 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 literal 0 HcmV?d00001 diff --git a/stt.py b/stt.py index 90631a0..e4aa125 100644 --- a/stt.py +++ b/stt.py @@ -6,7 +6,7 @@ import json model = vosk.Model("model_small") samplerate = 16000 -device = 1 +device = 2 q = queue.Queue() diff --git a/stt_google.py b/stt_google.py new file mode 100644 index 0000000..c1413d4 --- /dev/null +++ b/stt_google.py @@ -0,0 +1,34 @@ +import speech_recognition as sr +from rich import print +from utils.benchmark import Benchmark + +# import speech_recognition as sr +# for index, name in enumerate(sr.Microphone.list_microphone_names()): +# print("Microphone with name \"{1}\" found for `Microphone(device_index={0})`".format(index, name)) +# exit(1) + +# obtain audio from the microphone +r = sr.Recognizer() +r.pause_threshold = 0.5 +with sr.Microphone(device_index=2) as source: + print("Say something!") + audio = r.listen(source) + +bench = Benchmark() + +# recognize speech using Google Speech Recognition +try: + # for testing purposes, we're just using the default API key + # to use another API key, use `r.recognize_google(audio, key="GOOGLE_SPEECH_RECOGNITION_API_KEY")` + # instead of `r.recognize_google(audio)`\ + while True: + bench.start() + recognized_text = r.recognize_google(audio) + end_time = bench.end() + print(f"[light_sea_green]Google Speech Recognition thinks you said[/]: [dodger_blue1]{recognized_text}[/]") + print(f"[grey37]This took[/] [red]{end_time[1]}[/]") + print() +except sr.UnknownValueError: + print("Google Speech Recognition could not understand audio") +except sr.RequestError as e: + print("Could not request results from Google Speech Recognition service; {0}".format(e)) \ No newline at end of file diff --git a/stt_picovoice.py b/stt_picovoice.py new file mode 100644 index 0000000..f3fbf02 --- /dev/null +++ b/stt_picovoice.py @@ -0,0 +1,146 @@ +import time + +import pvporcupine +from pvrecorder import PvRecorder +from rich import print +from utils.benchmark import Benchmark +import keyboard +from utils.time import sleep + +porcupine = pvporcupine.create( + access_key='H2JhXpfLdGYG2wMqvc61tipo0uKZQvwkEfA26CAQQe5n1y7zfZGneQ==', + # keywords=['picovoice', 'bumblebee', 'aloha mora'], + keyword_paths=["./pv_custom_keywords/aloha-mora_en_windows_v2_1_0.ppn", + "./pv_custom_keywords/Expellee-aramus_en_windows_v2_1_0.ppn", + "./pv_custom_keywords/Lumas_en_windows_v2_1_0.ppn", + + "./pv_custom_keywords/Proud-to-go_en_windows_v2_1_0.ppn", + "./pv_custom_keywords/A-Knocks_en_windows_v2_1_0.ppn", + "./pv_custom_keywords/In-St-Your_en_windows_v2_1_0.ppn", + + "./pv_custom_keywords/The-pool-so_en_windows_v2_1_0.ppn", + "./pv_custom_keywords/Lady-also_en_windows_v2_1_0.ppn", + "./pv_custom_keywords/R-Vail-leo_en_windows_v2_1_0.ppn", + + "./pv_custom_keywords/Conceal_en_windows_v2_1_0.ppn", + "./pv_custom_keywords/terrifical-status_en_windows_v2_1_0.ppn", + "./pv_custom_keywords/Disillusion_en_windows_v2_1_0.ppn", + + "./pv_custom_keywords/Can-finger_en_windows_v2_1_0.ppn" + ], + sensitivities=[1] * 13 +) + +# `-1` is the default input audio device. +recorder = PvRecorder(device_index=0, frame_length=porcupine.frame_length) +recorder.start() +print('Using device: %s' % recorder.selected_device) + +bench = Benchmark() + +while True: + bench.start() + pcm = recorder.read() + keyword_index = porcupine.process(pcm) + end_time = bench.end() + + if keyword_index == 0: + print("[gold1]Aloha mora[/]") + print(f"[grey37]This took[/] [red]{end_time[1]}[/]") + + keyboard.press_and_release("f") + elif keyword_index == 1: + print("[bright_red]Expelliarmus[/]") + print(f"[grey37]This took[/] [red]{end_time[1]}[/]") + + keyboard.press_and_release("F1") + sleep(0.05) + keyboard.press_and_release("2") + elif keyword_index == 2: + print("[gold1]Lumos[/]") + print(f"[grey37]This took[/] [red]{end_time[1]}[/]") + + keyboard.press_and_release("F1") + sleep(0.05) + keyboard.press_and_release("1") + + elif keyword_index == 3: + print("[dodger_blue2]Protego[/]") + print(f"[grey37]This took[/] [red]{end_time[1]}[/]") + + keyboard.press("q") + sleep(1/2) + keyboard.release("q") + + elif keyword_index == 4: + print("[gold1]Nox[/]") + print(f"[grey37]This took[/] [red]{end_time[1]}[/]") + + keyboard.press_and_release("F1") + sleep(0.05) + keyboard.press_and_release("1") + + elif keyword_index == 5: + print("[bright_red]Incendio[/]") + print(f"[grey37]This took[/] [red]{end_time[1]}[/]") + + keyboard.press_and_release("F2") + sleep(0.05) + keyboard.press_and_release("1") + + elif keyword_index == 6: + print("[dodger_blue2]Depulso[/]") + print(f"[grey37]This took[/] [red]{end_time[1]}[/]") + + keyboard.press_and_release("F1") + sleep(0.05) + keyboard.press_and_release("4") + + elif keyword_index == 7: + print("[gold1]Levioso[/]") + print(f"[grey37]This took[/] [red]{end_time[1]}[/]") + + keyboard.press_and_release("F1") + sleep(0.05) + keyboard.press_and_release("3") + + elif keyword_index == 8: + print("[dodger_blue2]Revelio[/]") + print(f"[grey37]This took[/] [red]{end_time[1]}[/]") + + keyboard.press_and_release("R") + + elif keyword_index == 9: + print("[dodger_blue2]Accio[/]") + print(f"[grey37]This took[/] [red]{end_time[1]}[/]") + + keyboard.press_and_release("F2") + sleep(0.05) + keyboard.press_and_release("3") + + elif keyword_index == 10: + print("[bright_red]Petrificus Totalus[/]") + print(f"[grey37]This took[/] [red]{end_time[1]}[/]") + + keyboard.press_and_release("f") + + elif keyword_index == 11: + print("[dodger_blue2]Disillusionment Spell[/]") + print(f"[grey37]This took[/] [red]{end_time[1]}[/]") + + keyboard.press_and_release("F2") + sleep(0.05) + keyboard.press_and_release("2") + + elif keyword_index == 12: + print("[bright_red]Confringo Spell[/]") + print(f"[grey37]This took[/] [red]{end_time[1]}[/]") + + keyboard.press_and_release("F2") + sleep(0.05) + keyboard.press_and_release("4") + + #if keyword_index >= 0: + # break + +porcupine.delete() diff --git a/stt_vosk.py b/stt_vosk.py new file mode 100644 index 0000000..eef8f63 --- /dev/null +++ b/stt_vosk.py @@ -0,0 +1,50 @@ +import vosk +import queue +import json +import sys +import sounddevice as sd +from rich import print +from utils.benchmark import Benchmark + +# import speech_recognition as sr +# for index, name in enumerate(sr.Microphone.list_microphone_names()): +# print("Microphone with name \"{1}\" found for `Microphone(device_index={0})`".format(index, name)) +# exit(1) + +bench = Benchmark() + + +def va_respond(voice: str): + print(f"[light_sea_green]Vosk thinks you said[/]: [dodger_blue1]{voice}[/]") + + +model = vosk.Model("model_small") +samplerate = 16000 +device = 2 + +q = queue.Queue() + + +def q_callback(indata, frames, time, status): + if status: + print(status, file=sys.stderr) + q.put(bytes(indata)) + + +def va_listen(callback): + with sd.RawInputStream(samplerate=samplerate, blocksize=8000, device=device, dtype='int16', + channels=1, callback=q_callback): + + rec = vosk.KaldiRecognizer(model, samplerate) + while True: + bench.start() + data = q.get() + if rec.AcceptWaveform(data): + callback(json.loads(rec.Result())["text"]) + end_time = bench.end() + print(f"[grey37]This took[/] [red]{end_time[1]}[/]") + #else: + # print(rec.PartialResult()) + +# начать прослушивание команд +va_listen(va_respond) \ No newline at end of file diff --git a/utils/benchmark.py b/utils/benchmark.py new file mode 100644 index 0000000..008ab36 --- /dev/null +++ b/utils/benchmark.py @@ -0,0 +1,27 @@ +import time + + +class Benchmark: + __marks = {} # {0: [result, point1, point2, ...]} + + def start(self, point_name=None) -> float: + if point_name is None: + point_name = 0 + + self.__marks[point_name] = [0, ((time.time_ns() / 1000000) / 1000)%60, 0] + # print(f"start: {self.__marks}") + + return self.__marks[point_name] + + def end(self, point_name=None) -> tuple: + if point_name is None: + point_name = 0 + + # print(self.__marks) + self.__marks[point_name][2] = ((time.time_ns() / 1000000) / 1000)%60 + self.__marks[point_name][0] = self.__marks[point_name][2] - self.__marks[point_name][1] + + return self.__marks[point_name][0], f"{int(1E3 * self.__marks[point_name][0])}ms" + + def clear_points(self): + self.__marks = {} diff --git a/utils/time.py b/utils/time.py new file mode 100644 index 0000000..a93bde0 --- /dev/null +++ b/utils/time.py @@ -0,0 +1,15 @@ +import time + + +def sleep(duration, get_now=time.perf_counter): + """ + Custom sleep function that works more accurate then time.sleep does. + Taken from: https://stackoverflow.com/a/60185893/3684575 + :param duration: Duration to sleep (in seconds). + :param get_now: Function to retrieve current time (time.perf_counter by default) + :return: + """ + now = get_now() + end = now + duration + while now < end: + now = get_now()