• 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('\n')
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 + "\n") # -----------------------------------------------------------------------------------------------------
'''
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 + '\n')
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('\n')
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('\n')
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+'\n')
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('\n')
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('\n')
content_id = content.split(' ',1)[0]
content_text = content_dict[content_id]
label = content_id + ' ' + content_text
listobj.write(label+'\n')
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 的博客

aishell数据处理为thchs30格式的更多相关文章

  1. 数据处理 array json 格式 转换成 数组形式

    处理这种数据应该使用的方式是 this.cities= res.data.data.cities.sort((a,b)=>{ //排序 进行字母排序 return a.pinyin[0].cha ...

  2. GRU-CTC中文语音识别

    目录 基于keras的中文语音识别 音频文件特征提取 文本数据处理 数据格式处理 构建模型 模型训练及解码 aishell数据转化 该项目github地址 基于keras的中文语音识别 该项目实现了G ...

  3. 最新中国IP段获取办法与转成ROS导入格式

    获取中国IP段办法     1.到APNIC获取亚太最新IP分配 http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest     2 ...

  4. 非图片格式如何转成lmdb格式--caffe

    链接 LMDB is the database of choice when using Caffe with large datasets. This is a tutorial of how to ...

  5. JSON(及其在ajax前后端交互的过程)小识

    一. json介绍 json是一种轻量级的数据交换格式,规则很简单: 并列的数据之间用逗号(,)分隔: 映射用冒号(:)表示: 并列数据的集合(数组)用方括号([])表示: 映射的集合(对象)用大括号 ...

  6. 如何处理json数据

    1. 前台处理方式之一: ★jQuery.parseJSON(json)                     var parsej = $.parseJSON(data);             ...

  7. Caffe使用:如何将一维数据或其他非图像数据转换成lmdb

    caffe事儿真多,数据必须得lmdb或者leveldb什么的才行,如果数据是图片的话,那用caffe自带的convert_image.cpp就行,但如果不是图片,就得自己写程序了.我也不是计算机专业 ...

  8. JavaScript脚本语言基础(四)

    导读: JavaScript和DOM DOM文档对象常用方法和属性 DOW文档对象运用 JSON数据交换格式 正则表达式 1.JavaScript和DOM [返回] 文档对象模型(Document O ...

  9. RTMP协议

    Real Time Messaging Protocol(实时消息传送协议协议)概述   实时消息传送协议是Adobe Systems公司为Flash播放器和服务器之间音频.视频和数据传输开发的私有协 ...

随机推荐

  1. oracle静默安装

    RHEL6+oracle11.2 无界面化命令安装如下: 1.所需安装软件包检查: yum install binutils-2.* compat-libcap1* compat-libstdc++- ...

  2. Oracle死锁一例(ORA-00060),锁表导致的业务死锁问题

    1.问题发现 检查客户数据库的时候发现存在大量死锁的情况 Thread advanced to log sequence (LGWR switch) Current log# mem# : /orad ...

  3. 最新SQL手工注入语句&SQL注入大全

    看看下面的1.判断是否有注入;and 1=1;and 1=2 2.初步判断是否是mssql;and user>0 3.判断数据库系统;and (select count(*) from syso ...

  4. React Native从零到一搭建开发环境

    React Native从零到一搭建开发环境 ReactNative环境搭建 安装Homebrew 安装rvm 安装nvm 安装node 安装react-native-cli 安装watchman i ...

  5. DB数据源之SpringBoot+MyBatis踏坑过程(五)手动使用Hikari连接池

    DB数据源之SpringBoot+MyBatis踏坑过程(五)手动使用Hikari连接池 liuyuhang原创,未经允许禁止转载  系列目录连接 DB数据源之SpringBoot+Mybatis踏坑 ...

  6. JQ中的选择器children()和find()区别

    1:children及find方法都用是用来获得element的子elements的,两者都不会返回 text node,就像大多数的jQuery方法一样. 2:children方法获得的仅仅是元素一 ...

  7. restframework中的那些参数你知道吗?

    序列化是很重要的过程, 在构建数据结构的时候, 往往会出现很多意想不到的问题, 有一些参数你要用, 但是没有办法穿过来, 怎么办> 今天这篇博客就是写我之前的一个小项目中用restframewo ...

  8. scala中“=>”的4种使用场景

    一直以来都对scala中"=>"的使用比较迷茫,也不知道他表示什么意思.今天就它的使用场景列举如下,希望可以共同探讨. 表示函数的返回类型(Function Type) sc ...

  9. 7z 压缩解压简单示例

    7z命令行压缩示例: 7z -tZip a test.zip ./test/* -mx0 把test文件夹中所有文件以存储压缩的模式压缩成zip格式的文件,压缩文件为test.zip a为添加选项   ...

  10. Python学习:6.python内置函数

    Python内置函数 python内置函数,是随着python解释器运行而创建的函数,不需要重新定义,可以直接调用,那python的内置函数有哪些呢,接下来我们就了解一下python的内置函数,这些内 ...