mirror of https://github.com/coqui-ai/TTS.git
169 lines
5.9 KiB
Python
169 lines
5.9 KiB
Python
import os
|
|
from glob import glob
|
|
import re
|
|
import sys
|
|
|
|
|
|
def get_preprocessor_by_name(name):
|
|
"""Returns the respective preprocessing function."""
|
|
thismodule = sys.modules[__name__]
|
|
return getattr(thismodule, name.lower())
|
|
|
|
|
|
def tweb(root_path, meta_file):
|
|
"""Normalize TWEB dataset.
|
|
https://www.kaggle.com/bryanpark/the-world-english-bible-speech-dataset
|
|
"""
|
|
txt_file = os.path.join(root_path, meta_file)
|
|
items = []
|
|
speaker_name = "tweb"
|
|
with open(txt_file, 'r') as ttf:
|
|
for line in ttf:
|
|
cols = line.split('\t')
|
|
wav_file = os.path.join(root_path, cols[0] + '.wav')
|
|
text = cols[1]
|
|
items.append([text, wav_file, speaker_name])
|
|
return items
|
|
|
|
|
|
# def kusal(root_path, meta_file):
|
|
# txt_file = os.path.join(root_path, meta_file)
|
|
# texts = []
|
|
# wavs = []
|
|
# with open(txt_file, "r", encoding="utf8") as f:
|
|
# frames = [
|
|
# line.split('\t') for line in f
|
|
# if line.split('\t')[0] in self.wav_files_dict.keys()
|
|
# ]
|
|
# # TODO: code the rest
|
|
# return {'text': texts, 'wavs': wavs}
|
|
|
|
|
|
def mozilla_old(root_path, meta_file):
|
|
"""Normalizes Mozilla meta data files to TTS format"""
|
|
txt_file = os.path.join(root_path, meta_file)
|
|
items = []
|
|
speaker_name = "mozilla_old"
|
|
with open(txt_file, 'r') as ttf:
|
|
for line in ttf:
|
|
cols = line.split('|')
|
|
batch_no = int(cols[1].strip().split("_")[0])
|
|
wav_folder = "batch{}".format(batch_no)
|
|
wav_file = os.path.join(root_path, wav_folder, "wavs_no_processing", cols[1].strip())
|
|
text = cols[0].strip()
|
|
items.append([text, wav_file, speaker_name])
|
|
return items
|
|
|
|
|
|
def mozilla(root_path, meta_file):
|
|
"""Normalizes Mozilla meta data files to TTS format"""
|
|
txt_file = os.path.join(root_path, meta_file)
|
|
items = []
|
|
speaker_name = "mozilla"
|
|
with open(txt_file, 'r') as ttf:
|
|
for line in ttf:
|
|
cols = line.split('|')
|
|
wav_file = cols[1].strip()
|
|
text = cols[0].strip()
|
|
wav_file = os.path.join(root_path, "wavs", wav_file)
|
|
items.append([text, wav_file, speaker_name])
|
|
return items
|
|
|
|
|
|
def mailabs(root_path, meta_files=None):
|
|
"""Normalizes M-AI-Labs meta data files to TTS format"""
|
|
speaker_regex = re.compile("by_book/(male|female)/(?P<speaker_name>[^/]+)/")
|
|
if meta_files is None:
|
|
csv_files = glob(root_path+"/**/metadata.csv", recursive=True)
|
|
else:
|
|
csv_files = meta_files
|
|
# meta_files = [f.strip() for f in meta_files.split(",")]
|
|
items = []
|
|
for csv_file in csv_files:
|
|
txt_file = os.path.join(root_path, csv_file)
|
|
folder = os.path.dirname(txt_file)
|
|
# determine speaker based on folder structure...
|
|
speaker_name_match = speaker_regex.search(txt_file)
|
|
if speaker_name_match is None:
|
|
continue
|
|
speaker_name = speaker_name_match.group("speaker_name")
|
|
print(" | > {}".format(csv_file))
|
|
with open(txt_file, 'r') as ttf:
|
|
for line in ttf:
|
|
cols = line.split('|')
|
|
if meta_files is None:
|
|
wav_file = os.path.join(folder, 'wavs', cols[0] + '.wav')
|
|
else:
|
|
wav_file = os.path.join(root_path, folder.replace("metadata.csv", ""), 'wavs', cols[0] + '.wav')
|
|
if os.path.isfile(wav_file):
|
|
text = cols[1].strip()
|
|
items.append([text, wav_file, speaker_name])
|
|
else:
|
|
raise RuntimeError("> File %s is not exist!"%(wav_file))
|
|
return items
|
|
|
|
|
|
def ljspeech(root_path, meta_file):
|
|
"""Normalizes the Nancy meta data file to TTS format"""
|
|
txt_file = os.path.join(root_path, meta_file)
|
|
items = []
|
|
speaker_name = "ljspeech"
|
|
with open(txt_file, 'r') as ttf:
|
|
for line in ttf:
|
|
cols = line.split('|')
|
|
wav_file = os.path.join(root_path, 'wavs', cols[0] + '.wav')
|
|
text = cols[1]
|
|
items.append([text, wav_file, speaker_name])
|
|
return items
|
|
|
|
|
|
def nancy(root_path, meta_file):
|
|
"""Normalizes the Nancy meta data file to TTS format"""
|
|
txt_file = os.path.join(root_path, meta_file)
|
|
items = []
|
|
speaker_name = "nancy"
|
|
with open(txt_file, 'r') as ttf:
|
|
for line in ttf:
|
|
utt_id = line.split()[1]
|
|
text = line[line.find('"') + 1:line.rfind('"') - 1]
|
|
wav_file = os.path.join(root_path, "wavn", utt_id + ".wav")
|
|
items.append([text, wav_file, speaker_name])
|
|
return items
|
|
|
|
|
|
def common_voice(root_path, meta_file):
|
|
"""Normalize the common voice meta data file to TTS format."""
|
|
txt_file = os.path.join(root_path, meta_file)
|
|
items = []
|
|
with open(txt_file, 'r') as ttf:
|
|
for line in ttf:
|
|
if line.startswith("client_id"):
|
|
continue
|
|
cols = line.split("\t")
|
|
text = cols[2]
|
|
speaker_name = cols[0]
|
|
wav_file = os.path.join(root_path, "clips", cols[1] + ".wav")
|
|
items.append([text, wav_file, speaker_name])
|
|
return items
|
|
|
|
|
|
def libri_tts(root_path, meta_files=None):
|
|
"""https://ai.google/tools/datasets/libri-tts/"""
|
|
items = []
|
|
if meta_files is None:
|
|
meta_files = glob(f"{root_path}/**/*trans.tsv", recursive=True)
|
|
for meta_file in meta_files:
|
|
_meta_file = os.path.basename(meta_file).split('.')[0]
|
|
speaker_name = _meta_file.split('_')[0]
|
|
chapter_id = _meta_file.split('_')[1]
|
|
_root_path = os.path.join(root_path, f"{speaker_name}/{chapter_id}")
|
|
with open(meta_file, 'r') as ttf:
|
|
for line in ttf:
|
|
cols = line.split('\t')
|
|
wav_file = os.path.join(_root_path, cols[0] + '.wav')
|
|
text = cols[1]
|
|
items.append([text, wav_file, speaker_name])
|
|
for item in items:
|
|
assert os.path.exists(item[1]), f" [!] wav file is not exist - {item[1]}"
|
|
return items
|