|
|
|
@ -1,87 +1,33 @@
|
|
|
|
|
#!/usr/bin/env python3
|
|
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Fuction recognize intents and connect them to the right actions
|
|
|
|
|
# Libraries
|
|
|
|
|
import paho.mqtt.client as mqtt
|
|
|
|
|
import json
|
|
|
|
|
from time import sleep
|
|
|
|
|
from logic import tts, read_script
|
|
|
|
|
from config import characters, directions
|
|
|
|
|
from speaker import google, on_waiting, on_message
|
|
|
|
|
from pixel_ring import pixel_ring
|
|
|
|
|
from speaker import listen_to_speaker, on_waiting, on_message
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# === SETUP OF MQTT PART 1 ===
|
|
|
|
|
|
|
|
|
|
# Location of the MQTT server
|
|
|
|
|
HOST = 'localhost'
|
|
|
|
|
PORT = 1883
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Subscribe to relevant MQTT topics
|
|
|
|
|
def on_connect(client, userdata, flags, rc):
|
|
|
|
|
print("Connected to {0} with result code {1}".format(HOST, rc))
|
|
|
|
|
# Subscribe to the text detected topic
|
|
|
|
|
client.subscribe("hermes/nlu/intentNotRecognized")
|
|
|
|
|
client.subscribe('hermes/intent/jocavdh:ask')
|
|
|
|
|
client.subscribe('hermes/intent/jocavdh:ready')
|
|
|
|
|
client.subscribe('hermes/intent/jocavdh:answer_yes')
|
|
|
|
|
client.subscribe("hermes/asr/textCaptured")
|
|
|
|
|
client.subscribe("hermes/dialogueManager/sessionQueued")
|
|
|
|
|
|
|
|
|
|
def on_ready(client,data,msg, line_number = 0):
|
|
|
|
|
data = json.loads(msg.payload)
|
|
|
|
|
sessionId = data['sessionId']
|
|
|
|
|
|
|
|
|
|
script_lines = read_script('play_scripts/interruption.txt')
|
|
|
|
|
|
|
|
|
|
for character, line, direction in script_lines[line_number:]:
|
|
|
|
|
input_text = line
|
|
|
|
|
voice = characters.get(character)[0]
|
|
|
|
|
speaker = characters.get(character)[1]
|
|
|
|
|
#speaker = 'default'
|
|
|
|
|
# Some way to do something with the stage directions will come here
|
|
|
|
|
action = directions.get(direction[0])
|
|
|
|
|
tts(voice, input_text, speaker)
|
|
|
|
|
line_number +=1
|
|
|
|
|
print('say this sentence')
|
|
|
|
|
client.subscribe('hermes/intent/jocavdh:play_intro_act') # to check for intent to play the act
|
|
|
|
|
client.subscribe('hermes/intent/jocavdh:question_continue_act') # to check for the intent to continue to the next act
|
|
|
|
|
client.subscribe("hermes/nlu/intentNotRecognized") # to check if the speaker didn't understand the user, trigger for fallback function
|
|
|
|
|
|
|
|
|
|
if action == 'listen_audience':
|
|
|
|
|
print('listen to the audience')
|
|
|
|
|
|
|
|
|
|
client.publish('hermes/dialogueManager/endSession', json.dumps({
|
|
|
|
|
'sessionId': sessionId
|
|
|
|
|
}))
|
|
|
|
|
# === FUNCTIONS THAT ARE TRIGGERED WHEN AN INTENT IS DETECTED ===
|
|
|
|
|
|
|
|
|
|
client.publish('hermes/dialogueManager/startSession', json.dumps({
|
|
|
|
|
'siteId': 'default',
|
|
|
|
|
'init': {'type': 'action', 'canBeEnqueued': True, 'intentFilter':['jocavdh:answer_yes']}
|
|
|
|
|
}))
|
|
|
|
|
|
|
|
|
|
break
|
|
|
|
|
|
|
|
|
|
if action == 'listen_google_home':
|
|
|
|
|
# print('ok google')
|
|
|
|
|
# client.publish('hermes/dialogueManager/endSession', json.dumps({
|
|
|
|
|
# 'sessionId': sessionId
|
|
|
|
|
# }))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# client.publish('hermes/dialogueManager/startSession', json.dumps({
|
|
|
|
|
# 'siteId': 'default',
|
|
|
|
|
# 'init': {'type': 'action', 'canBeEnqueued': True, 'sendIntentNotRecognized': True, 'intentFilter':['jocavdh:answer_yes']}
|
|
|
|
|
# }))
|
|
|
|
|
|
|
|
|
|
# # client.publish("hermes/asr/toggleOn")
|
|
|
|
|
# # client.publish('hermes/asr/startListening', json.dumps({
|
|
|
|
|
# # 'siteId': 'default'
|
|
|
|
|
# # }))
|
|
|
|
|
|
|
|
|
|
# return line_number
|
|
|
|
|
|
|
|
|
|
google()
|
|
|
|
|
|
|
|
|
|
#break
|
|
|
|
|
sleep(5)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def on_introduce(client,data,msg, line_number = 0):
|
|
|
|
|
# Function which is triggered when the intent play_intro_act is activated
|
|
|
|
|
def on_play_intro_act(client,data,msg):
|
|
|
|
|
data = json.loads(msg.payload)
|
|
|
|
|
sessionId = data['sessionId']
|
|
|
|
|
|
|
|
|
@ -113,29 +59,10 @@ def on_introduce(client,data,msg, line_number = 0):
|
|
|
|
|
break
|
|
|
|
|
|
|
|
|
|
if action == 'listen_google_home':
|
|
|
|
|
# print('ok google')
|
|
|
|
|
# client.publish('hermes/dialogueManager/endSession', json.dumps({
|
|
|
|
|
# 'sessionId': sessionId
|
|
|
|
|
# }))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# client.publish('hermes/dialogueManager/startSession', json.dumps({
|
|
|
|
|
# 'siteId': 'default',
|
|
|
|
|
# 'init': {'type': 'action', 'canBeEnqueued': True, 'sendIntentNotRecognized': True, 'intentFilter':['jocavdh:answer_yes']}
|
|
|
|
|
# }))
|
|
|
|
|
|
|
|
|
|
# # client.publish("hermes/asr/toggleOn")
|
|
|
|
|
# # client.publish('hermes/asr/startListening', json.dumps({
|
|
|
|
|
# # 'siteId': 'default'
|
|
|
|
|
# # }))
|
|
|
|
|
listen_to_speaker()
|
|
|
|
|
|
|
|
|
|
# return line_number
|
|
|
|
|
|
|
|
|
|
google()
|
|
|
|
|
|
|
|
|
|
#break
|
|
|
|
|
|
|
|
|
|
def on_answer(client,data,msg):
|
|
|
|
|
# Function which is triggered when the intent question_continue_act is activated
|
|
|
|
|
def on_question_continue_act(client,data,msg):
|
|
|
|
|
|
|
|
|
|
data = json.loads(msg.payload)
|
|
|
|
|
answer_value = data['slots'][0]['value']['value']
|
|
|
|
@ -169,6 +96,7 @@ def on_answer(client,data,msg):
|
|
|
|
|
|
|
|
|
|
print('The play is over.')
|
|
|
|
|
|
|
|
|
|
# Function which is triggered when no intent is recognized
|
|
|
|
|
def onIntentNotRecognized(client, data, msg):
|
|
|
|
|
data = json.loads(msg.payload)
|
|
|
|
|
line_number = 1
|
|
|
|
@ -178,13 +106,17 @@ def onIntentNotRecognized(client, data, msg):
|
|
|
|
|
on_introduce(client,data,msg, line_number)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# === SETUP OF MQTT PART 2 ===
|
|
|
|
|
|
|
|
|
|
# Initialise MQTT client
|
|
|
|
|
client = mqtt.Client()
|
|
|
|
|
client.connect(HOST, PORT, 60)
|
|
|
|
|
client.on_connect = on_connect
|
|
|
|
|
client.message_callback_add('hermes/intent/jocavdh:ready', on_ready)
|
|
|
|
|
client.message_callback_add('hermes/intent/jocavdh:ask', on_introduce)
|
|
|
|
|
client.message_callback_add('hermes/intent/jocavdh:answer_yes', on_answer)
|
|
|
|
|
|
|
|
|
|
# Connect each MQTT topic to which you subscribed to a handler function
|
|
|
|
|
client.message_callback_add('hermes/intent/jocavdh:play_intro_act', on_play_intro_act)
|
|
|
|
|
client.message_callback_add('hermes/intent/jocavdh:question_continue_act', on_question_continue_act)
|
|
|
|
|
client.message_callback_add("hermes/nlu/intentNotRecognized", onIntentNotRecognized)
|
|
|
|
|
print('main')
|
|
|
|
|
|
|
|
|
|
# Keep checking for new MQTT messages
|
|
|
|
|
client.loop_forever()
|