def getMfcc(child, allDir, mfcc_path):
"""
allDir: 音频文件名; child: allDir文件的绝对路径
功能: 提取allDir的mfcc特征数组,将其保存到allDir目录中的mfcc.h5文件中,并生成字典dict_output保存
特征数组的路径、数组名及其大小。
"""
import scipy.io.wavfile as wav
import numpy as np
import h5py
import sys
sys.path.append('/home/user/文档/TTS_preprocess/mfcc/') #mfcc模块目录
from base import mfcc, delta
(rate,sig) = wav.read(child)
mfcc_feat = mfcc(sig,rate)
d_mfcc_feat = delta(mfcc_feat, 2)
dd_mfcc_feat = delta(d_mfcc_feat, 2)
m_d = np.concatenate([mfcc_feat, d_mfcc_feat], axis=1)
m_d_dd = np.concatenate([m_d, dd_mfcc_feat], axis=1)
g = h5py.File(mfcc_path, 'a')
g[allDir] = m_d_dd #将特征数组保存到mfcc.h5文件中,其名称设置为allDir
dict_output = {} #创建字典dict_output,保存特征数组的路径、数组名及其大小
dict_output['feat'] = [mfcc_path, allDir]
dict_output['shape'] = list(m_d_dd.shape)
return dict_output
def getText(child, list_zi, list_ci):
"""
child: 音频文件对应的文本文件的绝对路径
功能:获得该文件中文本的内容,并进行相应处理,生成字典dict_input
"""
with open(child) as file_object:
lines = file_object.readlines()
dict_input = {}
#获取文本内容text
text = ''
for char in lines[0]:
if char!=' ':
text += char
text = text[:-1]
#将文本内容分割为字
token_zi = ''
for zi in text:
token_zi += zi + ' '
token_zi = token_zi[:-1]
#将所有文本中未加入列表 list_zi中的字加入其中,并生成child文件文本内容所对应的字编号
token_zi_id = ''
for zi in text:
if zi not in list_zi:
list_zi.append(zi)
token_zi_id += str(list_zi.index(zi)) + ' '
#获取文本的词汇,并将所有文本中未加入词汇 list_ci中的词汇加入其中,并生成child文件文本内容所对应的词汇编号
token_ci_id = ''
cis = lines[0].split()
for ci in cis:
if ci not in list_ci:
list_ci.append(ci)
token_ci_id += str(list_ci.index(ci)) +' '
#为字典dict_input添加键值对
dict_input['shape'] = [len(text)]
dict_input['text'] = text
dict_input['token_ci'] = lines[0][:-1]
dict_input['token_ci_id'] = token_ci_id.rstrip()
dict_input['token_zi'] = token_zi
dict_input['token_zi_id'] = token_zi_id.rstrip()
dict_input['pinyin'] = lines[1][:-1]
dict_input['phoneme'] = lines[2][:-1]
return dict_input
def getData(path):
"""
path: 待预处理文件的目录
功能:对path目录下的wav文件及其对应的文本文件进行特征抽取,将其保存到字典dict_dataset中,并将字典数据保存到json文件中
"""
import os
import json
dict_dataset = {} #保存文本和语音特征
list_zi = [] #字列表
list_ci = [] #词汇列表
mfcc_path = path + '/' + 'mfcc.h5' #mfcc.h5文件的绝对路径,该文件用于保存语音文件的mfcc特征数组
if os.path.exists(mfcc_path):
os.remove(mfcc_path)
pathDir = os.listdir(path)
for allDir in pathDir:
child = os.path.join('%s/%s') % (path,allDir)
if os.path.isfile(child) and ('.trn' in str(allDir)): # .trn为wav文件对于的文本文件,判断child是否为该类文本文件
dict_file = {}
dict_file['input'] = getText(child, list_zi, list_ci) #抽取文本文件信息
dict_file['output'] = getMfcc(child.replace('.trn', ''), allDir.replace('.trn', ''), mfcc_path) #抽取wav文件的mfcc特征
dict_dataset[allDir] = dict_file
#在path目录下创建zi_id.txt文件,并将list_zi中的字及其编号保存进去
fname = 'zi_id.txt'
fname = path + '/' + fname
if os.path.exists(fname):
os.remove(fname)
with open(fname, 'a') as f:
for i, zi in enumerate(list_zi):
f.write(str(i) + ' ' + zi + '\n')
#在path目录下创建ci_id.txt文件,并将list_ci中的词汇及其编号保存进去
fname = 'ci_id.txt'
fname = path + '/' + fname
if os.path.exists(fname):
os.remove(fname)
with open(fname, 'a') as f:
for i, ci in enumerate(list_ci):
f.write(str(i) + ' ' + ci + '\n')
#在path目录下创建dataset.json文件,并将dict_dataset数据保存到其中
filename = 'dataset.json'
filename = path + '/' + filename
if os.path.exists(filename):
os.remove(filename)
with open(filename, 'w') as file_object:
dataset = json.dump(dict_dataset,file_object, sort_keys=True, indent=4, separators=(',', ':'), ensure_ascii=False)
return dict_dataset
dict_data = getData('/home/user/文档/TTS_preprocess/THCHS-30部分数据')
THCHS-30数据格式
绿 是 阳春 烟 景 大块 文章 的 底色 四月 的 林 峦 更是 绿 得 鲜活 秀媚 诗意 盎然
lv4 shi4 yang2 chun1 yan1 jing3 da4 kuai4 wen2 zhang1 de5 di3 se4 si4 yue4 de5 lin2 luan2 geng4 shi4 lv4 de5 xian1 huo2 xiu4 mei4 shi1 yi4 ang4 ran2
l v4 sh ix4 ii iang2 ch un1 ii ian1 j ing3 d a4 k uai4 uu un2 zh ang1 d e5 d i3 s e4 s iy4 vv ve4 d e5 l in2 l uan2 g eng4 sh ix4 l v4 d e5 x ian1 h uo2 x iu4 m ei4 sh ix1 ii i4 aa ang4 r an2