kaldi nnet3实时解码(使用麦克风在线解码)
前言
好久没有更新博客,自从有小孩之后,留给自己的时间越来越少,加上最近一段时间在学习深度学习方面的理论知识,所以博客的更新拖的时间太长了。
最近经常留意到kaldi交流群中,不断有小伙伴提问有没有实时解码的例子,其实kaldi有一个实时麦克风解码的demo,只不过是基于gmm的,详见online-gmm-decode-faster.cc ,一直没有nnet3实时解码样例,所以抽空写了一个demo, 见我的github: online2-nnet3-latgen-faster.cc
顺便解释一下在线解码和离线解码的概念:
- 在线解码:一段音频分词若干个chunck,每次解码取一个chunck,你可以想象食堂打饭时,每个同学排好队,一个一个打饭(不允许插队),每解一个chunck,都会取最优的解码结果,参考siri, 当你说一段话的时候,发现之前不准确的词会随着音频信息的增多得到修正, 优点:及时反馈结果, 缺点:解码结果没有离线解码准确
- 离线解码:一次性提取完特征,然后解码,最后取最优路径,获得解码结果,优点:解码结果较在线解码准确,缺点:实时反馈慢
实现思想
1. 音频采集线程
使用portaudio库采集音频,利用生产者消费者设计思想,录音产生音频(生产者)、nnet3解码(消费者), 生产者产生数据放入队列队尾,消费者每次取出队首数据,(一般情况下RTF=0.2是可以做到,看HCLG.fst大小和声学模型大小)所以不会产生数据堆积。
2. 解码器线程
沿用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下有问题,欢迎与我联系。
- clone代码, git clone https://github.com/xiangxyq/kaldi.git
- 检查环境并安装缺少的库(Linux下需要额外安装alsa库(portaudio需要,否则程序会报打开默认设备出错): apt-get install libasound2-dev),cd tools && bash extras/check_dependencies.sh
- 安装openfst等工具,在tools目录下执行 make
- 安装portaudio库,linux下需要先安装alsa库,bash extras/install_portaudio.sh
- 进入src目录,执行 ./configure ,无报错信息执行下一步
- 执行 make ext_depend ,(一定要为ext_depend,否则编译时会报无法找到portaudio头文件)
- 执行make,等待编译结束
运行
编译生成可执行文件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目录下
可能遇到的问题
- Open default input device error错误, 一般在Linux下portaudio没有使用alsa库,请在编译的时候确认alsa库安装完成,编译portaudio的时候有alsa环境
- MAC下:
||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库
- 由于未采用vad功能,仅靠kaldi内部语义检测到静音端点,在采集音频很长时,保存太多tokens,有可能导致解码搜索时很慢,采集的音频不能及时解码, 所以代码中强制连续最长音频为30s(可配置)
未完成内容
- 代码未加入VAD功能
kaldi nnet3实时解码(使用麦克风在线解码)相关推荐
- kaldi nnet3在线解码和chain在线解码
chain在线解码可以参考https://blog.csdn.net/it_king1/article/details/80109398 我补充一下nnet3在线解码: nnet3跟chain不同之处 ...
- kaldi - Online Audio Server(服务器客户端建立方法-旧版在线解码)
目录 一.服务器客户端识别系统建立方法 1. Command line to start the server(服务器端启动方式): 2. Command line to start the clie ...
- 语音识别——kaldi - Online Audio Server(服务器客户端建立方法-旧版在线解码)
文章目录 一.服务器客户端识别系统建立方法 1. Command line to start the **server**(服务器端启动方式): 1.1 Arguments are as follow ...
- 【kaldi】chain-model在线解码(以aishell数据集为例)
以aishell数据集为例,演示如何进行chain-model在线解码. 1.首先生成配置文件 steps/online/nnet3/prepare_online_decoding.sh --add_ ...
- Kaldi 离线在线解码应用
环境:Ubuntu 12.04, Kaldi timit训练完语音模型后可以进入解码, 1. 首先安装PortAudio cd /u01/kaldi/tools/portaudio ./confi ...
- DNN在线解码(以aishell的chain模型为例)
基于gmm模型的在线解码很简单,网上例子也比较多,但是基于DNN模型的在线解码资料很少,看官网的介绍也比较麻烦.在这里,我将自己做的DNN在线解码的过程记录下来给大家参考,有错误之处恳请指正. 我以a ...
- 深度神经网络对脑电信号运动想象动作的在线解码
目录 简介 网络模型 结果比较 结论 本分享为脑机学习者Rose整理发表于公众号:脑机接口社区 QQ交流群:941473018 简介 近年来,深度学习方法的快速发展使得无需任何特征工程的端到端学习成为 ...
- PC端微信下的dat 文件在线解码还原成为图片
之前的时候很多人都咨询问微信的dat文件怎么才能打开?有没有什么软件能打开微信dat文件? 看了下网上的说明,发现就是异或处理,于是准备将微信dat的转码做出来,方便大家. 原理: 微信dat文件在微 ...
- JWT在线解码网址和结构介绍
JWT介绍 JWT简介 JWT 概念 JWT 优点 JWT 在线解码工具 JWT 结构解析 1.Header 2.Payload 3.Signature 写在最后 JWT简介 JWT 概念 JWT 全 ...
最新文章
- matlab 图像中用text文字标注
- 掌控谈话~重复对方的话
- HtmlUnit爬取Ajax动态生成的网页以及自动调用页面javascript函数
- 求生之路显示服务器指令,求生之路2控制台指令..doc
- 通达信板块监控指标_通达信板块分析指标公式
- rgba转16进制颜色
- centos内存压力测试软件,教你在CentOS下的CPU、内存、IO、网络的压力测试工具与方法...
- 案例集|不仅仅是酒店,还有更多可能——高星级酒店的跨界营销
- 【C语言】扫雷游戏(包含递归展开、手自动标记功能)
- SpringCloud之熔断器Hystrix
- tensorrt expecting compute 7.5 got compute 6.1, please rebuild
- java区分无线网卡,无线网卡种类有什么区别
- 从排名看主流半导体厂商在3G市场的策略与心态
- videoder有什么用_videoder
- JavaSE基础(134) 打印流
- UTC时间与北京时间相互转换
- 专业的知识图谱应用门槛正在被不断降低
- Launcher3 安装App加载显示过程分析,androidstudio开发app实例
- 2018年的学习任务
- 《弃子长安》第九章 大漠金钩
热门文章
- redis死链 org.springframework.dao.QueryTimeoutException: Redis command timed out; nested exception
- 渗透测试之文件包含[汇总]
- 【面试】onreadystatechange事件
- 安利一款数学公式编辑器,AxMath
- mysql账目表_mysql 关于用户账目明细设计的问题
- Android 实例-个人理财工具 之五 账单明细显示A
- 欧盟建材CE认证System 2+要求及DoP文件要求
- Zigbee组网流程程序分析
- 魔术游戏二进制卡片C语言,二进制的趣味魔法
- 开发通用资料——电阻命名方式