waybar integration
This commit is contained in:
parent
2f884fb7de
commit
792f77f218
2 changed files with 28 additions and 0 deletions
|
|
@ -22,5 +22,8 @@ requires `~/.config/simplewhispr/config.json`:
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## integrations
|
||||||
|
waybar: `tail -F /tmp/simplewhispr-waybar.log`, json output
|
||||||
|
|
||||||
---
|
---
|
||||||
Copyright (C) Noah Swerhun under the terms of [GNU GPLv3](https://www.gnu.org/licenses/gpl-3.0-standalone.html).
|
Copyright (C) Noah Swerhun under the terms of [GNU GPLv3](https://www.gnu.org/licenses/gpl-3.0-standalone.html).
|
||||||
|
|
|
||||||
25
main.py
25
main.py
|
|
@ -10,6 +10,7 @@ from openai import OpenAI
|
||||||
|
|
||||||
# flag to control recording
|
# flag to control recording
|
||||||
recording = True
|
recording = True
|
||||||
|
status_file = None
|
||||||
|
|
||||||
|
|
||||||
def parse_config() -> tuple[str, str]:
|
def parse_config() -> tuple[str, str]:
|
||||||
|
|
@ -33,6 +34,21 @@ def parse_config() -> tuple[str, str]:
|
||||||
raise Exception(f"fatal: configuration error: {e}")
|
raise Exception(f"fatal: configuration error: {e}")
|
||||||
|
|
||||||
|
|
||||||
|
def report_status(message: str):
|
||||||
|
global status_file
|
||||||
|
if status_file is None:
|
||||||
|
try:
|
||||||
|
status_file = open("/tmp/simplewhispr-waybar.log", "w")
|
||||||
|
except OSError:
|
||||||
|
return
|
||||||
|
|
||||||
|
try:
|
||||||
|
status_file.write(f'{{"text":"{message}"}}\n')
|
||||||
|
status_file.flush()
|
||||||
|
except OSError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
def handle_sigusr1(signum, frame):
|
def handle_sigusr1(signum, frame):
|
||||||
global recording
|
global recording
|
||||||
print("\ninfo: SIGUSR1 received. stopping recording.")
|
print("\ninfo: SIGUSR1 received. stopping recording.")
|
||||||
|
|
@ -48,11 +64,13 @@ def transcribe_audio(filename: str) -> str:
|
||||||
client = OpenAI(api_key=api_key)
|
client = OpenAI(api_key=api_key)
|
||||||
|
|
||||||
with open(filename, "rb") as audio_file:
|
with open(filename, "rb") as audio_file:
|
||||||
|
report_status("")
|
||||||
transcription = client.audio.transcriptions.create(
|
transcription = client.audio.transcriptions.create(
|
||||||
model=model,
|
model=model,
|
||||||
file=audio_file,
|
file=audio_file,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
report_status("")
|
||||||
return transcription.text
|
return transcription.text
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -64,6 +82,7 @@ def grab_recording() -> str:
|
||||||
print(
|
print(
|
||||||
f"info: starting recording to {output_filename}. send SIGUSR1 (kill -usr1 {os.getpid()}) to stop."
|
f"info: starting recording to {output_filename}. send SIGUSR1 (kill -usr1 {os.getpid()}) to stop."
|
||||||
)
|
)
|
||||||
|
report_status("")
|
||||||
|
|
||||||
process = subprocess.Popen(
|
process = subprocess.Popen(
|
||||||
cmd, stdout=subprocess.DEVNULL, stderr=subprocess.PIPE, text=True
|
cmd, stdout=subprocess.DEVNULL, stderr=subprocess.PIPE, text=True
|
||||||
|
|
@ -74,12 +93,14 @@ def grab_recording() -> str:
|
||||||
time.sleep(0.5)
|
time.sleep(0.5)
|
||||||
if process.poll() is not None:
|
if process.poll() is not None:
|
||||||
print("fatal: ffmpeg exited unexpectedly.")
|
print("fatal: ffmpeg exited unexpectedly.")
|
||||||
|
report_status("")
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
# stop recording
|
# stop recording
|
||||||
process.terminate()
|
process.terminate()
|
||||||
process.wait()
|
process.wait()
|
||||||
print("info: recording stopped.")
|
print("info: recording stopped.")
|
||||||
|
report_status("")
|
||||||
return output_filename
|
return output_filename
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -87,13 +108,17 @@ def main():
|
||||||
with open("/tmp/simplewhispr.pid", "w") as f:
|
with open("/tmp/simplewhispr.pid", "w") as f:
|
||||||
f.write(str(os.getpid()))
|
f.write(str(os.getpid()))
|
||||||
|
|
||||||
|
report_status("")
|
||||||
|
|
||||||
recording_file = grab_recording()
|
recording_file = grab_recording()
|
||||||
print("info: transcribing...")
|
print("info: transcribing...")
|
||||||
transcription = transcribe_audio(recording_file)
|
transcription = transcribe_audio(recording_file)
|
||||||
print(f"info: transcription: {transcription}")
|
print(f"info: transcription: {transcription}")
|
||||||
|
|
||||||
# use wtype to type the output
|
# use wtype to type the output
|
||||||
|
report_status("")
|
||||||
subprocess.run(["wtype", transcription])
|
subprocess.run(["wtype", transcription])
|
||||||
|
report_status("")
|
||||||
|
|
||||||
if os.path.exists("/tmp/simplewhispr.pid"):
|
if os.path.exists("/tmp/simplewhispr.pid"):
|
||||||
os.remove("/tmp/simplewhispr.pid")
|
os.remove("/tmp/simplewhispr.pid")
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue