aishell数据处理为thchs30格式

  • aishell数据格式对于用神经网络处理数据的同学来说比较不友善,因为他只有文字转录和音素级别的转录,并没有拼音的转录。
  • 而thchs30由于有拼音标注的优势被很多同学用来训练神经网络声学模型,因此想通过一些简单的处理,将aishell也转化为方便易用的格式。

aishell数据转换格式

废话不多说,转化后数据格式和thchs相同,如下:

  • thchs30
    • train.syllable.txt: A11_0 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
    • train.wav.lst: A11_0 data_thchs30/train/A11_0.wav
  • aishell
    • train.syllable.txt: BAC009S0002W0122 er2 dui4 lou2 shi4 cheng2 jiao1 yi4 zhi4 zuo4 yong4 zui4 da4 de5 xian4 gou4
    • train.wav.lst: BAC009S0002W0122 data_aishell/wav/train/S0002/BAC009S0002W0122.wav
      数据的标注和读取路径就和thchs30一样了,就能在thchs30的网络中,使用aishell的数据进行训练了。
      特别是一些用ctc训练神经网络的同学,就可以使用更多的数据训练了。

aishell数据转化方法

一言不合,直接粘贴。
该脚本和生成的数据也可以去我的GitHub上down下来,代码地址

# -----------------------------------------------------------------------------------------------------
'''
&usage:		aishell数据处理,将汉字处理为拼音,并生成thchs30的数据形式
@author:	hongwen sun
'''
# -----------------------------------------------------------------------------------------------------
from pypinyin import pinyin, lazy_pinyin, Style
import numpy as np
import re

# -----------------------------------------------------------------------------------------------------
'''
usage: 将aishell汉字标注转化为拼音
env: pip install pypinyin
'''
# -----------------------------------------------------------------------------------------------------
def trans_aishell_to_pinyin(word_path, pinyin_path):
	# 需要转换为拼音的中文汉字路径
	textobj = open(word_path, 'r+', encoding='UTF-8')
	# 转化为拼音后的保存txt路径
	savefile = open(pinyin_path, 'w+', encoding='UTF-8')
	# 对aishell进行文本数据处理
	for x in textobj.readlines():
		textlabel = x.strip('
')
		textlabel = textlabel.split(' ')
		x = pinyin(textlabel,style=Style.TONE3)
		str2 = ''
		for i in x:
			str1 = " ".join(i)
			if (re.search(r'd',str1)):
				pass
			else:
				str1 += '5'
			str2 = str2 + str1 + ' '
		str2 = str2[:-1]
		# 保存生成的数据
		savefile.write(str2 + "
")


# -----------------------------------------------------------------------------------------------------
'''
usage: 生成train, dev, test的音频文件列表
'''
# -----------------------------------------------------------------------------------------------------
import os
def gen_wavlist(wavpath,savefile):
	fileids = []
	fileObject = open(savefile, 'w+', encoding='UTF-8')
	for (dirpath, dirnames, filenames) in os.walk(wavpath):
		for filename in filenames:
			if filename.endswith('.wav'):
				str1 =  ''
				filepath = os.sep.join([dirpath, filename])
				fileid = filename.strip('.wav')
				str1 = fileid + ' ' + filepath
				fileObject.write(str1 + '
')
	fileObject.close()


# -----------------------------------------------------------------------------------------------------
'''
usage: 生成train, dev, test的音频文件对应的标注文件
'''
# -----------------------------------------------------------------------------------------------------
def gen_label(readfile,writefile):
	fileids = []
	content_dict = {}
	allfile = open('aishell_transcript.txt','r+', encoding='UTF-8')
	for textlabel in allfile.readlines():
		textlabel = textlabel.strip('
')
		textlabel_id = textlabel.split(' ',1)[0]
		textlabel_text = textlabel.split(' ',1)[1]
		content_dict[textlabel_id] = textlabel_text
	listobj = open(readfile, 'r+', encoding='UTF-8')
	labelobj = open(writefile, 'w+', encoding='UTF-8')
	for content in listobj.readlines():
		label = ''
		content = content.strip('
')
		content_id = content.split(' ',1)[0]
		if content_id in content_dict:
			content_text = content_dict[content_id]
			label = content_id + ' ' + content_text
			labelobj.write(label+'
')
	labelobj.close()
	allfile.close()
	listobj.close()


# -----------------------------------------------------------------------------------------------------
'''
usage: 修正train, dev, test的音频文件列表,将标注中不存在的文件删除
'''
# -----------------------------------------------------------------------------------------------------
def fix_list(listfile,labelfile):
	fileids = []
	content_dict = {}
	allfile = open(listfile,'r+', encoding='UTF-8')
	for textlabel in allfile.readlines():
		textlabel = textlabel.strip('
')
		textlabel_id = textlabel.split(' ',1)[0]
		textlabel_text = textlabel.split(' ',1)[1]
		content_dict[textlabel_id] = textlabel_text
	allfile.truncate()
	allfile.close()

	labelobj = open(labelfile, 'r+', encoding='UTF-8')
	listobj = open(listfile, 'w+', encoding='UTF-8')
	for content in labelobj.readlines():
		label = ''
		content = content.strip('
')
		content_id = content.split(' ',1)[0]
		content_text = content_dict[content_id]
		label = content_id + ' ' + content_text
		listobj.write(label+'
')
	labelobj.close()
	listobj.close()




# 将汉字标注化为拼音标注
# 在data_aishell同级目录下运行该脚本。
trans_aishell_to_pinyin('E:\aishell_transcript_v0.8.txt', 'E:\aishell_transcript1.txt')
# 生成train, dev, test的音频文件列表
gen_wavlist('data_aishell/wav/train','train.wav.lst')
gen_wavlist('data_aishell/wav/test','test.wav.lst')
gen_wavlist('data_aishell/wav/dev','dev.wav.lst')
# 生成train, dev, test的音频文件对应的标注文件
gen_label('train.wav.lst', 'train.syllable.txt')
gen_label('test.wav.lst', 'test.syllable.txt')
gen_label('dev.wav.lst', 'dev.syllable.txt')
# 修正train, dev, test的音频文件列表,将标注中不存在的文件删除
fix_list('train.wav.lst', 'train.syllable.txt')
fix_list('test.wav.lst', 'test.syllable.txt')
fix_list('dev.wav.lst', 'dev.syllable.txt')

通过这个方法将得到和thchs30相同的数据格式,可以用这个变换方法将其他的中文数据都整合成统一格式,就可以增加训练的数据集啦。
当然这也是我的抛转引玉,希望大家也能有更多的方法将不同的数据集给整合起来。

转载请注明出处:hongwen 的博客

原文地址:https://www.cnblogs.com/sunhongwen/p/9539151.html