【kaldi】运行aidatatang_200zh脚本解析

本文详细解析了使用Kaldi进行aidatatang_200zh数据集的语音识别流程,包括数据下载、数据准备、词典和语言模型创建、模型训练以及解码图构建。涉及的步骤包括环境配置、数据处理、特征提取、音素训练、解码图生成等关键环节,同时记录了在训练过程中遇到的问题及解决方案。
摘要由CSDN通过智能技术生成

aidatatang_200zh脚本解析markdown链接 (有道云笔记)

aidatatang_200h

数据集介绍

格式

16kHz 16bit,wav,单声道

录音环境 安静的室内,噪音不影响语音识别
录音内容 30万条口语化句子
录音内容 30万条口语化句子
录音人 6,408 人 男性 2,999 人,女性 3,301 人
录音人 ≤20 岁 1,481 人,21~30 岁 4,412 人,31~40 岁 244 人,40 岁以上 163 人
录音人 录音人员分布于广东、福建、山东、江苏、北京、湖南、江西、香港、澳门等 34个省级行政区域
设备 安卓:iOS=9:1
语音 普通话;有口音的普通话
应用场景 语音识别,机器翻译,声纹识别
准确率 句标注准确率不低于98%
数据集大小 18G(18756983399byte)

代码解析

run.sh

. ./cmd.sh ## You'll want to change cmd.sh to something that will work on your system.
. ./path.sh

# 定义语料库位置和下载路径
data=/DATA/disk1/ASR
data_url=www.openslr.org/resources/62

# 下载数据
## 输入:语料库位置($data) 数据下载路径($data_url)
## 输出:在$data文件夹下新增解压后的语料库(corpus和transcript文件夹)
local/download_and_untar.sh $data $data_url aidatatang_200zh || exit 1;

# 数据准备
## 输入:解压后的语料库路径($data/aidatatang_200zh)
## 输出:text, wav.scp, utt2spk, spk2utt
local/data_prep.sh $data/aidatatang_200zh/corpus $data/aidatatang_200zh/transcript || exit 1;
## text 用于后面构建词典,训练语言模型G.fst
## wav.scp 用于后面提取MFCC特征
## utt2spk, spk2utt 用于CMVN

# 词典准备
## 输入:text
## 输出:data/local/dict文件夹 (含extra_questions.txt、lexicon.txt、
## silence_phones.txt、nonsilence_phones.txt、optional_silence.txt等文件)
local/prepare_dict.sh || exit 1;
## 主要生成音素相关词典例如:lexicon.txt(发音词典)用于后面构建 L.fst(发音词典模型)

# 语言模型准备
## 输入:data/local/dict
## 输出:Phone Sets, L compilation
utils/prepare_lang.sh --position-dependent-phones false data/local/dict "<UNK>" data/local/lang data/lang || exit 1;
## 生成 L.fst

# 语言模型训练
## 输入:data/local/train/text data/local/dict/lexicon.txt
## 输出:data/local/lm (含text.no_oov, word.counts, unigram.counts, word_map, 3gram-mincount/lm_unpruned.gz)
local/train_lms.sh || exit 1;
## 生成语言模型文件 (apra格式的压缩包 lm_unpruned.gz)

# 将apra格式的语言模型编译成fst格式:G.fst, 并对模型进行检验(确定化..)。
## 输入:data/local/lm/3gram-mincount/lm_unpruned.gz
## 输出:G.fst
local/format_data.sh
## 生成语言模型 G.fst

# 提取MFCC特征
## 输入:wav.scp
## 输出:feat.scp cmvn.scp mfcc.ark cmvn.ark
mfccdir=mfcc
for x in train dev test; do
  steps/make_mfcc_pitch.sh --write_utt2dur false --write_utt2num_frames false --cmd "$train_cmd" --nj 10 data/$x exp/make_mfcc/$x $mfccdir || exit 1;
  steps/compute_cmvn_stats.sh data/$x exp/make_mfcc/$x $mfccdir || exit 1;
  utils/fix_data_dir.sh data/$x || exit 1;
done

# 音素训练
## 输入:
## 输出:
steps/train_mono.sh --cmd "$train_cmd" --nj 10 \
  data/train data/lang exp/mono || exit 1;
  
# Monophone decoding
## 输入:
## 输出:
utils/mkgraph.sh data/lang_test exp/mono exp/mono/graph || exit 1;
steps/decode.sh --cmd "$decode_cmd" --config conf/decode.config --nj 10 \
  exp/mono/graph data/dev exp/mono/decode_dev

steps/decode.sh --cmd "$decode_cmd" --config conf/decode.config --nj 10 \
  exp/mono/graph data/test exp/mono/decode_test

# Get alignments from monophone system.
## 输入:
## 输出:
steps/align_si.sh --cmd "$train_cmd" --nj 10 \
  data/train data/lang exp/mono exp/mono_ali || exit 1; 
 

1. 环境配置

  • cmd.sh 硬件配置 (单机/集群配置,单机修改成run.pl)
  • path.sh 环境变量配置 (导入环境变量)
  • data 语料库位置
  • data_url 下载语料库的url (中国镜像已经关闭)
. ./cmd.sh ## You'll want to change cmd.sh to something that will work on your system.
. ./path.sh
# 定义语料库位置和下载路径
data=/DATA/disk1/ASR
data_url=www.openslr.org/resources/62

2. 下载数据

输入:语料库位置($data) 数据下载路径($data_url)

输出:在$data文件夹下新增解压后的语料库(corpus和transcript文件夹,corpus含音频文件和说话人信息等)

可选参数:

  • --remove-archive 决定是否要在解压后删除data压缩包(默认关闭)
local/download_and_untar.sh $data $data_url aidatatang_200zh || exit 1;

流程:

1.判断是否开启解压后删除压缩包的开关(根据--remove-archive 参数,默认关闭)
2.判断参数是否等于3个(不包含删除压缩包的参数)
3.检验参数有效性(例如文件夹是否存在,下载地址长度是否大于0等,语料库名是否正确【这里需要为aidatatang_200zh】)
4.判断是否已经存在数据并解压完成,完成则退出,未完成则继续
5.判断在$data目录下是否存在aidatatang_200zh.tgz的文件
5.1 如果有,则判断压缩包大小是否正确。错误则删除压缩包
5.2 如果没有,则使用$data_url下载
6.tar -xvzf 数据压缩包
7.处理完后会在$data/$part/添加.complete文件
8.将corpus/下的train/test/dev的wav压缩包分别解压至各目录下,并删除压缩包
9.如果有开启删除压缩包的开关则删除数据压缩包(18G那个)

备注:

解压后产生.complete、corpus和transcript(.complete和两个文件夹同一级目录)
corpus和transcript两个文件夹用于后续步骤

文件格式预览:

  1. corpus文件目录树状结构
corpus/
corpus/dev
corpus/dev/G0002
corpus/dev/G0002/T0055G0002S0001.metadata
corpus/dev/G0002/T0055G0002S0001.trn
corpus/dev/G0002/T0055G0002S0001.txt
corpus/dev/G0002/T0055G0002S0001.wav ... corpus/train
corpus/test
  1. T0055G0002S0001.txt
以后你是男孩子
  1. T0055G0002S0001.trn
以后 你 是 男孩子
  1. T0055G0002S0001.metadata(含说话人信息、wav格式等数据相关信息)
LHD	DataTang
DBN	DY2016110027
SES	G0002
CMT	*** Speech Label Information
SRC	T0055G0002S0001.metadata
DIR	data\G0002\session01\T0055G0002S0001.wav
CCD	reading
  1. transcript/aidatatang_200_zh_transcript.txt
T0055G0002S0001 以后 你 是 男孩子
T0055G0002S0002 兰州 哪有 买路 虎 汽车 的
T0055G0002S0004 看看 我 的 日程表
T0055G0002S0005 我 老婆 是 大 笨蛋
T0055G0002S0006 我 说 你 明天 早上 七点 叫 我 起床

3. 数据准备

输入:解压后的语料库路径(data/aidatatang_200zh)

输出:text, wav.scp, utt2spk, spk2utt

# Data Preparation: generate text, wav.scp, utt2spk, spk2utt
local/data_prep.sh $data/aidatatang_200zh/corpus $data/aidatatang_200zh/transcript || exit 1;

流程:

1.参数/文件夹路径等效验
2.检验是否一共有237265个文件
# find /DATA/disk1/ASR/aidatatang_200zh/corpus -iname "*.wav" | wc -l
# wav.flist 范例: /DATA/disk1/ASR/aidatatang_200zh/corpus/train/G1428/T0055G1428S0319.wav
# 其中G1428是说话人ID,T0055G1428S0319是录音文件ID

3.在data/local/{train,test,dev}下生成text,wav.scp,utt2spk,spk2utt等文件。

text:包含了每条语音对应的转录文本,格式为 <utterance-id><transcription>.
# 范例:T0055G1428S0319 没有 网络 可以 听 短信 吗
wav.scp:记录语音位置的索引文件,格式为<utterance-id><filename>.
# 范例:T0055G1428S0319 /DATA/disk1/ASR/aidatatang_200zh/corpus/train/G1428/T0055G1428S0319.wav
utt2spk:指明语音与说话人的对应关系,格式为<utterance-id><speaker-id>.
# 范例:T0055G1428S0319 G1428
spk2utt:指明说话人与语音的对应关系,可由utt2spk生成,格式为 <speaker-id><utterance-id>.
# 范例:G1428 T0055G1428S0001 T0055G1428S0003 .... T0055G1428S0500

4.把data/local/{train,dev,test}下的spk2utt、utt2spk、wav.scp和text4个文件各cp一份到data/{train,dev,test}下

备注:

该命令执行后将会在当前目录(run.sh的目录)下产生新的文件夹,可通过查看data/local/{train,dev,test}目录下的文件检查相关映射文件

文件格式预览:

  1. text
T0055G0013S0001 今天 什么 日子
T0055G0013S0002 我 要查 一下 我 刚刚 下载 的 游戏
T0055G0013S0003 成都 芳草 街 怎么 走
  1. wav.scp
T0055G0013S0001 /DATA/disk1/ASR/aidatatang_200zh/corpus/train/G0013/T0055G0013S0001.wav
T0055G0013S0002 /DATA/disk1/ASR/aidatatang_200zh/corpus/train/G0013/T0055G0013S0002.wav
T0055G0013S0003 /DATA/disk1/ASR/aidatatang_200zh/corpus/train/G0013/T0055G0013S0003.wav
  1. utt2spk
T0055G0013S0001 G0013
T0055G0013S0002 G0013
T0055G0013S0003 G0013
  1. spk2utt
G0013 T0055G0013S0001 T0055G0013S0002 .... T0055G0013S0500
G0017 T0055G0017S0001 T0055G0017S0002 .... T0055G0017S0500

4. 词典准备

输入:text(所有录音的分词文本信息- 如果是自己的数据没有人工分词可能要提前jieba等工具分词一下)

输出:data/local/dict文件夹(含extra_questions.txt、lexicon.txt、silence_phones.txt、nonsilence_phones.txt、optional_silence.txt等文件)

local/prepare_dict.sh || exit 1;

流程:

1.处理自身数据集
- 获取数据集中所有单词【从text中获取】-> 生成words.txt
- 把整个数据集的单词分成ch和en两个词典 -> 生成words-{en,ch}.txt
2.生成【英文发音字典】,通过CMU字典生成lexicon-en.txt(格式:数据集中的英文单词 及其对应的拼音发音)
- Downloading CMU dictionary
- 格式化cmu字典(把字典中重音和发音标记去除)
- 生成words-en-oov.txt  (数据集中有,字典中没有的单词)
- 生成lexicon-en-iv.txt (数据集能在字典中取得的单词,及其对应的cmu音素)
- 下载安装g2p_model(单词到音素模型,用于转换oov)
- 生成lexicon-en-oov.txt (使用g2p_model生成,oov 及其对应的cmu因素 *由于words-en-oov中含有【VISA卡】这种中英文混用的单词会导致转换失败,会少21条数据,不知道对后面会不会有影响*)
- 生成lexicon-en-phn.txt (merge in-vocab and oov lexicon)
- 将cmu和拼音中无法转换的cmu音素替换成可以转换的因素,生成lexicon-en.txt(通过conf/{cmu2pinyin,pinyin2cmu}字典做映射,将lexicon-en-phn.txt 转换成 lexicon-en.txt)
3.生成【中文发音字典】  
- Downloading cedit dictionary
- 生成words-ch-oov.txt  (数据集中有,字典中没有的单词)
- 生成lexicon-ch-iv.txt (数据集能在字典中取得的单词,及其对应的拼音因素)
- 把字典拆分成字粒度的发音,做成字粒度中文发音字典(ch-char-dict.txt)
- 把多音字合并生成ch-char-dict-mp.txt(格式: 一	SHI2/YI1)
- 生成lexicon-ch-oov.txt (oov及其对应的拼音音素,使用local/create_oov_char_lexicon.pl脚本)
- 因为含有多音字,使用排列组合的方式摊平(lexicon-ch-oov-mp.txt)
- 生成lexicon-ch.txt (merge lexicon-ch-oov-mp.txt and lexicon-ch-iv.txt)
- 将汉语拼音转换成cmu音素生成lexicon-ch-cmu.txt (lexicon-ch.txt -> lexicon-ch-cmu.txt)
4. 合并中英文发音字典生成lexicon1.txt(lexicon-en.txt,lexicon-ch-cmu.txt)
5. 生成nonsilence_phones.txt/silence_phones.txt/optional_silence.txt/extra_questions.txt
6. 添加一些静音噪音的标签在lexicon1.txt的开头生成lexicon.txt

备注:

最终生成的文件存放在data/local/dict中,主要含有:

  • lexicon.txt文件是单词对应音素的字典文件【发音词典】
  • extra_questions.txt:用来构建决策树的问题集,可以是空的,包含多组相同的音素,每一组音素包含相同的重音或者声调;问题集的本质就是将具有相同特点的数据归为一个类别,认为满足此问题集的音素x的在声音上存在很高的相似性,进而表现为在特征上也具有很高的相似性,所以定义此问题集将这类音素x归为一个类别。Kaldi中表示任意音素x,一旦它本身(中间,左边, 或者右边)的音素为同一组中的任意一个,则在该问题下可视这些音素为同一个类别
  • silence_phones.txt / nonsilence_phones.txt为静音/非静音音素,每一行代表一组相同的base phone,但可能有不同的声调的音素,如: AA AA1 AA2 AA3 AA4 AA5 (5表示轻声,1234表示不同重音标记【音调】)
  • optional_silence.txt:包含一个单独的音素用来作为词典中默认的静音音素(用于填充词间静音的音素)

文件格式预览:

  1. lexicon.txt
# 格式: 词 音素1 音素2 ...音素n
!SIL SIL
[VOCALIZED-NOISE] SPN
[NOISE] NSN
[LAUGHTER] LAU
<UNK> SPN
A AH
...
龟用 G UW1 IY1 Y UH4 NG4
龟用 G UW1 IY1 Y UH5 NG5
  1. nonsilence_phones.txt
AA AA1 AA2 AA3 AA4 AA5
AE AE1 AE2 AE3 AE4 AE5
AH AH1 AH2 AH3 AH4 AH5
AO AO1 AO2 AO3 AO4 AO5
AW AW1 AW2 AW3 AW4 AW5
AY AY1 AY2 AY3 AY4 AY5
B
CH
D
EH EH1 EH2 EH3 EH4 EH5
  1. silence_phones.txt (用来表示无效语音内容的音素)
SIL SPN NSN LAU
  1. optional_silence.txt
SIL
  1. extra_questions.txt(重音对于音素声学表现的影响是独特的,不同音调的音素不应该聚到同类中)
SIL SPN NSN LAU
AA AE AH AO AW AY B CH D EH ER EY F G HH IY J JH K L M N NG OW P Q R S SH T UH UW W X Y Z
AA4 AE4 AH4 AO4 AW4 AY4 EH4 ER4 EY4 IY4 N4 NG4 OW4 R4 UH4 UW4
AA1 AE1 AH1 AO1 AW1 AY1 EH1 ER1 EY1 IY1 N1 NG1 OW1 UH1 UW1
AA3 AE3 AH3 AO3 AW3 AY3 EH3 ER3 EY3 IY3 N3 NG3 OW3 R3 UH3 UW3
AA2 AE2 AH2 AO2 AW2 AY2 EH2 ER2 EY2 IY2 N2 NG2 OW2 R2 UH2 UW2
AA5 AE5 AH5 AO5 AW5 AY5 EH5 ER5 EY5 IY5 N5 NG5 OW5 R5 UH5 UW5

5. 语言模型准备

输入:data/local/dict

输出:data/lang (Phone Sets), (L compilation) ...

可选参数:

  • --num-sil-states <number of states> (静音音素的状态数,预设是5)
  • --num-nonsil-states <number of states>(非静音音素的状态数,预设是3)
  • --position-dependent-phones (true|false)(是否开启音素位置标记)
  • --share-silence-phones (true|false)(预设为false,如果为true 所有“silence”音素(比如静音,发声噪声和笑声)的高斯混合模型的概率密度函数都是共享的,只有这些模型之间的转移概率不同)
  • --sil-prob <probability of silence> (静音的概率,预设是0.5)
  • --phone-symbol-table <filename> (是否有自己提供的phone.txt)
  • --unk-fst <text-fst> (是否有集外词的fst)
  • --extra-word-disambig-syms <filename> (是否有额外的词级别的消歧符)
utils/prepare_lang.sh --position-dependent-phones false data/local/dict
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值