TeaWeb/shared/generate_voice.py

81 lines
2.5 KiB
Python

"""
This should be executed with python 2.7 (because of pydub)
"""
import os
import requests
import json
import csv
import shutil
from pydub import AudioSegment
TARGET_DIRECTORY = "audio/speech"
SOURCE_FILE = "audio/speech_sentences.csv"
def tts(text, file):
voice_id = 4
language_id = 1
req = requests.post(
'https://kfiuqykx63.execute-api.us-east-1.amazonaws.com/Dev/tts?r={}&s={}&l=0&v=aca'.format(voice_id,
language_id),
stream=True,
headers={
'origin': 'https://www.naturalreaders.com',
'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/69.0.3497.100 Safari/537.36 OPR/56.0.3051.52',
'content-type': 'application/x-www-form-urlencoded',
'referer': 'https://www.naturalreaders.com/online/',
'authority': 'kfiuqykx63.execute-api.us-east-1.amazonaws.com' #You may need to change that here
},
data=json.dumps({"t": text})
)
if req.status_code != 200:
raise ValueError("Invalid response code {}".format(req.status_code))
with open(file + ".mp3", "wb") as fstream:
for chunk in req.iter_content(chunk_size=128):
fstream.write(chunk)
fstream.close()
sound = AudioSegment.from_mp3(file + ".mp3")
sound.export(file, format="wav")
os.remove(file + ".mp3")
def main():
if os.path.exists(TARGET_DIRECTORY):
print("Deleting old speach directory (%s)!" % TARGET_DIRECTORY)
try:
shutil.rmtree(TARGET_DIRECTORY)
except e:
print("Cant delete old dir!")
os.makedirs(TARGET_DIRECTORY)
mapping = []
with open(SOURCE_FILE, 'r') as input:
reader = csv.reader(filter(lambda row: len(row) != 0 and row[0] != '#', input), delimiter=';', quotechar='#')
for row in reader:
if len(row) != 2:
continue
print("Generating speech for {}: {}".format(row[0], row[1]))
try:
file = "{}.wav".format(row[0])
tts(row[1], TARGET_DIRECTORY + "/" + file)
mapping.append({'key': row[0], 'file': file})
except e:
print(e)
print("Failed to generate {}", row[0])
with open("audio/speech/mapping.json", "w") as fstream:
fstream.write(json.dumps(mapping))
fstream.close()
pass
if __name__ == "__main__":
main()