赞
踩
好久没有更新博客,自从有小孩之后,留给自己的时间越来越少,加上最近一段时间在学习深度学习方面的理论知识,所以博客的更新拖的时间太长了。
最近经常留意到kaldi交流群中,不断有小伙伴提问有没有实时解码的例子,其实kaldi有一个实时麦克风解码的demo,只不过是基于gmm的,详见online-gmm-decode-faster.cc ,一直没有nnet3实时解码样例,所以抽空写了一个demo, 见我的github: online2-nnet3-latgen-faster.cc
顺便解释一下在线解码和离线解码的概念:
使用portaudio库采集音频,利用生产者消费者设计思想,录音产生音频(生产者)、nnet3解码(消费者), 生产者产生数据放入队列队尾,消费者每次取出队首数据,(一般情况下RTF=0.2是可以做到,看HCLG.fst大小和声学模型大小)所以不会产生数据堆积。
沿用kaldi解码风格,未重新封装新的类,所以会有代码冗余(释放解码资源再创建新的解码资源),实际工作中,可以把kaldi编译成库,当成api使用,再封装接口,可以实现高并发。
// 以下可以设计到一个类中 auto *adaptation_state =new OnlineIvectorExtractorAdaptationState( feature_info.ivector_extractor_info); auto *feature_pipeline = new OnlineNnet2FeaturePipeline(feature_info); OnlineCmvnState cmvn_state(global_cmvn_stats); feature_pipeline->SetAdaptationState(*adaptation_state); feature_pipeline->SetCmvnState(cmvn_state); auto *silence_weighting = new OnlineSilenceWeighting(trans_model, feature_info.silence_weighting_config, decodable_opts.frame_subsampling_factor); auto *decoder = new SingleUtteranceNnet3Decoder(decoder_opts, trans_model, decodable_info, *decode_fst, feature_pipeline);
本次实验是在mac环境下进行的,由于kaldi自带脚本安装的portaudio无法在bigSur上获取权限,导致程序运行出错,所以修改安装portaudio的脚本,下载最新的release包。程序未在linux环境下验证,如果程序在Linux下有问题,欢迎与我联系。
编译生成可执行文件online2bin/online2-nnet3-latgen-faster ,执行以下命令运行解码器
./online2-nnet3-latgen-faster --frame-subsampling-factor=3 --config=conf/online.conf --add-pitch=true --max-active=7000 --beam=10.0 --lattice-beam=1.0 --acoustic-scale=1.0 --word-symbol-table=words.txt final.mdl HCLG.fst
说明:模型final.mdl、HCLG.fst、words.txt与解码器在同一目录下,配置文件在conf目录下
||PaMacCore (AUHAL)|| Error on line 1271: err='-66748', msg=Unknown Error
WARNING (online2-nnet3-latgen-faster[5.5.908~4-9832c]:Init():online-audio-source.cc:60) Pa open stream error
权限问题,需要升级到最新的portaudio库
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。