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.

95 lines
2.9 KiB
Python

#!/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<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;
# 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)
from time import sleep
# RUN THE PLAY
for character, line, directions in read_script('plays/text02.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
tts(voice, input_text, speaker)
sleep(1)