Skip to content

Commit

Permalink
Fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
KillianLucas committed May 2, 2024
1 parent 4d29fa9 commit fd9e222
Show file tree
Hide file tree
Showing 6 changed files with 9,413 additions and 92 deletions.
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
archive.py
__pycache__
models
models
realtimesst.log
peripherals.json
19 changes: 19 additions & 0 deletions clock.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import os
import time
import subprocess
import threading

def clock():

schedule_folder = './schedule'

def clock_thread():
while True:
current_time = int(time.time())
for file in os.listdir(schedule_folder):
file_time, interval = file.split('_')[0], file.split('_')[1].split('.')[0]
if int(file_time) <= current_time and (current_time - int(file_time)) % int(interval) == 0:
subprocess.call(['python', os.path.join(schedule_folder, file)])
time.sleep(0.75)

threading.Thread(target=clock_thread).start()
175 changes: 85 additions & 90 deletions main.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,23 @@
from profiles.default import interpreter
from pynput import keyboard
from RealtimeTTS import TextToAudioStream, OpenAIEngine, CoquiEngine
from RealtimeSTT import AudioToTextRecorder
from beeps import beep, beeper
from clock import clock
import traceback
import time
import os


# Set '01_PORT' if it's not already set
if '01_PORT' not in os.environ:
os.environ['01_PORT'] = '10000'


if __name__ == '__main__':

from profiles.default import interpreter

# Audio setup
recorder = AudioToTextRecorder()
recorder.stop()

Expand All @@ -16,115 +28,98 @@

stream = TextToAudioStream(engine)

beep("Blow")
# Start clock
clock()

# Startup interface
beep("Blow")
stream.feed("Hi, how can I help you?")
stream.play_async()
print("\n" * 42 + "\nPress and hold 'esc', speak, then release.\n")

print("\n" * 42)
print("\nPress and hold 'esc', speak, then release.\n")

is_pressed = False
language_model_on = False
# Remember this, to quit interpreter if pressed again
last_pressed = 0
wildcard_index = 0

## CODE GETS MESSY.
is_pressed = False

while True:
try:
def on_press(key):
global is_pressed
global last_pressed
global wildcard_index
global language_model_on
if language_model_on:
return
try:
if key == keyboard.Key.esc and not is_pressed:
beep("Morse")
last_pressed = time.time()
is_pressed = True
recorder.start()
stream.stop()

except AttributeError:
pass
global is_pressed

if key == keyboard.Key.esc and not is_pressed:
beep("Morse")
is_pressed = True
last_pressed = time.time()
recorder.start()
stream.stop()

def on_release(key):
global is_pressed
global last_pressed
global language_model_on
if language_model_on:
return
global is_pressed

try:
if key == keyboard.Key.esc and is_pressed:
beep("Frog")
is_pressed = False
recorder.stop()
text = recorder.text()
print(text)
if key == keyboard.Key.esc and is_pressed:
beep("Frog")
is_pressed = False
recorder.stop()
text = recorder.text()
print(text)

if text.strip() and time.time() - last_pressed > 0.25:

if text.strip() and time.time() - last_pressed > 0.5:

def generator():
try:
global last_pressed
global language_model_on

old_last_pressed = last_pressed
beeper.start()

if interpreter.llm.supports_functions == False:
prev_message = None
for message in interpreter.messages:
if message.get("type") == "code":
if prev_message and prev_message.get("role") == "assistant":
prev_message["content"] += "\n```\n" + message.get("content").strip("\n`") + "\n```"
else:
message["type"] = "message"
message["content"] = "```\n" + message.get("content").strip("\n`") + "\n```"
prev_message = message

interpreter.messages = [message for message in interpreter.messages if message.get("type") != "code"]

language_model_on = True
for chunk in interpreter.chat(text, display=True, stream=True):
# if old_last_pressed != last_pressed:
# beeper.stop()
# print("BREAKING!")
# break

if chunk.get("type") == "message":
content = chunk.get("content")
if content:
#content = content.replace(". ", ". ... ").replace(", ", ", ... ").replace("!", "! ... ").replace("?", "? ... ")
beeper.stop()
yield content

if "start" in chunk and chunk.get("type") == "code":
beeper.start()

language_model_on = False
def generator():
try:
global last_pressed
old_last_pressed = last_pressed

beeper.start()

if interpreter.llm.supports_functions == False:
prev_message = None
for message in interpreter.messages:
if message.get("type") == "code":
if prev_message and prev_message.get("role") == "assistant":
prev_message["content"] += "\n```\n" + message.get("content").strip("\n`") + "\n```"
else:
message["type"] = "message"
message["content"] = "```\n" + message.get("content").strip("\n`") + "\n```"
prev_message = message

except Exception as e:
print(str(e))
interpreter.messages = [message for message in interpreter.messages if message.get("type") != "code"]

for chunk in interpreter.chat(text, display=True, stream=True):

stream.feed(generator())

stream.play_async()


except AttributeError:
pass
if old_last_pressed != last_pressed:
beeper.stop()
break

if chunk.get("type") == "message":
content = chunk.get("content")
if content:
content = content.replace(". ", ". ... ").replace(", ", ", ... ").replace("!", "! ... ").replace("?", "? ... ")
beeper.stop()
yield content

if "start" in chunk and chunk.get("type") == "code":
beeper.start()

except KeyboardInterrupt:
raise
except:
print(traceback.format_exc())

stream.feed(generator())
stream.play_async()

while True:
try:
with keyboard.Listener(on_press=on_press, on_release=on_release) as listener:
listener.join()
except Exception as e:
print(f"An error occurred: {e}. Retrying...")
except Exception as e:
print(str(e))
except KeyboardInterrupt:
raise
except:
print(traceback.format_exc())
except KeyboardInterrupt:
raise
except:
print(traceback.format_exc())
Loading

0 comments on commit fd9e222

Please sign in to comment.