1
0
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:
MarkParker5
2021-02-21 21:06:00 +02:00
parent 96bb146822
commit 792bede347
17 changed files with 147 additions and 186 deletions

View File

@@ -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