TTS前处理python脚本

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值