从说话人识别demo开始学习kaldi--(3)aishell_data_prep.sh

#!/bin/bash

# Copyright 2017 Xingyu Na
# Apache 2.0

. ./path.sh || exit 1;
.<<EOF
类似python中的import,第一个点表示引用文件,
第二个点表示在当前目录下找,两个点中间一定要有空格
双竖线‘||’,用双竖线‘||’分割多条命令,执行的时候遵循如下规则,如果前一条命令为真,
则后面的命令不会执行,如果前一条命令为假,则继续执行后面的命令。
EOF

if [ $# != 2 ]; then
  echo "Usage: $0 <audio-path> <text-path>"
  echo " $0 /export/a05/xna/data/data_aishell/wav /export/a05/xna/data/data_aishell/transcript"
  exit 1;
fi
.<<EOF
如果所给参数的数量不是2,则报错并退出
EOF


aishell_audio_dir=$1
aishell_text_dir=$2
.<<EOF
使用变量来接收两个参数
EOF

train_dir=data/local/train
dev_dir=data/local/dev
test_dir=data/local/test
# 变量赋值

mkdir -p $train_dir
mkdir -p $dev_dir
mkdir -p $test_dir
# 创建目录,-p 如果上级目录没有创建,即创建输入路径上的所有目录


# data directory check
if [ ! -d $aishell_audio_dir ] || [ ! -d $aishell_text_dir ]; then
  echo "Error: $0 requires two directory arguments"
  exit 1;
fi
# 检查目录,这里的双竖线也是管道的意思么?如果前一条命令为真,则后面的命令不会执行啊
# 应该是 或 的意思


# find wav audio file for train, dev and test resp.
find $aishell_audio_dir -iname "*.wav" | grep -i "wav/train" > $train_dir/wav.flist || exit 1;
find $aishell_audio_dir -iname "*.wav" | grep -i "wav/dev" > $dev_dir/wav.flist || exit 1;
find $aishell_audio_dir -iname "*.wav" | grep -i "wav/test" > $test_dir/wav.flist || exit 1;
.<<EOF
竖线‘|’ ,在linux中是作为管道符的,将‘|’前面命令的输出作为'|'后面的输入。
find 用名字查,后缀名是wav的文件,在这些文件中用grep查,-i 不区分大小写,
将找到文件名字都写进一个flist为后缀的文件中,表示将需要用到的所有文件名字都整理到一个文件中
https://blog.csdn.net/evolone/article/details/78277042
用双竖线‘||’分割多条命令,执行的时候遵循如下规则,如果前一条命令为真,则后面的命令不会执行,如果前一条命令为假,则继续执行后面的命令。

这三句话在三个文件夹下面各新建了一个文件
wav文件的文件名中有train的,就写入train文件夹下的wav.flist
wav文件的文件名中有dev的,就写入dev文件夹下的wav.flist
wav文件的文件名中有test的,就写入test文件夹下的wav.flist

EOF



n=`cat $train_dir/wav.flist $dev_dir/wav.flist $test_dir/wav.flist | wc -l`
[ $n -ne 141925 ] && \
  echo Warning: expected 141925 data data files, found $n
.<<EOF

wc命令是用来干什么的:https://www.runoob.com/linux/linux-comm-wc.html
cat命令:https://www.cnblogs.com/zhangchenliang/p/7717602.html
cat 打开查看文件
打开三个文件,对这三个文件都执行命令 wc -l,即输出总行数
第一行的意思是打开三个文件,计算总行数,赋值给n
下面检查n如果不是141925,报错并显示正确的行数
linux的反斜杠是用来做什么的,https://blog.csdn.net/u011192409/article/details/46815895
EOF



# Transcriptions preparation
for dir in $train_dir $test_dir; do
  echo Preparing $dir transcriptions
  sed -e 's/\.wav//' $dir/wav.flist | awk -F '/' '{print $NF}' > $dir/utt.list
  sed -e 's/\.wav//' $dir/wav.flist | awk -F '/' '{i=NF-1;printf("%s %s\n",$NF,$i)}' > $dir/utt2spk_all
  paste -d' ' $dir/utt.list $dir/wav.flist > $dir/wav.scp_all
  utils/filter_scp.pl -f 1 $dir/utt.list $aishell_text_dir/*.txt > $dir/transcripts.txt
  awk '{print $1}' $dir/transcripts.txt | sort -u > $dir/utt.list
  utils/filter_scp.pl -f 1 $dir/utt.list $dir/utt2spk_all | sort -u > $dir/utt2spk
  utils/filter_scp.pl -f 1 $dir/utt.list $dir/wav.scp_all | sort -u > $dir/wav.scp
  sort -u $dir/transcripts.txt > $dir/text
  utils/utt2spk_to_spk2utt.pl $dir/utt2spk > $dir/spk2utt
done
.<<EOF

Linux sed 命令是利用脚本来处理文本文件。
sed 可依照脚本的指令来处理、编辑文本文件。
Sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。
sed -e 以选项中指定的script来处理输入的文本文件。
's/\.wav//' : 应该是先去掉了每一行中的.wav 这个几个字符,去掉后缀名
单竖线,是将前面的输出作为后面的输入
awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
awk -F '/',以'/'为分隔符
有{print NF} 也有{print $NF},前者是输出了域个数,后者是输出最后一个字段的内容
本来每行是一个路径,首先去掉后缀名,其次取文件名
> 表示把结果写入到一个新文件中,就是把文件名写入到一个新文件中
 Linux paste 命令用于合并文件的列,-d 用指定的间隔字符取代跳格字符。
 将新提取出来的文件名合并到原来的文件中,作为原文件wav.flist的新加的一列,再个新名字叫wav.scp_all
下面调用utils文件夹下面的filter_scp.pl文件,它用notepad++打开后第一行是#!/usr/bin/env perl
这告诉我们这个pl文件是一个Perl语言的脚本,只需要知道这个文件使用来做什么的就好了
根据文件名来找相应的转录文本,过滤原始的转录文本文件,这里只取一部分。语音识别一般都是要这一步的,说话人识别一般不需要。
#! /usr/bin/env在脚本中的作用:https://blog.csdn.net/iamzhangzhuping/article/details/50425754
后面的-f 1 应该都是给perl文件的参数,意思是把$dir/utt.list和$aishell_text_dir/*.txt经过这个perl文件处理后写入到$dir/transcripts.txt这个文件中
awk '{print $1}' $dir/transcripts.txt | sort -u > $dir/utt.list
这句话是说对transcripts.txt这个文件取第一列,然后排序,并去掉重复后写入utt.list这个文件中
sort的-u 选项它的作用很简单,就是在输出行中去除重复行

这一步生成了很多文件,具体可挨个打开文件查看
主要就是生成了train和test各自,自己的utt2spk,wav.scp,spk2utt,text等文件
EOF


mkdir -p data/train data/test
# 新建了两个目录,即新建了两个文件夹

for f in spk2utt utt2spk wav.scp text; do
  cp $train_dir/$f data/train/$f || exit 1;
  cp $test_dir/$f data/test/$f || exit 1;
done
# Linux cp命令主要用于复制文件或目录
# 将这些文件,spk2utt utt2spk wav.scp text,换个地方放

echo "$0: AISHELL data preparation succeeded"
exit 0;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值