学习语音识别有些时间了。老板要求我们基于Kaldi搭一个语音识别系统,在设备上通过MIC讲话,连着设备的PC的console上就能基本实时显示出讲话的内容。由于我们都是小白,刚开始可以要求低些,就用传统的GMM-HMM,能实现孤立词识别就算达标了,后面随着这方面能力的提高,再做更难一点的。任务下达后我根据之前对kaldi的简单理解把模块分成了三部分:数据准备和MFCC、GMM-HMM、解码网络创建和解码,由三个人每人负责一部分学习,掌握基本原理,搞清楚有哪些事情要做。在其他两个同学先挑了模块后就由我来负责解码网络构建和解码部分了。

我们三个学习了kaldi两三个星期后感觉下来kaldi不是很容易上手,主要原因有四。一是我们都是新手,语音识别领域的一些概念和套路还没完全搞清楚。二是kaldi的文档偏少,不利于代码的理解。三是kaldi是算法和工具的集合,语音识别的整个流程是靠很多复杂的shell和Perl脚本把这些工具串起来实现的,不易读。四是kaldi是用C++实现的,而我们先前主要是用C开发软件(芯片公司的软件工程师多数都是在底层用C开发软件)。我们克服了这些困难,理出了每个模块有哪些事情要做,也搞清楚了软件实现分训练和识别两大部分,有些模块在训练和识别中都有,比如MFCC,而有些模块只在训练中有。训练是给识别做准备的,训练得到声学模型、字典和语言模型,并基于WFST将这三个合并成一个大的解码网络用于识别中。真正运行起来的语音识别系统只有识别部分的软件在运行。

具体到我负责的解码,主要有两大部分组成,一是生成解码网络,二是基于解码网络解码。这里面的重中之重就是WFST(加权的有限状态转换器)。WFST属于半环代数理论。我是学控制出身,读本科时学了高数、矩阵、概率论等,读研究生时对矩阵进行了更深入的学习(控制学科对矩阵的要求较高),其他数学分支都没学过,半环代数理论显然是新东西。由于相关基础没有,学习起来不是很轻松,网上也说这学科对学数学和计算机理论的人学起来轻松些。现阶段我们只是搭语音识别系统,不需要深入研究算法,再加上时间也不允许(老板给我们定下了dealline),就仅仅了解了WFST的基本原理,后面就通过具体的例子来熟悉脚本和代码流程。Kaldi里有两种类型的解码器:offline 和 online。yesno就是最简单的offline解码器的例子,通过运行这个例子基本搞清楚了相关脚本和函数的意思。因为我们要搭的是在线实时系统,offline的参考性不大,也就没太关注,转而去看kaldi里的online decoder了。kaldi里的online decoder有两个版本:online(老版本) 和online2(新版本)。官网推荐用online2(基于例子RM(resource management)),并且声称要逐渐把老版本online废弃掉。但是现在RM的语料库无法从网络上下载到,所以例子RM就无法运行,只能去用老版本的online了。还好好多使用者说还是老版本的online好用,总算给我吃了一颗定心丸。看了相关的博客,都是基于kaldi里的唯一的中文识别的例子thchs30来做在线解码的。根据博客的指导,先下语料库,做各种训练得到解码网络等。再下载portaudio,使能从PC的MIC上采集到语音数据。最后改写脚本运行,这样一个在线解码的例子就跑起来了,PC的console上实时显示出了说的文字。在代码里加些log跟踪一下,也就搞清楚了在线解码时软件实现的机制和各种调用过程。

就这样解码相关的除了算法外其他的基本都搞清楚了。按照惯例,要做PPT给组内同学讲,让大家共同提高。我就根据自己的理解做了语音识别解码器相关的内容(一些图片还是借用了各种文档和博客里的,再此表示感谢,就不一一列出了)。下面就是我做的PPT的内容,给有需要的朋友看看。如果有错误,烦请指出,非常感谢!

基于WFST的语音识别解码器的更多相关文章

  1. 基于android的语音识别

    1.注册账户,添加应用 2.针对android平台的选择应用,下载SDK 3.将SDK的libs下文件拷贝到工程的libs目录下 4.添加用户权限 <uses-permission androi ...

  2. 三个小白是如何在三个月内搭一个基于kaldi的嵌入式在线语音识别系统的

    前面的博客里说过最近几个月我从传统语音(语音通信)切到了智能语音(语音识别).刚开始是学语音识别领域的基础知识,学了后把自己学到的写了PPT给组内同学做了presentation(语音识别传统方法(G ...

  3. 最简单的基于FFmpeg的移动端例子:IOS 视频解码器-保存

    ===================================================== 最简单的基于FFmpeg的移动端例子系列文章列表: 最简单的基于FFmpeg的移动端例子:A ...

  4. 最简单的基于FFmpeg的解码器-纯净版(不包含libavformat)

    ===================================================== 最简单的基于FFmpeg的视频播放器系列文章列表: 100行代码实现最简单的基于FFMPEG ...

  5. 最简单的基于FFmpeg的移动端样例:Android 视频解码器-单个库版

    ===================================================== 最简单的基于FFmpeg的移动端样例系列文章列表: 最简单的基于FFmpeg的移动端样例:A ...

  6. 最简单的基于FFmpeg的移动端样例:IOS 视频解码器

    ===================================================== 最简单的基于FFmpeg的移动端样例系列文章列表: 最简单的基于FFmpeg的移动端样例:A ...

  7. 最简单的基于FFMPEG+SDL的视频播放器:拆分-解码器和播放器

    ===================================================== 最简单的基于FFmpeg的视频播放器系列文章列表: 100行代码实现最简单的基于FFMPEG ...

  8. 最简单的基于FFmpeg的直播系统开发移动端例子:IOS 视频解码器

    本文记录IOS平台下基于FFmpeg的视频解码器.该示例C语言的源代码来自于<最简单的基于FFMPEG+SDL的视频播放器>.相关的概念就不再重复记录了. 源代码 项目的目录结构如图所示. ...

  9. Atitit 语音识别的技术原理

    Atitit 语音识别的技术原理 1.1. 语音识别技术,也被称为自动语音识别Automatic Speech Recognition,(ASR),2 1.2. 模型目前,主流的大词汇量语音识别系统多 ...

随机推荐

  1. 异步编程CompletableFuture实现高并发系统优化之请求合并

    先说场景: 根据Redis官网介绍,单机版Redis的读写性能是12万/秒,批量处理可以达到70万/秒.不管是缓存或者是数据库,都有批量处理的功能.当我们的系统达到瓶颈的时候,我们考虑充分的压榨缓存和 ...

  2. 有容云:上车 | 听老司机谈Docker安全合规建设

    编者注: 本文根据7月19日DockOne社群分享内容整理而成,分享嘉宾蒋运龙,有容云高级咨询顾问,一个IT的老兵,十年来混迹于存储.三网融合.多屏互动.智能穿戴.第三方支付.Docker等行业:经历 ...

  3. L1063 能量项链

    1 #include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i = a; i <= b ...

  4. Docker笔记(七):常用服务安装——Nginx、MySql、Redis

    开发中经常需要安装一些常用的服务软件,如Nginx.MySql.Redis等,如果按照普通的安装方法,一般都相对比较繁琐 —— 要经过下载软件或源码包,编译安装,配置,启动等步骤,使用 Docker ...

  5. 总结Idea环境,吐血踩过的坑

    1)首先是JDK环境安装,这一步千万要出错,我就是配错了CLASSPATH导致了很诡异的问题.可能结果:就是RUN到tomcat不报错,但是有404错误. 2)然后是IDEA安装,这里要十分注意如果你 ...

  6. 0x03 前缀和与差分

    前缀和 [例题]BZOJ1218 激光炸弹 计算二位前缀和,再利用容斥原理计算出答案即可. #include <iostream> #include <cstdio> #inc ...

  7. Elasticsearch索引增量统计及定时邮件实现

    0.需求 随着ELKStack在应用系统中的数据规模的急剧增长,每天千万级别数据量(存储大小:10000000*10k/1024/1024=95.37GB,假设单条数据10kB,实际远大于10KB)的 ...

  8. Spark 系列(八)—— Spark SQL 之 DataFrame 和 Dataset

    一.Spark SQL简介 Spark SQL 是 Spark 中的一个子模块,主要用于操作结构化数据.它具有以下特点: 能够将 SQL 查询与 Spark 程序无缝混合,允许您使用 SQL 或 Da ...

  9. postman 测试http,接口

    1.form-data: 就是http请求中的multipart/form-data,它会将表单的数据处理为一条消息,以标签为单元,用分隔符分开.既可以上传键值对,也可以上传文件.当上传的字段是文件时 ...

  10. RobotFrameWork Web自动化测试环境搭建

    前言 Robot Framework是一款python编写的功能自动化测试框架.具备良好的可扩展性,支持关键字驱动,可以同时测试多种类型的客户端或者接口,可以进行分布式测试执行.主要用于轮次很多的验收 ...