summaryrefslogtreecommitdiff
path: root/modules/input_handlers/pipewire_record.py
diff options
context:
space:
mode:
Diffstat (limited to 'modules/input_handlers/pipewire_record.py')
-rw-r--r--modules/input_handlers/pipewire_record.py66
1 files changed, 66 insertions, 0 deletions
diff --git a/modules/input_handlers/pipewire_record.py b/modules/input_handlers/pipewire_record.py
new file mode 100644
index 0000000..8584ad3
--- /dev/null
+++ b/modules/input_handlers/pipewire_record.py
@@ -0,0 +1,66 @@
+import subprocess
+import os.path
+import signal
+import sys
+from time import sleep
+
+import whisper
+
+FIFO_PATH = "/tmp/hestia-listening"
+RECORD_PATH = "/tmp/hestia-record.mp3"
+
+def get_input_pw_record():
+ device = get_device()
+
+ if os.path.exists(FIFO_PATH):
+ os.remove(FIFO_PATH)
+
+ os.mkfifo(FIFO_PATH)
+
+ while True:
+ with open(FIFO_PATH):
+ pass
+ # TODO "I'm listening"
+
+ try:
+ ps = subprocess.Popen((f"pw-record --target {device} {RECORD_PATH}",), shell=True)
+ with open(FIFO_PATH):
+ print("finished")
+ ps.send_signal(signal.SIGINT)
+ # TODO "acknowledged"
+ except:
+ if "ps" in locals():
+ ps.kill()
+ # TODO "error"
+ # TODO exit gracefully or try to recover
+ sys.exit()
+
+ model = whisper.load_model("base")
+
+ audio = whisper.load_audio(RECORD_PATH)
+ audio = whisper.pad_or_trim(audio)
+
+ mel = whisper.log_mel_spectrogram(audio).to(model.device)
+ options = whisper.DecodingOptions(language="en", fp16=False)
+ result = whisper.decode(model, mel, options)
+ result_text = result.text.replace(",", "").replace(".", "").lower()
+
+ print(result_text)
+
+ yield result_text
+
+def get_device() -> str:
+ already_warned = False
+
+ while True:
+ ps = subprocess.Popen(('pw-cli ls | \\grep -Poi "(?<=node.name = \\").*mic.*(?=\\")"',), shell=True, stdout=subprocess.PIPE)
+ ps.wait()
+
+ if ps.returncode == 0:
+ return ps.stdout.read().decode().strip()
+
+ elif not already_warned:
+ already_warned = True
+ # TODO warn about device not found
+
+ sleep(3) \ No newline at end of file