前言

好久没有更新博客,自从有小孩之后,留给自己的时间越来越少,加上最近一段时间在学习深度学习方面的理论知识,所以博客的更新拖的时间太长了。
最近经常留意到kaldi交流群中,不断有小伙伴提问有没有实时解码的例子,其实kaldi有一个实时麦克风解码的demo,只不过是基于gmm的,详见online-gmm-decode-faster.cc ,一直没有nnet3实时解码样例,所以抽空写了一个demo, 见我的github: online2-nnet3-latgen-faster.cc

顺便解释一下在线解码和离线解码的概念:

  1. 在线解码:一段音频分词若干个chunck,每次解码取一个chunck,你可以想象食堂打饭时,每个同学排好队,一个一个打饭(不允许插队),每解一个chunck,都会取最优的解码结果,参考siri, 当你说一段话的时候,发现之前不准确的词会随着音频信息的增多得到修正, 优点:及时反馈结果, 缺点:解码结果没有离线解码准确
  2. 离线解码:一次性提取完特征,然后解码,最后取最优路径,获得解码结果,优点:解码结果较在线解码准确,缺点:实时反馈慢

实现思想

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下有问题,欢迎与我联系。

  1. clone代码, git clone https://github.com/xiangxyq/kaldi.git
  2. 检查环境并安装缺少的库(Linux下需要额外安装alsa库(portaudio需要,否则程序会报打开默认设备出错): apt-get install libasound2-dev),cd tools && bash extras/check_dependencies.sh
  3. 安装openfst等工具,在tools目录下执行 make
  4. 安装portaudio库,linux下需要先安装alsa库,bash extras/install_portaudio.sh
  5. 进入src目录,执行 ./configure ,无报错信息执行下一步
  6. 执行 make ext_depend ,(一定要为ext_depend,否则编译时会报无法找到portaudio头文件)
  7. 执行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目录下

可能遇到的问题

  1. Open default input device error错误, 一般在Linux下portaudio没有使用alsa库,请在编译的时候确认alsa库安装完成,编译portaudio的时候有alsa环境
  2. 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库
  1. 由于未采用vad功能,仅靠kaldi内部语义检测到静音端点,在采集音频很长时,保存太多tokens,有可能导致解码搜索时很慢,采集的音频不能及时解码, 所以代码中强制连续最长音频为30s(可配置)

未完成内容

  1. 代码未加入VAD功能

kaldi nnet3实时解码(使用麦克风在线解码)相关推荐

  1. kaldi nnet3在线解码和chain在线解码

    chain在线解码可以参考https://blog.csdn.net/it_king1/article/details/80109398 我补充一下nnet3在线解码: nnet3跟chain不同之处 ...

  2. kaldi - Online Audio Server(服务器客户端建立方法-旧版在线解码)

    目录 一.服务器客户端识别系统建立方法 1. Command line to start the server(服务器端启动方式): 2. Command line to start the clie ...

  3. 语音识别——kaldi - Online Audio Server(服务器客户端建立方法-旧版在线解码)

    文章目录 一.服务器客户端识别系统建立方法 1. Command line to start the **server**(服务器端启动方式): 1.1 Arguments are as follow ...

  4. 【kaldi】chain-model在线解码(以aishell数据集为例)

    以aishell数据集为例,演示如何进行chain-model在线解码. 1.首先生成配置文件 steps/online/nnet3/prepare_online_decoding.sh --add_ ...

  5. Kaldi 离线在线解码应用

    环境:Ubuntu 12.04,   Kaldi timit训练完语音模型后可以进入解码, 1. 首先安装PortAudio cd /u01/kaldi/tools/portaudio ./confi ...

  6. DNN在线解码(以aishell的chain模型为例)

    基于gmm模型的在线解码很简单,网上例子也比较多,但是基于DNN模型的在线解码资料很少,看官网的介绍也比较麻烦.在这里,我将自己做的DNN在线解码的过程记录下来给大家参考,有错误之处恳请指正. 我以a ...

  7. 深度神经网络对脑电信号运动想象动作的在线解码

    目录 简介 网络模型 结果比较 结论 本分享为脑机学习者Rose整理发表于公众号:脑机接口社区 QQ交流群:941473018 简介 近年来,深度学习方法的快速发展使得无需任何特征工程的端到端学习成为 ...

  8. PC端微信下的dat 文件在线解码还原成为图片

    之前的时候很多人都咨询问微信的dat文件怎么才能打开?有没有什么软件能打开微信dat文件? 看了下网上的说明,发现就是异或处理,于是准备将微信dat的转码做出来,方便大家. 原理: 微信dat文件在微 ...

  9. JWT在线解码网址和结构介绍

    JWT介绍 JWT简介 JWT 概念 JWT 优点 JWT 在线解码工具 JWT 结构解析 1.Header 2.Payload 3.Signature 写在最后 JWT简介 JWT 概念 JWT 全 ...

最新文章

  1. matlab 图像中用text文字标注
  2. 掌控谈话~重复对方的话
  3. HtmlUnit爬取Ajax动态生成的网页以及自动调用页面javascript函数
  4. 求生之路显示服务器指令,求生之路2控制台指令..doc
  5. 通达信板块监控指标_通达信板块分析指标公式
  6. rgba转16进制颜色
  7. centos内存压力测试软件,教你在CentOS下的CPU、内存、IO、网络的压力测试工具与方法...
  8. 案例集|不仅仅是酒店,还有更多可能——高星级酒店的跨界营销
  9. 【C语言】扫雷游戏(包含递归展开、手自动标记功能)
  10. SpringCloud之熔断器Hystrix
  11. tensorrt expecting compute 7.5 got compute 6.1, please rebuild
  12. java区分无线网卡,无线网卡种类有什么区别
  13. 从排名看主流半导体厂商在3G市场的策略与心态
  14. videoder有什么用_videoder
  15. JavaSE基础(134) 打印流
  16. UTC时间与北京时间相互转换
  17. 专业的知识图谱应用门槛正在被不断降低
  18. Launcher3 安装App加载显示过程分析,androidstudio开发app实例
  19. 2018年的学习任务
  20. 《弃子长安》第九章 大漠金钩

热门文章

  1. redis死链 org.springframework.dao.QueryTimeoutException: Redis command timed out; nested exception
  2. 渗透测试之文件包含[汇总]
  3. 【面试】onreadystatechange事件
  4. 安利一款数学公式编辑器,AxMath
  5. mysql账目表_mysql 关于用户账目明细设计的问题
  6. Android 实例-个人理财工具 之五 账单明细显示A
  7. 欧盟建材CE认证System 2+要求及DoP文件要求
  8. Zigbee组网流程程序分析
  9. 魔术游戏二进制卡片C语言,二进制的趣味魔法
  10. 开发通用资料——电阻命名方式