kaldi例子thchs30笔记(二)
作者:互联网
数据准备
由于我们已经下载过数据了,直接进行数据准备。
根据注释,我们知道,数据准备就是要产生四个文件分别是text,wav.scp,utt2spk,spk2utt
(1)text:音频标注
(2)wav.scp:指定音频路径
(3)utt2spk:音频对应的说话人信息
(4)spk2utt:说话人对应的音频信息
打开s5/local/thchs-30_data_prep.sh
mkdir -p data/{train,dev,test}
在data文件夹下创建三个文件夹分别是train、dev、test用来存储数据。
for x in train dev test; do
echo "cleaning data/$x"
cd $dir/data/$x
rm -rf wav.scp utt2spk spk2utt word.txt phone.txt text
echo "preparing scps and text in data/$x"
首先判断在这三个文件夹中是否有数据,如果有,进入文件,将其删除。然后重新进行数据准备,这里说的数据是已经处理好的上边的四个数据文件text、wav.scp、utt2spk、spk2utt。
for nn in `find $corpus_dir/$x -name "*.wav" | sort -u | xargs -I {} basename {} .wav`; do
- 第一步是找到原始数据中的所有wav文件,并输出绝对路径
- 第二步是根据上一步得到的路径来进行排序,-u指的是去掉重复行
- 第三步是输出文件的basename(去掉wav), -I 表示逐行操作。
所以上述代码出来的是所有的wav文件的文件名。
spkid=`echo $nn | awk -F"_" '{print "" $1}'`
spk_char=`echo $spkid | sed 's/\([A-Z]\).*/\1/'`
spk_num=`echo $spkid | sed 's/[A-Z]\([0-9]\)/\1/'`
spkid=$(printf '%s%.2d' "$spk_char" "$spk_num")
utt_num=`echo $nn | awk -F"_" '{print $2}'`
uttid=$(printf '%s%.2d_%.3d' "$spk_char" "$spk_num" "$utt_num")
对于类似于 A11_0 这样的文件,以 “_” 区分开,会分成两个部分, A11和0,spkid读取A11,也就是说话人的id。在spkid中读取A-Z的字母片段和0-9的数字片段,对于A11, spk_char=“A”, spk_num=“11”,最后一行读取的是某个说话人说的第几句话的索引。
echo $uttid $corpus_dir/$x/$nn.wav >> wav.scp
echo $uttid $spkid >> utt2spk
echo $uttid `sed -n 1p $corpus_dir/data/$nn.wav.trn` >> word.txt
echo $uttid `sed -n 3p $corpus_dir/data/$nn.wav.trn` >> phone.txt
以上几句是将读取的文件名 文件的绝对路径写到wav.scp,每句话对应的说话人写到 utt2spk,对应的word和phone写到对应的文本中。
标签:utt2spk,spkid,kaldi,笔记,echo,thchs30,spk,wav,data 来源: https://blog.csdn.net/weixin_43587572/article/details/114634955