FastSpeech 代码解析 —— ljspeech.py
简介
本项目一个基于 FastSpeech 模型的语音转换项目,它是使用 PyTorch 实现的(项目地址)。
FastSpeech 基于 Transformer 的前馈网络,用于并行生成 TTS 梅尔谱图。 FastSpeech 模型与自回归 Transformer TTS 相比,梅尔谱图生成速度加快了 270 倍,端到端语音合成速度加快了 38 倍。(详情请参阅 FastSpeech 的详细介绍)。
由于 FastSpeech 项目较大,代码较多,为了方便学习与整理,对主要代码进行依次介绍。
本文将介绍项目中的 ljspeech.py 文件: LJSpeech 数据集处理。
函数解析
build_from_path
该函数的作用是: 为 LJSpeech 数据集制作 mel 谱图,并返回语音文本列表。
输入参数:
in_dir : LJSpeech数据集路径
out_dir : mel谱图输出路径
输出参数:
texts : LJSpeech数据集语音文本列表
代码详解:
def build_from_path(in_dir, out_dir):
# 计数器
index = 1
# 语音文本列表
texts = []
# 根据输入的 LJSpeech 数据集所在路径打开 metadata.csv 文件
with open(os.path.join(in_dir, 'metadata.csv'), encoding='utf-8') as f:
# 按行读取语音文本内容
for line in f.readlines():
# 每处理 100 个文件打印进度
if index % 100 == 0:
print("{:d} Done".format(index))
# 删除前后空格后进行分段
parts = line.strip().split('|')
# 第一段为语音路径
wav_path = os.path.join(in_dir, 'wavs', '%s.wav' % parts[0])
# 第三段为语音文本
text = parts[2]
# 处理音频文件,保存转换的 mel 谱图,添加语音文本至列表
texts.append(_process_utterance(out_dir, index, wav_path, text))
# 计数器更新
index = index + 1
# 返回语音文本列表
return texts
_process_utterance
该函数的作用是:
输入参数:
out_dir : mel谱图输出路径
index : 计数器
wav_path : 音频文件路径
text : 文本内容
输出参数:
texts : LJSpeech数据集语音文本列表
代码详解:
def _process_utterance(out_dir, index, wav_path, text):
# 将语音波形转换为 mel 频谱图:
mel_spectrogram = audio.tools.get_mel(wav_path).numpy().astype(np.float32)
# 将 mel 频谱图保存至文件
mel_filename = 'ljspeech-mel-%05d.npy' % index
np.save(os.path.join(out_dir, mel_filename),
mel_spectrogram.T, allow_pickle=False)
# 返回文本内容
return text