You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
81 lines
2.3 KiB
Python
81 lines
2.3 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
|
# play_logic.py
|
|
# This script contains the logic to turn the play_script into instructions for the hardware
|
|
# ---
|
|
|
|
# 01 FUNTION TO PROCESS THEATRE SCRIPT
|
|
import re
|
|
from config import characters, directions
|
|
|
|
|
|
def read_script(filename):
|
|
lines = []
|
|
|
|
with open(filename, 'r') as f:
|
|
for line in f.readlines():
|
|
#print(line)
|
|
parts = re.match(r'(?P<character>^.+?):\s?(\[(?P<stage_directions>[^]]+)\])?\s?(?P<text>.*)', 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;
|
|
|
|
|
|
|
|
# 02 FUNCTION TO SYNTHESIZE TEXT
|
|
# based on https://github.com/marytts/marytts-txt2wav/tree/python
|
|
|
|
# To play wave files
|
|
from subprocess import call
|
|
from time import sleep
|
|
|
|
# Mary server informations
|
|
mary_host = "localhost"
|
|
mary_port = "59125"
|
|
|
|
# HTTP + URL packages
|
|
import httplib2
|
|
import os
|
|
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
|
|
fpath = os.path.join(os.path.dirname(__file__), '/tmp/output_wav.wav')
|
|
f = open(fpath, "wb")
|
|
f.write(content)
|
|
f.close()
|
|
|
|
# aplay -D mono3 /tmp/output_wav.wav
|
|
|
|
#call(["aplay", "-D", "sysdefault:CARD=ArrayUAC10", fpath])
|
|
call(["aplay", fpath])
|
|
|
|
|
|
else:
|
|
raise Exception(content)
|