#!/usr/bin/env python3 # -*- coding: utf-8 -*- # FUNTION TO PROCESS THEATRE SCRIPT import re from instructions import characters from instructions import directions def read_script(filename): lines = [] with open(filename, 'r') as f: for line in f.readlines(): #print(line) parts = re.match(r'(?P^.+?):\s?(\[(?P[^]]+)\])?\s?(?P.*)', line) parts_character = parts.group('character') parts_text = parts.group('text') parts_directions = str(parts.group('stage_directions')).split(".") lines.append((parts_character,parts_text,parts_directions)) #print(lines) return lines; # FUNCTION TO SYNTHESIZE TEXT # based on https://github.com/marytts/marytts-txt2wav/tree/python # To play wave files from subprocess import call # Mary server informations mary_host = "localhost" mary_port = "59125" # HTTP + URL packages import httplib2 from urllib.parse import urlencode, quote # For URL creation def tts(voice, input_text, speaker): # Build the query query_hash = {"INPUT_TEXT": input_text, "INPUT_TYPE":"TEXT", # Input text "LOCALE":"en_GB", "VOICE": voice, # Voice informations (need to be compatible) "OUTPUT_TYPE":"AUDIO", "AUDIO":"WAVE", # Audio informations (need both) } query = urlencode(query_hash) print("query = \"http://%s:%s/process?%s\"" % (mary_host, mary_port, query)) # Run the query to mary http server h_mary = httplib2.Http() resp, content = h_mary.request("http://%s:%s/process?" % (mary_host, mary_port), "POST", query) # Decode the wav file or raise an exception if no wav files if (resp["content-type"] == "audio/x-wav"): # Write the wav file f = open("/tmp/output_wav.wav", "wb") f.write(content) f.close() # Play the wav file # output = sc.get_speaker('Scarlett') # a = read("/tmp/output_wav.wav") # data = numpy.array(a[1],dtype=float) # print(data) # with sc.get_speaker('Scarlett').player(a[0], channels=[0]) as speaker: # speaker.play(data) # aplay -D mono3 /tmp/output_wav.wav call(["aplay", "-D", speaker, "/tmp/output_wav.wav"]) #pygame.mixer.init(frequency=16000) # Initialise the mixer #s = pygame.mixer.Sound("/tmp/output_wav.wav") #s.play() #pygame.time.wait(int(math.ceil(s.get_length() * 1000))) else: raise Exception(content) # Fuction to RUN THE PLAY import paho.mqtt.client as mqtt import json from time import sleep HOST = 'localhost' PORT = 1883 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") def on_message(client, userdata, msg): print('Google Home is not speaking anymore') client.connected_flag=True def on_waiting(client, userdata, msg): sessionId = json.loads(id.payload) print('delete mistaken intent') client.publish("hermes/dialogueManager/endSession", json.dumps({ 'sessionId': sessionId, })) client = mqtt.Client() client.connect(HOST, PORT, 60) client.on_connect = on_connect client.connected_flag=False listening = False for character, line, direction in read_script('plays/demo_act.txt'): 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) if action == 5: 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 # } # })) client.publish("hermes/asr/startListening", json.dumps({ 'siteId': 'default' })) # create callback client.on_message = on_message listening = True while listening: client.loop() #client.on_message = on_message client.message_callback_add('hermes/asr/textCaptured', on_message) if client.connected_flag: sleep(1) print('Continue the play') client.connected_flag = False client.message_callback_add('hermes/dialogueManager/sessionQueued', on_waiting) break if action == 4: print('play audioclip') playing = True while playing: call(["aplay", "-D", speaker, "/usr/share/snips/congress.wav"]) playing = False sleep(1) print('The play is over.')