可以选择下载解压之后删除压缩包, --remove-archive 使用该标记实现
下载的文件存放目录:$data,如果不存在则返回错误
aishell一共有两个part,可以选择一个part下载,但只能在这两个范围之内选择:data_aishell resource_aishell,会判断下载的part在不在list中, 如果不在,则返回错误
下载之前会判断url的长度是否为0,如果长度为0则返回错误
下载解压完成之后有一个complete标记: d a t a / data/ data/part/.complete
两个part的大小分别为:15582913665 1246920字节
下载的文件和位置: d a t a / data/ data/part.tgz,如果存在,则判断大小,读取大小的命令为:
$(/bin/ls -l d a t a / data/ data/part.tgz | awk ‘{print $5}’)
如果大小在列表中,则ok,否则rm掉
如果 d a t a / data/ data/part.tgz不存在,则,下载。首先查看wget是否安装了。
if ! which wget > /dev/null; 这个是判断是否为空,为空时会进去。
full下载链接:$url/part.tgz
这里面有个技巧,执行不成功返回null,执行成功返回true,来判断是否下载和解压成功:
if ! weget $full_url;then
echo error
exit 1;
fi
if ! tar xvf $full_url; then
echo error
exit 1
fi
到此,下载和解压都完成了。
生成完成标记: 生成方法为touch语句
touch d a t a / data/ data/part/.complete
如果是data_aishell数据,则进入到wav目录:data/$part/wav,解压下面的全部tar.gz文件
for wav in ./*.tar.gz;do
echo ....
tar -zxf $wav && rm wav
done
最后显示成功下载并解压文件日志
如果有标记要remove掉压缩包,则移除压缩包
最后退出
exit 0
local/aishell_data_prep.sh
首先检查参数是否是两个
if [ $# != 2 ];then
...
fi
第一个参数,wav目录
第二个参数,取得text: $2/aishell_transcript_v0.8.txt
定义并创建
train_dir=data/loca/train
dev_dir = data/local/dev
test_dir=data/local/test
tmp_dir=data/local/tmp
如果wav目录不存在或者翻译文稿不存在,则报错 exit1
find $aishell_audio_dir -iname “*.wav” > $tmp/wav.flist
cat $tmp/wav.flist | wc -l
按照文件夹区分train test dev文件列表,存储到对应的文件夹下
grep -i “wav/train” $tmp/wav.flist > $train_dir/wav.flist || exit 1; 如果不成功则退出,都是这么写的, 自己平时很少这么写。
其他两个同理 grep -i 的i表示忽略大小写 这样就把 train test dev的wav.flist都整理好了
删除tmp文件夹
获取utt_id,然后拼接起来
```bash
sed -e "s/\.wav//" $train_dir/wav.flist | awk -F '/' '{print $NF}' > $train_dir/utt.list
paste -d' ' $dir/utt.list $dir/wav.flist > $dir/wav.scp_all
tools/filter_scp.pl -f 1 $dir/utt.list $aishell_text > $dir/transcripts.txt
```
tools/filter_scp.pl这是一个专门的脚本,第一个文件的第一个字段 是 uttid,用于过滤出第二个文件中,第n个字段包含uttid的行
sed -e ‘s/.wav//’ data/local/dev/wav.flist | awk -F ‘/’ ‘{print $NF}’ > utt.list
最后把整理好的wav.scp text放到data/train/dev/test下面为训练做准备
生成字典data/dict/lang_char.txt
tools/text2token.py 把拼接在一起的文本变成单字,例如:处理后的例子如下
tools/text2token.py -s 1 -n 1 data/train/text 跳过第一列,-n表示组内个数
grep -a -v -e '^\s*$'
-a 在文件是二进制文件时使用
-v 输出不符合条件的
-e 字符串为范本样式
把wav.scp 和 text准备成data.list
需要区分是shard还是raw,raw的话,适合小数据,直接将音频和对应的文本整合为一条,key,wav,txt
获取执行命令之后的内容这样写:numgpu=$(echo $CUDA_VISIBLE_DEVICES| awk -F ‘,’ ‘{print NF}’)
计算world_size,表示总共有多少个gpu进行训练,方法是num_gpu * num_node, num_node默认是1
数学计算用命令:world_size=expr $num_gpus \* $num_nodes
可以用个&&表示,第一部分成功的话,执行第二部分
空的定义为:cmvn_opt=这样就可以
如果cmvn ture,则,cmvn_opt重新赋值为"–cmvn $dir/global_cmvn"
for循环的写法,是两个括号
for((i=0;i<$num_gpu; ++i));do
{}
&
done
当前训练的gpuid=$(echo C U D A V I S I B L E D E V I C E S ∣ c u t − d ′ , ′ − f CUDA_VISIBLE_DEVICES | cut -d',' -f CUDAVISIBLEDEVICES∣cut−d′,′−f[$i+1])
:+ 当前面变量不为空时,用后面的替换
${checkpoint:±-checkpoint $checkpoint}
有一个world_size,还有一个rank
world_size是所有分布式机器的gpu个数,rank是当前排名,计算方法需要用到node_rank这个是传入的,
rank = node_rank * num_gpus + $i
[ ] 里面可以直接进行数学运算,比如 []里面可以直接进行数学运算,比如 []里面可以直接进行数学运算,比如[$i+1]
最后使用命令:bash run.sh --stage 5 --stop-stage 5 --average_checkpoint false
导出libtorch模型,zip模型
脚本:wenet/bin/export_jit.py
参数 train conf,要导出的模型,checkpoint,导出的模型 output_file, 导出的量化模型,output_quant_file
bash run.sh --stage 6 --stop-stage 6
跑lm模型,解码时添加LM模型,使用runtime去跑
准备工作
报错:
srilm tools are not found, please download it and install it from:
http://www.speech.sri.com/projects/srilm/download.html
Then add the tools to your PATH
解决方法:kaldi、wenet的tools文件夹里都有install_srilm.sh脚本可以直接执行安装srilm,
cd tools
bash install_srilm.sh
cd ..
source tools/env.sh
whichi srilm
第一部分:生成lexicon
本地文件可以自己编写对应的prepare dict脚本运行,生成输入的dict
第二部分训练lm
训练结果存放在目录data/local/lm中
首先把训练文本放到里面,data/local/lm/text内容如下:
BAC009S0002W0135 银行 业金 融机 构 执行 首套 房贷 款 政策
BAC009S0002W0136 这个 后来 被 称 为 九三零 新政 策 的 措施
训练lm
tools/filter_scp.pl data/train/text
$data/data_aishell/transcript/aishell_transcript_v0.8.txt > $lm/text
local/aishell_train_lms.sh跑训练
脚本解析:
首先需要依赖两个文件 data/local/lm/text也就是训练文本
然后依赖词典,data/local/dict/lexicon.txt
检查两个文件在不在,不在提示不在,然后退出
然后检查srilm工具在不在,通过which命令完成
```bash
if ! which ngram-count >/dev/null;then
找不到则进入该分支,打印提示,退出
fi
```
当前工作目录dir=data/local/lm/text
准备好干净的text cleantext=$dir/no_oov
cat $text | awk -v lex=$lexicon
'BEGIN{while((getline0){ seen[$1]=1; } }
{for(n=1; n<=NF; n++)
{ if (seen[$n])
{ printf("%s ", $n); }
else
{printf(" ");}
}
printf("\n");
}'
awk -v
begin中的内容,把见过的词都添加到seen中
接下来对text的每一行处理,
cat $cleantext | awk '{for(n=2;n<=NF;n++) print $n; }' | sort | uniq -c | \
sort -nr > $dir/word.counts || exit 1;
-c表示计数
sort -nr 表示倒叙根据数值排序,结果为
48876 的
11114 在
10171 一
9609 了
也就是对所有的分词结果进行排序计数去重复,按照倒叙排序
cat $cleantext | awk '{for(n=2;n<=NF;n++) print $n; }' | \
cat - <(grep -w -v '!SIL' $lexicon | awk '{print $1}') | \
sort | uniq -c | sort -nr > $dir/unigram.counts || exit 1;
- cat -表示标准输入流
- 上面命令把所有cleantext的内容打印出来,再打印第二项内容,然后和上面的明林狗一样,进行排序计数去重复按照倒叙排序
该文件在cleantext有的词计数上+1 ,其他的cleantext没有的(lexicon大的多),计数都为1
结果存放在了unigram.counts中
data/local/lm/wordlist 中存放unigram.counts第一列,最后添加两个标记
生成data/local/lm/heldout和data/local/lm/train
heldout是clean data的前10000行
train是clean的除了前9999的全部行,两个文件有一个叠加数据
heldout和train回去掉第一个无用字符
head -5 表示输出前5个
tail -n +5 表示输出第5个及后面的数据
ngram-count -text $dir/train -order 3 -limit-vocab -vocab $dir/wordlist -unk \
-map-unk "" -kndiscount -interpolate -lm $dir/lm.arpa
ngram -lm $dir/lm.arpa -ppl $dir/heldout
ngram-count -text $dir/train -order 3 -limit-vocab -vocab $dir/wordlist -unk \
-map-unk "" -kndiscount -interpolate -lm $dir/lm.arpa
输入参数text表示训练的语料;order表示语言模型阶数;limit-vocab不知道
vocab wordlist是所有字典第一列,外加两个标记
-unk不知道 -map-unk “” -kndiscount不知道 -interpolate是插值的意思
lm data/local/lm/lm.arpa是生成的语言模型
ngram命令不知道是干嘛的,heldout也不知道是干啥的
最后word.count好像没有用,其他的用了
生成TLG
tools/fst/compile_lexicon_token_fst.sh
data/local/dict data/local/tmp data/local/lang
tools/fst/make_tlg.sh data/local/lm data/local/lang data/lang_test || exit 1;
报错:
tools/fst/compile_lexicon_token_fst.sh: line 61: fstcompile: command not found
tools/fst/compile_lexicon_token_fst.sh: line 62: fstarcsort: command not found
解决方法,重新安装openfst
https://blog.csdn.net/HEYUDAGE/article/details/128271395
如果遇到libfstscript.so.8 错误
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
或者重新编译:mkdir build && cd build && cmake -DGRAPH_TOOLS=ON … && cmake --build .
模型加载错误:
torch::jit::ErrorReport
下载的libtorch文件版本为:
https://download.pytorch.org/libtorch/cpu/libtorch-shared-with-deps-1.13.0%2Bcpu.zip
报错:torch::jit::ErrorReport 原因是加载错误,根本原因是版本libtorch和torch的版本不匹配,更多的时候,libtorch的版本低于torch版本,解决方法,提升libtorch的版本或者降低torch的版本。比如libtorch1.12,则torch版本为1.12或者1.11.
遇到问题需要打印日志,修改:
…/…/core/bin/decoder_main.cc
例如打印方式:
std::cout << “wav.utt” << wav.first << std::endl;
std::cout << “wav_name:” << wav.second << std::endl;
train lm ,with data/lcoal/lm/text (annotation with space), and data/loca/dict/lexicon.txt
(所有的词)
local/aishell_train_lms.sh
decoder_main如果找不到就 . ./path.sh