接上回,我们继续看run.sh
#you can obtain the database by uncommting the following lines
#[ -d $thchs ] || mkdir -p $thchs || exit 1
#echo "downloading THCHS30 at $thchs ..."
#local/download_and_untar.sh $thchs http://www.openslr.org/resources/18 data_thchs30 || exit 1
#local/download_and_untar.sh $thchs http://www.openslr.org/resources/18 resource || exit 1
#local/download_and_untar.sh $thchs http://www.openslr.org/resources/18 test-noise || exit 1
这没什么可说的,这个就是让你下载thchs30语音数据包后,解压到相应的目录下,但是这里原版run.sh中已经注释这些了,意思是你如果需要就用这个脚本下载,我们已经下载完毕了,这里不需要。
还记得上回咱们说到,因为内存可能不够,单步跑时是在run.sh的脚本中看到
#data preparation
这句,在它之后就全是shell的命令。建议一条一条的跑。不然中间会有莫名奇妙的断档和错误。如何一条条跑呢?
使用注释::<这里就是啦。
#data preparation
#generate text, wav.scp, utt2pk, spk2utt
local/thchs-30_data_prep.sh $H $thchs/data_thchs30 || exit 1;
所以我们先来跑local/thchs-30_data_prep.sh 这里是数据准备工作,我们先来看看这里面的内容
#!/bin/bash
# Copyright 2016 Tsinghua University (Author: Dong Wang, Xuewei Zhang). Apache 2.0.
# 2016 LeSpeech (Author: Xingyu Na)
#This script pepares the data directory for thchs30 recipe. 此处注明此脚本用于准备hchs30的数据目录。
#It reads the corpus and get wav.scp and transcriptions.它读取语料库并得到wav.scp和音标。
dir=$1
corpus_dir=$2
这两个其实就是上面这个命令local/thchs-30_data_prep.sh $H $thchs/data_thchs30的两个参数 $H $thchs/data_thchs30
$1 代表 $H 也就是 run.sh中的H=`pwd` 实际上就是当前目录
$2 代表 $thchs/data_thchs30 因为run.sh中之前声明thchs=/opt/kaldi/egs/thchs30/thchs30-openslr
所以这里$thchs/data_thchs30就是指的/opt/kaldi/egs/thchs30/thchs30-openslr/data_thchs30 也就是语音目录
#create wav.scp, utt2spk.scp, spk2utt.scp, text 我的理解是创建语音的相关文件
这里说明一下 根据音频名和标注创建:wav.scp, utt2spk.scp, spk2utt.scp, text以及word.txt phone.txt。
wav.scp中第一列为录音编号
举例:A11_000 /opt/kaldi/egs/thchs30/thchs30-openslr/data_thchs30/train/A11_0.wav
utt2spk中第一列为录音编号
举例:A11_000 A11
spk2utt中第一列为讲话着
这个就是后面需要将data/train/utt2spk 转换为 data/train/spk2utt格式的
word.txt中第一列为录音编号
举例:A11_000 绿 是 阳春 烟 景 大块 文章 的 底色 四月 的 林 峦 更是 绿 得 鲜活 秀媚 诗意 盎然
phone.txt中第一列为录音编号
举例:A11_000 l v4 sh ix4 ii iang2 ch un1 ii ian1 j ing3 d a4 k uai4 uu un2 zh ang1 d e5 d i3 s e4 s iy4 vv ve4 d e5 l in2 l uan2 g eng4 sh ix4 l v4 d e5 x ian1 h uo2 x iu4 m ei4 sh ix1 ii i4 aa ang4 r an2
echo $uttid $corpus_dir/$x/$nn.wav >> wav.scp #说话者内容和号码, 说话号码输出 语音文件全路径名称输出 例如
A11_000 /opt/kaldi/egs/thchs30/thchs30-openslr/data_thchs30/train/A11_0.wav
echo $uttid $spkid >> utt2spk #说话者内容和号码, 说话号码输出 说话者id 例如 A11_000 A11
echo $uttid `sed -n 1p $corpus_dir/data/$nn.wav.trn` >> word.txt # #说话者内容和号码, 说话号码输出 并且找到相应文件获取语音数据(内容的第一行是中文)
例如 A11_000 绿 是 阳春 烟 景 大块 文章 的 底色 四月 的 林 峦 更是 绿 得 鲜活 秀媚 诗意 盎然
echo $uttid `sed -n 3p $corpus_dir/data/$nn.wav.trn` >> phone.txt #说话者内容和号码, 说话号码输出 并且找到相应文件获取语音数据(内容的第三行是音标)
例如 A11_000 l v4 sh ix4 ii iang2 ch un1 ii ian1 j ing3 d a4 k uai4 uu un2 zh ang1 d e5 d i3 s e4 s iy4 vv ve4 d e5 l in2 l uan2 g eng4 sh ix4 l v4 d e5 x ian1 h uo2 x iu4 m ei4 sh ix1 ii i4 aa ang4 r an2
)
我们来看看utils/utt2spk_to_spk2utt.pl 这个脚本
#!/usr/bin/env perl
# Copyright 2010-2011 Microsoft Corporation
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
# WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
# MERCHANTABLITY OR NON-INFRINGEMENT.
# See the Apache 2 License for the specific language governing permissions and
# limitations under the License.
# converts an utt2spk file to a spk2utt file.
# Takes input from the stdin or from a file argument;
# output goes to the standard out.
if ( @ARGV > 1 ) {
die "Usage: utt2spk_to_spk2utt.pl [ utt2spk ] > spk2utt";
}
while(<>){
@A = split(" ", $_);
@A == 2 || die "Invalid line in utt2spk file: $_";
($u,$s) = @A;
if(!$seen_spk{$s}) {
$seen_spk{$s} = 1;
push @spklist, $s;
}
push (@{$spk_hash{$s}}, "$u");
}
foreach $s (@spklist) {
$l = join(' ',@{$spk_hash{$s}});
print "$s $l\n";
}
这里面基本上就是转换,好了,我们先将这些处理完了再说,未完待续。。。。。。