Force Alignment
一、.最好采用做两遍FA
1. 第一遍词的
字典采用两行的silsp的。
eg:衣Q [y_i1_k_iu1_sil] y i1 k iu1 sil
衣Q [y_i1_k_iu1_sp] y i1 k iu1 sp
注意字典中不包含sp,包含sil sil;做FA后结果是中括号中的内容
awk 'NR==FNR{w[$1]=1}NR!=FNR{if(NF>2){z=0;num=split($3,a,"_");for(i=1;itrain.align.pinyin.mlf
pinyin.dict :所以出现的中文必须包含在里面。中英文混合的按照英文处理
eg:AB型 [ei1_b_i1_x_i2_ng_sil] ei1 b i1 x i2 ng sil
AB型 [ei1_b_i1_x_i2_ng_sp] ei1 b i1 x i2 ng sp
map中: ei1_b_i1_x_i2_ng ei1 b i1 x i2 ng
2. 第二遍字的
采用三行的silsp,第一列是第一遍词括号中的phone标注
eg:z_y_i1 z y i1
z_y_i1 z y i1 sil
z_y_i1 z y i1 sp
FA后就是phone级别的标注了
注意check sil sp
sp>&#61;5帧替换为sil。sil<5帧替换为sp
gmm&#xff1a; echo &#39;#!MLF!#&#39; >use.train.align.model.mlf
cat train.align.model.mlf|awk &#39;$0!~/MLF/{print}&#39; | awk &#39;BEGIN{RS&#61;"\n[.]\n";FS&#61;"\n"}{printf"%s\n%s\n",$1,$2;for(i&#61;3;i<&#61;NF-1;i&#43;&#43;){num&#61;split($i,a," ");if(a[3]&#61;&#61;"sil"&&(a[2]-a[1])/100000<5){gsub("sil","sp",a[3]);}else{if(a[3]&#61;&#61;"sp"&&(a[2]-a[1])/100000>&#61;5){gsub("sp","sil",a[3]);}};for(j&#61;1;j<&#61;num;j&#43;&#43;)printf"%s ",a[j];printf"\n";}printf"%s\n.\n",$NF}&#39; >>use.train.align.model.mlf
dnn&#xff1a;./mlf2dnn.sh train.align.state.mlf tri.xwrd.cluster.list correct_train.align.state.mlf
总结&#xff1a;第一遍采用词可以避免多音字的错误&#xff0c;第二遍可以得到字间的sil和sp
只采用词做FA得不到字间的sil sp信息&#xff0c;只采用字做FA会有多音的影响
二、DNN做FA和GMM的区别
1. 对于DNN需要state级别的标注&#xff0c;gmm需要model级别的标注
hvite中 -m 是得到model级别的&#xff0c;-f 是state级别的
2. dnn做FA需要dnn的hvite&#xff0c;gmm做FA普通的hvite就ok