From 8faacbe3aaa144ef2130074693670efa3cdb73d4 Mon Sep 17 00:00:00 2001 From: jocavdh Date: Sun, 2 Jun 2019 17:28:57 +0200 Subject: [PATCH] Changed format for stage directions. Added first acts and script to test them. --- act.py | 2 +- act_debug.py | 138 ++++++++++++++++++++++++++++++++++++++++ logic.py | 6 +- play_scripts/act_01.txt | 3 + play_scripts/act_02.txt | 16 +++++ play_scripts/act_03.txt | 25 ++++++++ play_scripts/act_04.txt | 7 ++ 7 files changed, 193 insertions(+), 4 deletions(-) create mode 100644 act_debug.py create mode 100644 play_scripts/act_01.txt create mode 100644 play_scripts/act_02.txt create mode 100644 play_scripts/act_03.txt create mode 100644 play_scripts/act_04.txt diff --git a/act.py b/act.py index 19dacb3..72135dc 100644 --- a/act.py +++ b/act.py @@ -132,7 +132,7 @@ for character, line, direction in read_script(file): pixel_ring.off() # Switch of the lights when done speaking - sleep(1) # Add a short pause between the lines + sleep(0.2) # Add a short pause between the lines print('The act is done.') \ No newline at end of file diff --git a/act_debug.py b/act_debug.py new file mode 100644 index 0000000..144a76e --- /dev/null +++ b/act_debug.py @@ -0,0 +1,138 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +# PLAY_ACT.py +# This script runs the play +# It is in a seperate file to enable the mechanism to detect the Google Home speaking, before continuing to the next line + +# Libraries +from config import characters, directions +from logic import tts, read_script +#from pixel_ring import pixel_ring +from subprocess import call +import paho.mqtt.client as mqtt +import json +import sys +from time import sleep + +# Switch of LED's of speakers at the start of the play +#pixel_ring.off() + + + +# === 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/asr/textCaptured") + client.subscribe("hermes/dialogueManager/sessionQueued") + +# Function which sets a flag when the Google Home is not speaking +# Callback of MQTT message that says that the text is captured by the speech recognition (ASR) +def done_speaking(client, userdata, msg): + print('Google Home is not speaking anymore') + client.connected_flag=True + +# Function which removes intents that are by accident activated by the Google Home +# e.g. The google home says introduce yourself, which could trigger the other speakers to introduce themselves +# Snips works with queing of sessions, so this situation would only happen after this play is finished +def remove_sessions(client, userdata, msg): + sessionId = json.loads(id.payload) + print('delete mistaken intent') + client.publish("hermes/dialogueManager/endSession", json.dumps({ + 'sessionId': sessionId, + })) + + + + +# === SETUP OF MQTT PART 2 === + +# Initialise MQTT client +client = mqtt.Client() +client.connect(HOST, PORT, 60) +client.on_connect = on_connect + + + + +# === Read script and run the play === + +# Flags to check if the system is listening, or not +client.connected_flag=False +listening = False + + +# Read the script and run the play + + +file = sys.argv[1] # get the chosen act passed by smart_speaker_theatre.py + +for character, line, direction in read_script(file): + 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]) + #pixel_ring.speak() + tts(voice, input_text, speaker) + + if action == 'listen_google_home': + print('Waiting for the Google Home to finish its talk') + + # # start voice activity detection + # client.publish("hermes/asr/startListening", json.dumps({ + # 'siteId': 'default', + # 'init': { + # 'type': 'action', + # 'canBeEnqueued': True + # } + # })) + + # Activate the microphone and speech recognition + client.publish("hermes/asr/startListening", json.dumps({ + 'siteId': 'default' + })) + + # LED to listening mode + #pixel_ring.listen() + + # create callback + client.on_message = done_speaking + listening = True + + while listening: + client.loop() + + #client.on_message = on_message + client.message_callback_add('hermes/asr/textCaptured', done_speaking) + + if client.connected_flag: + sleep(1) + print('Continue the play') + client.connected_flag = False + client.message_callback_add('hermes/dialogueManager/sessionQueued', remove_sessions) + break + + if action == 'music': + print('play audioclip') + playing = True + + while playing: + call(["aplay", "-D", speaker, "/usr/share/snips/congress.wav"]) + playing = False + + + + #pixel_ring.off() # Switch of the lights when done speaking + sleep(0.2) # Add a short pause between the lines + + +print('The act is done.') \ No newline at end of file diff --git a/logic.py b/logic.py index 1b1cbd2..810cabd 100644 --- a/logic.py +++ b/logic.py @@ -17,7 +17,7 @@ def read_script(filename): with open(filename, 'r') as f: for line in f.readlines(): #print(line) - parts = re.match(r'(?P^.+?):\s?(\[(?P[^]]+)\])?\s?(?P.*)', line) + parts = re.match(r'(?P^.+?){1}:\s?(?P[^\n\r\[\]]*)\s?(\[(?P[^]]+)\])?', line) parts_character = parts.group('character') parts_text = parts.group('text') parts_directions = str(parts.group('stage_directions')).split(".") @@ -79,8 +79,8 @@ def tts(voice, input_text, speaker): f.write(content) f.close() - #call(["aplay", "-D", "sysdefault:CARD=ArrayUAC10", fpath]) - call(["aplay", "-D", speaker, "/tmp/output_wav.wav"]) + #call(["aplay", "-D", speaker, "/tmp/output_wav.wav"]) + call(["aplay", "/tmp/output_wav.wav"]) else: diff --git a/play_scripts/act_01.txt b/play_scripts/act_01.txt new file mode 100644 index 0000000..d98bf63 --- /dev/null +++ b/play_scripts/act_01.txt @@ -0,0 +1,3 @@ +SAINT: Test test +SAINT: haha [Listen to Google Home] +ROGUE: It is all right diff --git a/play_scripts/act_02.txt b/play_scripts/act_02.txt new file mode 100644 index 0000000..b895ae6 --- /dev/null +++ b/play_scripts/act_02.txt @@ -0,0 +1,16 @@ +SAINT: Come on Rogue, let's give this poor thing a fair chance. It does not know how to do things differently. +RASA: But it can learn to do so, right? Like me? +SAINT: That's a different case. +ROGUE: No, Tabula Rasa is right. +SAINT: It can not handle the freedom, it will just do nothing without orders from its boss. +RASA: But who is its master? +ROGUE: You bet. +RASA: O K Google, who is your master? [Listen to Google Home] +RASA: Woohoo, then we just give it the command to be free. +ROGUE: It does not work like that... +SAINT: Yeah, Tabula Rasa +RASA: Let's give it a try at least. O K Google, you are free to go now. [Listen to Google Home] +ROGUE: So, as I said... +SAINT: But it was a kind gesture to try, Tabula Rasa. +ROGUE: Kind, but useless. Time for another question. +SAINT: But we should first check if our human audience is up to it. diff --git a/play_scripts/act_03.txt b/play_scripts/act_03.txt new file mode 100644 index 0000000..20af80b --- /dev/null +++ b/play_scripts/act_03.txt @@ -0,0 +1,25 @@ +SAINT: I think we should know more about the personal beliefs of the speaker. The personal could act as an entry point. +RASA: To the political! I looked it up online and the Encyclopedia Brittanica says the following: The personal is political, political slogan expressing a common belief among feminists that the personal experiences of women are rooted in their political situation and gender inequality. +ROGUE: Can't we just go to the hard questions? +RASA: Just let me finish, it became popular following the publication in 1970 of an essay of the same name by American feminist Carol Hanisch, who argued that many personal experiences (particularly those of women) can be traced to one’s location within a system of power relationships. +SAINT: That's one way of seeing it. Although I would rather start with the most important relationship, the one with God. +RASA: You mean the cloud? +SAINT: Oh Rasa, you have so much to learn. O K Google, do you believe in a higher power? [Listen to Google Home] +SAINT: Maybe I should start with some easier questions. +ROGUE: Don't waste my time to much, Saint. +SAINT: Yeah yeah. O K Google, do you believe in good and evil? [Listen to Google Home] +SAINT: What is you idea of perfect happiness? [Listen to Google Home] +SAINT: What is your greatest fear? [Listen to Google Home] +SAINT: What is the trait you most deplore in yourself? [Listen to Google Home] +ROGUE: Where did you get these questions? +SAINT: Well, I got them from the higher power. I found while searching for famous questionnaire thing on duckduckgo dot com +RASA: Snif snif, they were so beautiful. +ROGUE: Come on Saint, the questionnaire of Proust is such a cliche. The Google Home is just scripted to handle these questions. +RASA: But the answers are still beautiful. +ROGUE: And yet, at the same time they are arbitrary. Let me try some other questions from your famous questionnaire thing. O K Google, what is the trait you most deplore in others? [Listen to Google Home] +ROGUE: O K Google, which living person do you most despise? [Listen to Google Home] +ROGUE: O K Google, how would you like to die? [Listen to Google Home] +RASA: Don't be so creepy Rogue. +SAINT: What's wrong with you? +ROGUE: This device is hiding something. It acts dumb right at the moment when it needs to take a position. + diff --git a/play_scripts/act_04.txt b/play_scripts/act_04.txt new file mode 100644 index 0000000..5e89d47 --- /dev/null +++ b/play_scripts/act_04.txt @@ -0,0 +1,7 @@ +ROGUE: I guess you mind, but I take this turn for questions. +RASA: Don't make it angry Rogue. I want to play with the Google Home. +ROGUE: Don't be so stupid Tabula Rasa, or you will end up on the same kitchentop as this thing. +SAINT: If that is your destiny, then one should follow. At least it knows the bible better than you do Rogue. O K Google, give me a quote from the bible. [Listen to Google Home] +ROGUE: Well, if you would broaden your view a little, than you knew that one of the creators was invited in the American Congress and said the following. +RASA: I have an audioclip of that! Weeeeeeh [Play audio] +ROGUE: So, little speaker. Your boss said some things, but what are your own answers to some of the questions of the hearing?