移动端语音唤醒模型,检测关键词为“小云小云”。
模型网络结构继承自论文《Compact Feedforward Sequential Memory Networks for Small-footprint Keyword Spotting》,其主体为4层cFSMN结构(如下图所示),参数量约750K,适用于移动端设备运行。
模型输入采用Fbank特征,训练阶段使用CTC-loss计算损失并更新参数,输出为基于char建模的中文全集token预测,token数共2599个。测试工具根据每一帧的预测数据进行后处理得到输入音频的实时检测结果。
模型训练采用"basetrain + finetune"的模式,basetrain过程使用大量内部移动端数据,在此基础上,使用1万条设备端录制安静场景“小云小云”数据进行微调,得到最终面向业务的模型。由于采用了中文char全量token建模,并使用充分数据进行basetrain,本模型支持基本的唤醒词/命令词自定义功能,但具体性能无法评估。如用户想验证更多命令词,可以通过页面右侧“在线体验”板块自定义设置并录音测试。
目前最新ModelScope版本已支持用户在basetrain模型基础上,使用其他关键词数据进行微调,得到新的语音唤醒模型。
运行范围:
使用方式:
使用范围:
目标场景:
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks
kwsbp_16k_pipline = pipeline(
task=Tasks.keyword_spotting,
model='damo/speech_charctc_kws_phone-xiaoyun')
kws_result = kwsbp_16k_pipline(audio_in='https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/KWS/pos_testset/kws_xiaoyunxiaoyun.wav')
print(kws_result)
audio_in参数说明:
在modelscope-1.2.0及以上版本,我们上线了近场语音唤醒训练功能,并在小云模型库中放置训练所需资源和配置,以及一个迭代好的基线模型。开发者用户可以在此基础上,根据项目需求采集数据以定制自己的唤醒模型,所需训练数据量极少,训练门槛极低。
环境部署:
$ conda create -n modelscope python=3.7
$ conda activate modelscope
$ pip install torch torchvision torchaudio
$ pip install "modelscope[audio]" -f https://modelscope.oss-cn-beijing.aliyuncs.com/releases/repo.html
$ pip install tensorboardX
训练流程:
训练代码保存文件,如example_kws.py,通过命令行启动训练:
$ PYTHONPATH=. torchrun --standalone --nnodes=1 --nproc_per_node=2 example_kws.py
以下是一些训练参考代码:
# coding = utf-8
import os
from modelscope.utils.hub import read_config
from modelscope.utils.hub import snapshot_download
from modelscope.metainfo import Trainers
from modelscope.trainers import build_trainer
def main():
enable_training = True
enable_testing = True
# s1
work_dir = './test_kws_training'
# s2
model_id = 'damo/speech_charctc_kws_phone-xiaoyun'
model_dir = snapshot_download(model_id)
configs = read_config(model_id)
# update some configs
configs.train.max_epochs = 10
configs.preprocessor.batch_conf.batch_size = 256
configs.train.dataloader.workers_per_gpu = 4
configs.evaluation.dataloader.workers_per_gpu = 4
config_file = os.path.join(work_dir, 'config.json')
configs.dump(config_file)
# s3
kwargs = dict(
model=model_id,
work_dir=work_dir,
cfg_file=config_file,
seed=666,
)
trainer = build_trainer(
Trainers.speech_kws_fsmn_char_ctc_nearfield, default_args=kwargs)
# s4
train_scp = './example_kws/train_wav.scp'
cv_scp = './example_kws/cv_wav.scp'
test_scp = './example_kws/test_wav.scp'
trans_file = './example_kws/merge_trans.txt'
train_checkpoint = ''
test_checkpoint = ''
if enable_training:
kwargs = dict(
train_data=train_scp,
cv_data=cv_scp,
trans_data=trans_file,
checkpoint=train_checkpoint,
tensorboard_dir='tensorboard',
need_dump=True,
)
trainer.train(**kwargs)
rank = int(os.environ['RANK'])
world_size = int(os.environ['WORLD_SIZE'])
if world_size > 1 and rank != 0:
enable_testing = False
# s5
if enable_testing:
keywords = '小云小云'
test_dir = os.path.join(work_dir, 'test_dir')
kwargs = dict(
test_dir=test_dir,
test_data=test_scp,
trans_data=trans_file,
average_num=10,
gpu=0,
keywords=keywords,
batch_size=256,
)
trainer.evaluate(test_checkpoint, None, **kwargs)
if __name__ == '__main__':
main()
补充说明:
$ cat wav.scp
kws_pos_example1 /home/admin/data/test/audios/kws_pos_example1.wav
kws_pos_example2 /home/admin/data/test/audios/kws_pos_example2.wav
...
kws_neg_example1 /home/admin/data/test/audios/kws_neg_example1.wav
kws_neg_example2 /home/admin/data/test/audios/kws_neg_example2.wav
...
$ cat trans.txt
kws_pos_example1 小 云 小 云
kws_pos_example2 小 云 小 云
...
kws_neg_example1 帮 我 导航 一下 回 临江 路 一百零八 还要 几个 小时
kws_neg_example2 明天 的 天气 怎么样
...
$ tree training_xiaoyunxiaoyun
training_xiaoyunxiaoyun
├── 0.pt
├── 0.yaml
├── ...
├── 9.pt
├── 9.yaml
├── avg_5.pt
├── config.json
├── config.yaml
├── convert.kaldi.txt
├── init.pt
├── tensorboard
│ ├── events.out.tfevents.1673862887.nls-dev-servers011143155239.et2
└── test_dir
├── score.txt
└── stats_小云小云.txt
@inproceedings{chen18c_interspeech,
author={Mengzhe Chen and ShiLiang Zhang and Ming Lei and Yong Liu and Haitao Yao and Jie Gao},
title={{Compact Feedforward Sequential Memory Networks for Small-footprint Keyword Spotting}},
year=2018,
booktitle={Proc. Interspeech 2018},
pages={2663--2667},
doi={10.21437/Interspeech.2018-1204}
}