基于WEKWS模型的语音唤醒关键词识别

本文围绕语音唤醒模型展开,先解读相关论文并详解模型,接着介绍WEKWS模型基础,包括本地环境配置、脚本说明等。还说明了服务器环境配置、模型测试与演示,涵盖推理和分词能力测试。最后阐述模型训练流程、评价,复现论文并尝试更换数据集,给出测试结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、模型描述

1.1 论文解读

本文所使用的模型网络结构继承自论文《Compact Feedforward Sequential Memory Networks for Small-footprint Keyword Spotting》,文中研究了将低秩矩阵分解与传统FSMN相结合的紧凑型前馈顺序记忆网络(cFSMN)用于远场关键字检测任务。此外,文中还分析了其结构参数的影响,为了降低计算成本,将多帧预测(MFP)应用到 cFSMN中;为了进一步提高建模能力,尝试在输出层之前插入小 DNN 层,以实现高级 MFP。最后通过检测误差权衡(DET)曲线下面积(AUC)来衡量模型的性能。

论文中并没有使用 HMM 系统而是使用单词作为建模单元,这样就为预先定义的关键词指定了模型。然而,在论文中,除了主关键字外,系统还应具有添加新关键字的灵活性,因此,文中沿用了传统的关键词/背景 HMM 结构,并使用 Senones(绑定的麦克风状态)作为建模单元。解码图由关键词和背景路径组成,每个关键词路径由一个关键词的 HMM 序列组成,添加一个关键词需要在图中添加一个关键词路径。背景路径是为非关键词语音、噪音和静音建立的,解码图中的维特比搜索通过标记传递分别在竞争的关键词路径和背景路径上运行,一旦活动标记到达关键字路径的末端,就会提取假设语段的声音信息。当关键词和背景路径得分的正则化比率超过预设阈值时,系统就会触发。在搜索过程中,每一帧的得分都会由AM预测。AM 的输入是声学特征,输出是关键词和背景模型的 HMM 状态的后验分布。没有使用语言模型。[1]

图1 cFSMN示意图

       论文中研究了将低秩矩阵分解与传统FSMN相结合的紧凑型前馈顺序记忆网络(cFSMN)用于远场关键字检测任务。其主体为4层cFSMN结构,如下图所示,参数量约750K,适用于移动端设备运行。

论文中实验表明,与需要相同延迟和两倍计算成本的经过良好调谐的长短期记忆(LSTM)相比,cFSMN 在安静和嘈杂环境下记录的测试集上分别实现了 18.11% 和 29.21% 的 AUC 相对下降。应用高级 MFP 后,系统在安静和嘈杂测试集上的 AUC 相对于传统 cFSMN 分别降低了 0.48% 和 20.04%,而计算成本则相对降低了 46.58%。

1.2 模型详解

本文模型采用达摩院语音唤醒预训练模型,模型输入采用Fbank特征,训练阶段使用CTC-loss计算损失并更新参数,输出为基于char建模的中文全集token预测,token数共2599个。测试工具根据每一帧的预测数据进行后处理得到输入音频的实时检测结果。

模型训练采用"basetrain + finetune"的模式,basetrain过程使用大量内部移动端数据,在此基础上,使用1万条设备端录制安静场景“小云小云”数据进行微调,得到最终面向业务的模型。由于采用了中文char全量token建模,并使用充分数据进行basetrain,本模型支持基本的唤醒词/命令词自定义功能,但具体性能无法评估。

目前最新ModelScope版本已支持用户在basetrain模型基础上,使用其他关键词数据进行微调,得到新的语音唤醒模型。

二、WEKWS[2]模型基础

2.1 本地环境配置

环境要求相关包的版本如下:

pyyaml>=5.1

tensorboard

tensorboardX

matplotlib

onnxruntime

flake8==3.8.2

flake8-bugbear

flake8-comprehensions

flake8-executable

flake8-pyi==20.5.0

mccabe

pycodestyle==2.6.0

pyflakes==2.2.0

lmdb

scipy

tqdm

2.2 项目目录

执行项目之前要重新从github仓库下载新的可执行文件,防止出现在运行过程中与上次运行产生的文件发生冲突问题,项目运行前目录为图2所示。

图2 wekws训练前目录 

我们需要先根据上述2.1所述,对相关的依赖包进行安装,防止因未安装包,导致后期训练过于繁琐,conf是模型的参数文件,然后运行path.sh脚本,将环境变量写入当前系统,最后运行run.sh对模型进行训练,训练完成后,我们将得到如下图3目录。

图3 wekws训练后目录 

训练将会持续一百轮,一轮将会训练510次,每隔10次打印一次模型结果,每隔一轮再打印一次结果。最终得到每轮的运行日志保存在exp目录下,data文件是训练集文件。

2.3 脚本说明

脚本关键部分和功能的摘要如下:

2.3.1 下载和数据准备:

下载和提取数据集local/data_download.sh

[ -f ./path.sh ] && . ./path.sh

dl_dir=./data/local

. tools/parse_options.sh || exit 1;
data_dir=$dl_dir
file_name=speech_commands_v0.01.tar.gz
speech_command_dir=$data_dir/speech_commands_v1
audio_dir=$data_dir/speech_commands_v1/audio
url=http://download.tensorflow.org/data/$file_name
mkdir -p $data_dir
if [ ! -f $data_dir/$file_name ]; then
    echo "downloading $url..."
    wget -O $data_dir/$file_name $url
else
    echo "$file_name exist in $data_dir, skip download it"
fi

if [ ! -f $speech_command_dir/.extracted ]; then
    mkdir -p $audio_dir
    tar -xzvf $data_dir/$file_name -C $audio_dir
    touch $speech_command_dir/.extracted
else
    echo "$speech_command_dir/.exatracted exist in $speech_command_dir, skip exatraction"
fi

exit 0

拆分数据集local/split_dataset.py

我们定义了一个名为move_files的函数,用于将指定文件夹中的文件根据给定的文件列表移动到目标文件夹中。首先打开给定的文件列表,并逐行读取文件路径,然后,通过使用os.path.dirname函数获取每个文件路径的目录,并使用os.path.join函数将目录与目标文件夹合并得到目标文件夹的路径。如果目标文件夹不存在,则使用os.mkdir函数创建目标文件夹。最后,使用shutil.move函数将源文件夹中的文件移动到目标文件夹中。在源代码的最后,还通过argparse模块解析命令行参数,并使用move_files函数

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伪_装

您的支持,是我持续创作的光

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值