You've already forked STARK
mirror of
https://github.com/MarkParker5/STARK.git
synced 2025-11-28 21:39:53 +02:00
add Response class, recursive voice assistant algorithm
This commit is contained in:
@@ -9,11 +9,10 @@ import os
|
||||
listener = SpeechRecognition.SpeechToText()
|
||||
voice = Text2Speech.Engine()
|
||||
threads = []
|
||||
reports = []
|
||||
memory = []
|
||||
voids = 0
|
||||
|
||||
listener.listen_noise()
|
||||
|
||||
if config.double_clap_activation:
|
||||
# check double clap from arduino microphone module
|
||||
def checkClap(channel):
|
||||
@@ -45,65 +44,95 @@ if config.double_clap_activation:
|
||||
GPIO.setup(12, GPIO.IN)
|
||||
GPIO.add_event_detect(12, GPIO.RISING, callback=checkClap)
|
||||
|
||||
def reply(responce):
|
||||
if responce['text']: # print answer
|
||||
print('Archie: '+responce['text'])
|
||||
if responce['voice']: # say answer
|
||||
voice.generate(responce['voice']).speak()
|
||||
if responce['type'] == 'background': # add background thread to list
|
||||
threads.append(responce['thread'])
|
||||
|
||||
def check_threads():
|
||||
for thread in threads:
|
||||
if thread['finish_event'].is_set():
|
||||
responce = thread['thread'].join()
|
||||
reply(responce)
|
||||
thread['finish_event'].clear()
|
||||
del thread
|
||||
if not thread['finish_event'].is_set(): continue
|
||||
response = thread['thread'].join()
|
||||
reply(response)
|
||||
if response.callback:
|
||||
if response.callback.quiet:
|
||||
response.callback.start()
|
||||
else:
|
||||
for _ in range(3):
|
||||
print('\nYou: ', end='')
|
||||
speech = listener.listen()
|
||||
if speech['status'] == 'ok':
|
||||
print(speech['text'], '\n')
|
||||
new_response = response.callback.answer(speech['text'])
|
||||
reply(new_response)
|
||||
break
|
||||
else:
|
||||
reports.append(response)
|
||||
thread['finish_event'].clear()
|
||||
del thread
|
||||
|
||||
os.system('clear')
|
||||
while True: # main loop
|
||||
check_threads()
|
||||
def report():
|
||||
global reports
|
||||
for response in reports:
|
||||
if response.voice:
|
||||
voice.generate(response.voice).speak()
|
||||
time.sleep(2)
|
||||
reports = []
|
||||
|
||||
def reply(response):
|
||||
if response.text: # print answer
|
||||
print('\nArchie: '+response.text)
|
||||
if response.voice: # say answer
|
||||
voice.generate(response.voice).speak()
|
||||
if response.thread: # add background thread to stack
|
||||
threads.append(response.thread)
|
||||
|
||||
def recognize(callback, params):
|
||||
print('\nYou: ', end='')
|
||||
# input
|
||||
speech = listener.listen()
|
||||
text = speech['text']
|
||||
if speech['status'] == 'ok':
|
||||
print(text)
|
||||
voids = 0
|
||||
# repeat last answer
|
||||
if Command.isRepeat(text):
|
||||
reply(memory[0]['responce']);
|
||||
continue
|
||||
# trying to recognize command with context
|
||||
if speech['status'] in ['error', 'void']:
|
||||
return speech
|
||||
text = speech['text']
|
||||
print(text, end='')
|
||||
while True:
|
||||
check_threads()
|
||||
if not callback: break
|
||||
try:
|
||||
cmd, params = memory[0]['cmd'].checkContext(text).values()
|
||||
if memory[0].get('params'): params = {**memory[0].get('params'), **params}
|
||||
if response := callback.answer(text):
|
||||
reply(response)
|
||||
except:
|
||||
cmd, params = Command.reg_find(text).values()
|
||||
# execute command
|
||||
responce = cmd.start(params)
|
||||
# say answer
|
||||
reply(responce)
|
||||
# waiting answer on question
|
||||
if responce['type'] == 'question':
|
||||
print('\nYou: ', end='')
|
||||
speech = listener.listen()
|
||||
if speech['status'] == 'ok':
|
||||
text = speech['text']
|
||||
print(text)
|
||||
if responce := responce['callback'].answer(text): reply(responce)
|
||||
# remember the command
|
||||
break
|
||||
memory.insert(0, {
|
||||
'text': text,
|
||||
'cmd': cmd,
|
||||
'responce': responce,
|
||||
'response': response,
|
||||
})
|
||||
else:
|
||||
if speech['status'] == 'error': print('Отсутсвует подключение к интернету');
|
||||
elif speech['status'] == 'void': voids += 1;
|
||||
if voids >= 3:
|
||||
voids = 0
|
||||
if config.double_clap_activation:
|
||||
print('\nSleep (-_-)zzZZ\n')
|
||||
sleep()
|
||||
speech = recognize(response.callback, params)
|
||||
if callback.once: break
|
||||
return speech
|
||||
|
||||
listener.listen_noise()
|
||||
os.system('clear')
|
||||
|
||||
while True:
|
||||
if voids >= 3:
|
||||
voids = 0
|
||||
if config.double_clap_activation:
|
||||
print('\nSleep (-_-)zzZZ\n')
|
||||
sleep()
|
||||
print('\nYou: ', end='')
|
||||
speech = listener.listen()
|
||||
print(speech.get('text') or '', end='')
|
||||
voids = 0
|
||||
while True:
|
||||
if speech['status'] == 'error':
|
||||
break
|
||||
if speech['status'] == 'void':
|
||||
voids += 1
|
||||
break
|
||||
text = speech['text']
|
||||
cmd, params = Command.reg_find(text).values()
|
||||
try: response = cmd.start(params)
|
||||
except: break
|
||||
reply(response)
|
||||
check_threads()
|
||||
report()
|
||||
if response.callback:
|
||||
speech = recognize(response.callback, {})
|
||||
else:
|
||||
break
|
||||
|
||||
Reference in New Issue
Block a user