Kaldi语音识别技术(五) ----- 特征提取

news2024/11/25 13:30:54

Kaldi语音识别技术(五) ----- 特征提取

文章目录

  • Kaldi语音识别技术(五) ----- 特征提取
    • 一、识别流程
    • 二、MFCC特征提取概述
    • 三、文件格式
        • 文件格式说明
        • 提取部分数据
        • 修复提取数据
        • 提取剩余部分数据
    • 四、特征提取
        • 特征提取—C++
        • 特征提取—并行提取
        • 特征提取—特征查看
    • 五、CMVN
        • CMVN—脚本
        • CMVN—命令

一、识别流程

在这里插入图片描述
在这里插入图片描述

在之前的文章中我们已经完成了L.fst和G.fst的生成,在这里简单对Kaldi语音识别的整体进行一个回顾。

二、MFCC特征提取概述

人通过声道产生声音,声道的shape决定了发出怎样的声音。声道的shape包括舌头,牙齿等。如果我们可以准确的知道这个形状,那么我们就可以对产生的音素(phoneme)进行准确的描述。声道的形状在语音短时功率谱的包络中显示出来。而MFCC就是一种准确描述这个包络的一种特征。所谓特征提取,也就是提取语音信号中有助于理解语言内容的部分而丢弃掉其它的东西(比如背景噪音和情绪等等)。

MFCC(Mel频率倒谱系数:Mel-Frequency Cepstral Coefficients)是一种在自动语音和说话人识别中广泛使用的声学特征。它是在1980年由Davis和Mermelstein搞出来的。从那时起。在语音识别领域,MFCC在人工特征方面可谓是鹤立鸡群,一枝独秀,从未被超越啊(至于说Deep Learning的特征学习那是后话了)。

语音的产生过程如下:语音信号是通过肺部呼出气体,然后通过声门的开启与闭合产生的周期信号。再通过声道(包括舌头牙齿)对信号调制后产生。区分语音的关键就是声道的不同形状。不同的形状就对应不同的滤波器,从而产生了不同的语音。如果我们可以准确的知道声道的形状,那么我们就可以得到不同的音素(phoneme)的表示。声道的形状体现在语音信号短时功率谱的包络(envelope)中,因此好多特征提取方法需要准确的表示包络信息。

MFCC特征提取流程如下:

在这里插入图片描述
在这里插入图片描述

MFCC使得特征更具区分性:
在这里插入图片描述

预加重

人的发音特性,每个发音段到高频部分能量就降下来了。同时,人们认为高频的信息对识别音素有帮助,人们为了使用这个高频特征来去识别音素,就需要把高频能量往上提。主要通过加一个一阶高通滤波器来实现,以提升高频部分

加窗

把音频分为一小段一小段,每20ms一段

窗长 假设为20ms 只看20ms的内容

窗移 假设为10ms 每次窗移动10ms

有重叠

离散傅里叶变化(FFT)

需要把一个窗口的数据,从时域上转化为频域上来处理。

需要在频域上判断:

1、任何信号都可以看成不同频率正弦波的叠加。

2、如果现在有一个纯的正弦波,在频谱上判断,就在对应的频率上有一个亮点(能量),没有其他的频率成分,就一个。

3、频率的取值范围是0-正无穷

梅尔滤波器

根据人耳的特性设计的这一个特征

人耳是对低频很敏感,低频只要变一点,人耳都可以听出来声音的不同(500Hz—800Hz,可以听出不同),但是如果频率变的很高,高频变一点,人耳就听不出来不同(2000Hz—3000Hz)

人耳机制:低频敏感,高频很不敏感

正常的傅里叶变化频率的取值范围是0-正无穷,需要把这个信息映射到梅尔频域上(普通频域 - > 梅尔滤波器 - > 梅尔频域)

基于人耳特性

梅尔频率,低频分辨率高,高频分辨率低

梅尔滤波器

低频 分布密集,均匀分布

高频 滤波器越来越大,log形式

逆傅里叶变换

对频域再做一个傅里叶变换,把它反过来

逆傅里叶变换如果是对称的话,做的就是离散余弦变换(DCT)

做了DCT之后,取前12维度信息,就是我们看到的数据

MFCC的第一维度是能量(12+1 = 13维度)

CMVN均值方差归一化

针对每个发音人的倒谱(特征)的均值和方差,以降低不同发音人统计特性,达到普适性。

把每一维度的数都换成均值为0、方差为1的正态分布。即,减均值/方差

运行准备

. ~/kaldi/path.sh
cd  ~/kaldi/data
mkdir H
cp -R /root/kaldi/kaldi_file ./

三、文件格式

文件格式说明

scp 不存放真实数据,只存放路径(基本文件wav.scp)

ark 生成的特征文件(二进制),用语存放真实数据

提取部分数据

提取部分音频信息用于训练集和测试集

提取方法 subset_data_dir.sh [--speakers|--shortest|--first|--last|--per-spk] <srcdir> <destdir>

./utils/data/subset_data_dir.sh ../kaldi_file/ 100 ./H/kaldi_file_test

参数详解:
第一个参数:存放4个基本文件的文件夹(wav.scp,utt2spk,spk2utt,text)
第二个参数:要提取的数量
第三个参数:提取后存放的文件夹

在这里插入图片描述

使用介绍: https://blog.csdn.net/qq_36782366/article/details/103543480

修复提取数据

在制作4个基本文件时,text的文件可能因各种因素(如空内容)比其他3个文件少,可以使用以下命令(根据text文件)删除(utt2spk,spk2utt,text)多余的内容,达到一致性

./utils/data/fix_data_dir.sh  ./H/kaldi_file_test

参数详解:
kaldi_file_test 存放4个基本文件的文件夹(wav.scp,utt2spk,spk2utt,text)

在这里插入图片描述

提取剩余部分数据

提取了指定数量的部分音频信息后,需要将剩余未提取的提取出来

1、获取已提取音频信息的utt

cd ./H/kaldi_file_test
awk -F ' ' '{print($1)}' text >./H/utt_id.txt

在这里插入图片描述

2、查找剩余音频text
将已提取的utt与全部的音频text中的第一列(utt)匹配比对,并取反,得到未提取的音频信息

mkdir train
grep -v -F -w -f kaldi_file_test/utt_id.txt kaldi_file/text > ./train/text

3、复制所有的音频信息(除text之外)

cp kaldi_file/{utt2spk,spk2utt,wav.scp} train/

4、修复提取数据

cd .. 
./utils/fix_data_dir.sh ./H/train/

在这里插入图片描述

四、特征提取

特征提取—C++

compute-mfcc-feats

用法:compute-mfcc-feats scp:xxx.scp ark:xxx.ark

compute-mfcc-feats scp:kaldi_file/wav.scp ark:all.ark

参数详解:
第一个参数为传入的wav.scp文件(音频路径)
第二个参数为生成的特征文件

在这里插入图片描述

1、查看ark文件

ark为二进制文件,无法直接查看。可通过命令将ark文件生成文本文件查看:

copy-feats ark:all.ark ark,t:all.txt

在这里插入图片描述

2、直接生成文本文件

compute-mfcc-feats scp:kaldi_file/wav.scp ark,t:all2.txt

在这里插入图片描述

特征提取—并行提取

准备配置文件

~/kaldi/data文件夹中创建一个conf/mfcc.conf配置文件,可在配置文件配置以下2个参数

–user-energy true表示提取出的mfcc特征含能量信息(第一列),false表示不含能量信息

–sample-frequency 视频的采样率

如果提取特征时不含配置文件,默认的user-energy为truesample-frequency为16000

cd ~/kaldi/data
vim conf/mfcc.conf

# 添加以下信息后保存退出
--use-energy=false   # only non-default option.
--sample-frequency=16000

make_mfcc.sh

在data文件夹中运行以下命令:

./steps/make_mfcc.sh --cmd "run.pl" --mfcc-config conf/mfcc.conf --nj 2 H/kaldi_file_test/ H/mfcc/exp/ H/mfcc/

注:由于本脚本第20行要判断是否有path.sh 所以需要将~/kaldi/utils/path.sh 复制到data目录中。

参数详解:
–cmd run.pl单机运行;queue.pl集群运行
–mfcc-config 是否使用自定义的配置文件,如使用该参数则需要在该参数后添加自定义的配置文件, mfcc的配置文件是写死的,在与make_mfcc同级的conf/mfcc.conf
–nj 开几个线程提取特征(根据自身资源合理设置)
train_make_mfcc/kaldi_file/ 主要是wav.scp,utt2spk,spk2utt
train_make_mfcc/exp/ 日志文件
train_make_mfcc/mfcc/ :
1、raw_mfcc_kaldi_file.N.ark 最终输出的特征文件
2、raw_mfcc_kaldi_file.N.ark.txt 使用copy-feats生成的文本文件
3、raw_mfcc_kaldi_file.N.scp 路径
​ 上述的N为N个线程,即有N个线程就会单独生成N个.ark和.scp文件

在这里插入图片描述

特征提取—特征查看

这里为了方便讲解,只提一句音频的特征

在data文件夹中创建文件夹用于存放特征:H/mfcc/

cd ~/kaldi/data/H
head -n 1 kaldi_file/wav.scp >1wav.scp

提取MFCC特征:

compute-mfcc-feats scp:1wav.scp ark:1.ark

生成文本格式的MFCC特征:

copy-feats ark:1.ark ark,t:1.txt

查看特征值维度:

feat-to-dim ark:1.ark -

在这里插入图片描述

五、CMVN

CMVN—脚本

compute_cmvn_stats.sh

注:这个脚本只能做每个人的发音特征的CMVN

cd ~/kaldi/data
./steps/compute_cmvn_stats.sh H/kaldi_file_test H/mfcc/exp/ H/cmvn/

参数详解:
第一个参数:提取特征后在原数据文件夹中生成的scp文件(含feats.scp文件夹)
第二个参数:输出日志
第三个参数:输出的cmvn文件

在这里插入图片描述

CMVN—命令

每个人的发音特征上做CMVN

compute_cmvn_stats

compute-cmvn-stats --spk2utt=ark:kaldi_file_test/spk2utt scp:kaldi_file_test/feats.scp ark,scp:cmvn/per.ark,cmvn/per.scp

参数详解:
第一个参数:要提取特征的文件的spk2utt文件
第二个参数:提取特征后在原数据文件夹中生成的scp文件
第三个参数:输出的cmvn和scp文件

在这里插入图片描述

所有人的发音特征上做CMVN

compute_cmvn_stats , H文件夹下执行

compute-cmvn-stats scp:kaldi_file_test/feats.scp cmvn/global.cmvn

参数详解:
第一个参数:提取特征后在原数据文件夹中生成的scp文件
第二个参数:输出的cmvn文件

在这里插入图片描述

查看global.cmvn

copy-matrix --binary=false cmvn/global.cmvn cmvn/global.txt

cat cmvn/global.txt

在这里插入图片描述

特征上做CMVN

apply-cmvn --utt2spk=ark:train_compute-mfcc-feats/utt2spk --norm-means=true 
--norm-vars=false scp:train_compute-mfcc-feats/cmvn_train_compute-mfcc-feats.scp scp:train_compute-mfcc-feats/raw_mfcc_train_compute-mfcc-feats.1.scp ark,t:after_cmvn.ark

参考文章:

MFCC特征提取教程

梅尔频率倒谱系数(MFCC) 学习笔记

初识语音识别及 Kaldi 的安装使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/346168.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringMVC执行流程(面试题)

SpringMVC是Spring框架中的组成成员之一&#xff0c;是一个针对于Web开发的一个类似于Servlet技术的一个web应用框架&#xff0c;它包含了MVC架构的特点&#xff0c;让Web变得更加简单。在SpringMVC框架中&#xff0c;一个比较核心的组件就是他的前端控制器&#xff0c;这个前端…

sql复习(子查询、创建和管理表)

一、子查询 子查询 (内查询) 在主查询之前一次执行完成 子查询的结果被主查询(外查询)使用 1.单行子查询 只返回一行&#xff0c;使用单行比较操作符。 --谁的工资比Able高&#xff1f; select last_name,salary from employees where salary > (select salaryfrom empl…

idea插件生成dao类service类controller类以及mapper.xml

idea插件生成dao类service类controller类以及mapper.xml 安装插件Easycode和MybatisX&#xff0c;不用自己写代码 1.Files——》Settings——》Plugins&#xff0c;分别搜索Easycode和MybatisX&#xff0c;点击下载。 2.新建一个springboot模板&#xff0c;选择的依赖如下 3.…

初探Spring采用Spring配置文件管理Bean

文章目录Spring容器演示--采用Spring配置文件管理Bean&#xff08;一&#xff09;创建Maven项目&#xff08;二&#xff09;添加Spring依赖&#xff08;三&#xff09;创建杀龙任务类&#xff08;四&#xff09;创建勇敢骑士类&#xff08;五&#xff09;采用传统方式让勇敢骑士…

JAVA内存模型(JMM)

JMM一、JMM——原子性-(synchronized)二、JMM——可见性-问题2.1 退不出的循环2.2 可见性——解决2.3 可见性三、JMM——有序性-问题3.1 诡异的结果3.2 解决方法3.3 有序性理解3.4 happens-beforeJMM 即 Java Memory Model&#xff0c;简单地说&#xff0c;JMM定义了一套在多线…

JVM - 字节码执行引擎

目录 栈帧和局部变量表 概述 栈帧概述 栈帧概念结构 局部变量表 slot是复用的实例 操作数栈 概述 动态连接 方法调用 静态分派和动态分派 栈帧和局部变量表 概述 JVM的字节码执行引擎&#xff0c;功能基本就是输入字节码文件&#xff0c;然后对字节码进行解析并处理…

jdk19下载与安装教程(win10)超详细

一、下载安装步骤 1、官网下载还需要注册&#xff0c;可以点【我的网盘】目录下载&#xff0c;目录也有其它低版本的&#xff0c;如果有需要大家根据需要自行选择。 2、下载后直接点击安装程序&#xff0c;点击【运行】。这里我使用的是64位的。 3、点击【下一步】。 4、默认安…

28-Golang中的数组

Golang中的数组数组介绍数组的定义和内存布局数组的定义数组的内存图数组 的使用访问数组元素案例四种初始化的方式for-range结构遍历基本语法说明案例数组使用注意事项和细节数组应用案例1.创建一个byte类型的26个元素的数组&#xff0c;分别放置A-Z。使用for循环访问所有元素…

分享SEO优化的8个技巧

什么是SEO? SEO是Search Engine Optimization的缩写&#xff0c;直译过来就是“搜索引擎优化”的意识。故名意思&#xff0c;SEO是一种优化&#xff08;提高&#xff09;网站在搜索引擎内的自然排名的行为的统称。 当里个当&#xff0c;当里个当&#xff0c;闲言碎语不要讲&a…

Web应用程序自动化测试工具Selenium的主要功能有哪些?

Selenium是一个用于Web应用程序测试的工具。是一个开源的Web的自动化测试工具&#xff0c;最初是为网站自动化测试而开发的&#xff0c;类型像我们玩游戏用的按键精灵&#xff0c;可以按指定的命令自动操作&#xff0c;不同是Selenium可以直接运行在浏览器上&#xff0c;它支持…

VSCode最新版本下载安装详细教程(win10)

VSCode是Microsoft发布的一款运行于多个操作系统&#xff0c;针对于编写现代Web和云应用的跨平台的源代码编辑器&#xff0c; 可在桌面上运。它具有对JavaScript&#xff0c;TypeScript和Node.js的内置支持&#xff0c;并具有丰富的其他语言&#xff08;例如C&#xff0c;C&…

vue-echarts实现多功能图表

前言作为前端人员&#xff0c;日常图表、报表、地图的接触可谓相当频繁&#xff0c;今天小编隆重退出前端框架之VUE结合百度echart实现中国地图各种图表的展示与使用&#xff1b;作为“你值得拥有”专栏阶段性末篇&#xff0c;值得一看主要实现功能——中国地图——环形图——折…

Springboot扩展点之DisposableBean

前言DisposableBean&#xff0c;是在Spring容器关闭的时候预留的一个扩展点&#xff0c;从业务开发的角度来看&#xff0c;基本上是用不到的&#xff0c;但是Spring容器从启动到关闭&#xff0c;是Spring Bean生命周期里一个绕不开的节点&#xff0c;因此还是有必要学习一下&am…

Web3中文|关于以太坊“上海升级”,你需要知道哪些?

今年3月&#xff0c;以太坊将进行自2022年9月转向权益证明系统以来的首次大升级&#xff0c;即上海硬交叉。一旦以太坊完成“上海升级”&#xff0c;帮助运营网络的验证者将能够提取1600万枚被质押的以太币&#xff08;ETH&#xff09;。 除了重点落实以太坊改进建议——4895&…

吉林电视台启用乾元通多卡聚合系统广电视频传输解决方案

随着广播电视数字化、IP化、智能化的逐步深入&#xff0c;吉林电视台对技术改造、数字设备升级提出了更高要求&#xff0c;通过对系统性能、设计理念的综合评估&#xff0c;正式启用乾元通多卡聚合系统广电视频传输解决方案&#xff0c;将用于大型集会、大型演出、基层直播活动…

idea使用本地代码远程调试线上运行代码---linux环境

场景&#xff1a; 之前介绍过windows环境上&#xff0c;用idea进行远程调试那么在linux环境下实战一下 环境&#xff1a; linux 测试应用&#xff1a;使用docker部署的platform-multiappcenter-base-app-1.0.0-SNAPSHOT.jar 应用 测试应用端口&#xff1a;19001 测试工具&…

工欲善其事,必先利其器,分享5款Windows效率软件

工欲善其事&#xff0c;必先利其器。作为全球最多人使用的桌面操作系统&#xff0c;Windows 的使用效率与我们的工作学习息息相关。今天&#xff0c;小编就为大家整理了5款提高效率的利器&#xff0c;让你的 Windows 更具生产力。 1.桌面自定义——Rainmeter Rainmeter是一款…

快速部署私有云笔记,免费享受多端同步

一、老Q笔记之一路坎坷 市面上的笔记软件非常多&#xff0c;有些是本地编辑功能特别强大但是不支持云同步&#xff0c;有些是支持上云但是编辑功能不够完善。选择一款合适的云笔记软件&#xff0c;无疑能让我们工、学习的时候更加顺心、顺手。 这么多年来老Q使用过很多云笔记…

亚马逊云科技与CIT强强联手,因企制宜加速数字化进程

数字经济时代&#xff0c;数据逐渐成为企业重要的生产要素&#xff0c;并成为驱动生产力增长的助力。但数据的快速增长&#xff0c;也给企业带来了诸多挑战&#xff0c;如&#xff1a;企业将彻底改变内外部流程、数据量超越了传统数据库的管理能力等。 作为亚马逊云科技全球咨…

10、创建和管理表

文章目录1 基础知识1.1 一条数据存储的过程1.2 标识符命名规则1.3 MySQL中的数据类型2. 创建和管理数据库2.1 创建数据库2.2 使用数据库2.3 修改数据库2.4 删除数据库3. 创建表3.1 创建方式13.2 创建方式23.3 查看数据表结构4 修改表4.1 追加一个列4.2 修改一个列4.3 重命名一个…