GitHub:https://github.com/Xianchao-Wu/wekws是2022年5月31号fork的,目标还是逐行基于脑图来学习分析代码。
WeKws = wenet + keyword spotting
该工具包的目标是...
低功耗、
模型参数少、
计算复杂度低,并且
以流的方式检测预定义的关键字,即
需要低延迟。
典型场景
一些安装包:
root@fdb35a512cab:/workspace/asr/wekws#
more requirements.txt
flake8==3.8.2
pyyaml>=5.1
tensorboard
tensorboardX
matplotlib
onnxruntime数据下载




正好复用上面的截屏。stage=0的情况。



脑图

继续看:


得到的文件为:

cmvn



wav to duration


make_list.py

就是把几个文件的结果统一放到一个地方:

如此,就得到了三个集合的data.list:

正式进入training:

为了可以使用ipdb,我这里对原来的run.sh的脚本进行了一些修改:

另外一个修改是:

注意:
gpus="0",我只用了一个gpu;
config=conf/ds_tcn.yaml
走起!
命令行参数 args=

config文件读取
然后是读取configs 配置文件里面的信息:

格式不太好,来个截屏:

来个权宜之计:

看一些脑图吧:
main()脑图1
大概的逻辑,读取参数,读取配置文件,构造train dataset,构造valid dataset,然后是初始化模型。

main()脑图2
构造executor,
构造参数优化器optimizer,
构造learning rate的scheduler,
以及对每个epoch循环,进行train, valid,保存checkpoint的各项操作。

挑选重要的几个,说一下吧。
backbone
ipdb>self.networkModuleList(
(0): DsCnnBlock(
(quant): QuantStub()
(dequant): DeQuantStub()
(cnn): Sequential(
(0): Conv1d(256,256, kernel_size=(8,), stride=(1,), groups=256)
(1): BatchNorm1d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(2): ReLU()
(3): Conv1d(256,256, kernel_size=(1,), stride=(1,))
(4): BatchNorm1d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(5): ReLU()
(6): Dropout(p=0.1, inplace=False)
)
)
(1): DsCnnBlock(
(quant): QuantStub()
(dequant): DeQuantStub()
(cnn): Sequential(
(0): Conv1d(256,256, kernel_size=(8,), stride=(1,), dilation=(2,), groups=256)
(1): BatchNorm1d(256, eps=1e-05, momentum=0.1, affine=True,
track_running_stats=True)
(2): ReLU()
(3): Conv1d(256,256, kernel_size=(1,), stride=(1,))
(4): BatchNorm1d(256, eps=1e-05, momentum=0.1, affine=True,
track_running_stats=True)
(5): ReLU()
(6): Dropout(p=0.1, inplace=False)
)
)
(2): DsCnnBlock(
(quant): QuantStub()
(dequant): DeQuantStub()
(cnn): Sequential(
(0): Conv1d(256,256, kernel_size=(8,), stride=(1,), dilation=
(4,), groups=256)
(1): BatchNorm1d(256, eps=1e-05, momentum=0.1, affine=True,
track_running_stats=True)
(2): ReLU()
(3): Conv1d(256,256, kernel_size=(1,), stride=(1,))
(4): BatchNorm1d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(5): ReLU()
(6): Dropout(p=0.1, inplace=False)
)
)
(3): DsCnnBlock(
(quant): QuantStub()
(dequant): DeQuantStub()
(cnn): Sequential(
(0): Conv1d(256,256, kernel_size=
(8,), stride=(1,), dilation=(8,), groups=256)
(1): BatchNorm1d(256, eps=1e-05, momentum=0.1, affine=True,
track_running_stats=True)
(2): ReLU()
(3): Conv1d(256,256, kernel_size=(1,), stride=(1,))
(4): BatchNorm1d(256, eps=1e-05, momentum=0.1, affine=True,
track_running_stats=True)
(5): ReLU()
(6): Dropout(p=0.1, inplace=False)
)
))上面就是tcn, 时序卷积网络的构造,组装之后,就是
kws_model:
KWSModel(
(global_cmvn): GlobalCMVN()
(preprocessing): LinearSubsampling1(
(out): Sequential(
(0): Linear(in_features=40, out_features=256, bias=True)
(1): ReLU()
)
(quant): QuantStub()
(dequant): DeQuantStub()
)
(backbone): TCN(
(network): ModuleList(
(0): DsCnnBlock(
(quant): QuantStub()
(dequant): DeQuantStub()
(cnn): Sequential(
(0): Conv1d(256,256, kernel_size=(8,), stride=(1,),
groups=256)
(1): BatchNorm1d(256, eps=1e-05, momentum=0.1, affine=True,
track_running_stats=True)
(2): ReLU()
(3): Conv1d(256,256, kernel_size=(1,), stride=(1,))
(4): BatchNorm1d(256, eps=1e-05, momentum=0.1, affine=True,
track_running_stats=True)
(5): ReLU()
(6): Dropout(p=0.1, inplace=False)
)
)
(1): DsCnnBlock(
(quant): QuantStub()
(dequant): DeQuantStub()
(cnn): Sequential(
(0): Conv1d(256,256, kernel_size=(8,), stride=(1,), dilation=(2,), groups=256)
(1): BatchNorm1d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(2): ReLU()
(3): Conv1d(256,256, kernel_size=(1,), stride=(1,))
(4): BatchNorm1d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(5): ReLU()
(6): Dropout(p=0.1, inplace=False)
)
)
(2): DsCnnBlock(
(quant): QuantStub()
(dequant): DeQuantStub()
(cnn): Sequential(
(0): Conv1d(256,256, kernel_size=(8,), stride=(1,), dilation=(4,), groups=256)
(1): BatchNorm1d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(2): ReLU()
(3): Conv1d(256,256, kernel_size=(1,), stride=(1,))
(4): BatchNorm1d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(5): ReLU()
(6): Dropout(p=0.1, inplace=False)
)
)
(3): DsCnnBlock(
(quant): QuantStub()
(dequant): DeQuantStub()
(cnn): Sequential(
(0): Conv1d(256,256, kernel_size=(8,), stride=(1,), dilation=(8,), groups=256)
(1): BatchNorm1d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(2): ReLU()
(3): Conv1d(256,256, kernel_size=(1,), stride=(1,))
(4): BatchNorm1d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(5): ReLU()
(6): Dropout(p=0.1, inplace=False)
)
)
)
)
(classifier): LinearClassifier(
(linear): Linear(in_features=256, out_features=2, bias=True)
(quant): QuantStub()
(dequant): DeQuantStub()
)
(activation): Sigmoid())linear subsampling

下面的是linear subsampling之后的self.dequant(x)的前后对比:

基本是老样子:
global_cmvn
linear subsampling 线性子采样
backbone (tcn, 时间卷积)

对于linear subsampling
是把40 -> 256,40是输入的fbanks的维度。


TCN-第0个模块

TCN-第1个模块

TCN-第2个模块

TCN-第3个模块


这个输出的维度=2=唤醒词的数量。

细节
preprocessing, classifier, activation

backbone细节:

先到这里,待续。
