语音识别第4讲:语音特征参数MFCC https://zhuanlan.zhihu.com/p/88625876/
Speech Processing for Machine Learning: Filter banks, Mel-Frequency Cepstral Coefficients (MFCCs) and What’s In-Between https://haythamfayek.com/2016/04/21/speech-processing-for-machine-learning.html

#梅尔频率倒谱系数(MFCC)的原理讲解及python实现
# https://www.cnblogs.com/LXP-Never/p/10918590.htmlimport numpy
import numpy as np
import scipy.io.wavfile
from scipy.fftpack import dctsample_rate, signal = scipy.io.wavfile.read(r'H:\p227_003.wav')
signal = signal[0:int(3.5 * sample_rate)]  # 我们只取前3.5s
pre_emphasis = 0.97#1、预加重 (Pre-Emphasis)
emphasized_signal = numpy.append(signal[0], signal[1:] - pre_emphasis * signal[:-1])frame_size = 0.025
frame_stride = 0.01
overlap=0.015#2、分帧 (Framing)
frame_length, frame_step = frame_size * sample_rate, frame_stride * sample_rate  # 从秒转换为采样点
signal_length = len(emphasized_signal)
frame_length = int(round(frame_length))
frame_step = int(round(frame_step))
# 确保我们至少有1帧
num_frames = int(numpy.ceil(float(numpy.abs(signal_length - frame_length)) / frame_step)) + 1  #原文这里错了
pad_signal_length = (num_frames-1) * frame_step + frame_length  #原文这里错了z = numpy.zeros((pad_signal_length - signal_length))
# 填充信号,确保所有帧的采样数相等,而不从原始信号中截断任何采样
pad_signal = numpy.append(emphasized_signal, z)indices = numpy.tile(numpy.arange(0, frame_length), (num_frames, 1)) + numpy.tile(numpy.arange(0, num_frames * frame_step, frame_step), (frame_length, 1)).T
frames = pad_signal[indices.astype(numpy.int32, copy=False)]#3、加窗 (Window)
frames *= numpy.hamming(frame_length)
# frames *= 0.54 - 0.46 * numpy.cos(( numpy.pi * n ) / (frame_length - 1))  # 内部实现NFFT=512
# 二、FFT (Fourier-Transform)
mag_frames = numpy.absolute(numpy.fft.rfft(frames, NFFT))   # fft的幅度(magnitude)# 三、功率谱 (Power Spectrum)
pow_frames = ((1.0 / NFFT) * ((mag_frames) ** 2))  # 功率谱# 四、滤波器组 (Filter Banks)
nfilt = 40
low_freq_mel = 0
high_freq_mel = (2595 * np.log10(1 + (sample_rate / 2) / 700))  # 求最高hz频率对应的mel频率
# 我们要做40个滤波器组,为此需要42个点,这意味着在们需要low_freq_mel和high_freq_mel之间线性间隔40个点
mel_points = np.linspace(low_freq_mel, high_freq_mel, nfilt + 2)  # 在mel频率上均分成42个点
hz_points = (700 * (10 ** (mel_points / 2595) - 1))  # 将mel频率再转到hz频率
# bin = sample_rate/2 / NFFT/2=sample_rate/NFFT    # 每个频点的频率数
# bins = hz_points/bin=hz_points*NFFT/ sample_rate    # hz_points对应第几个fft频点
bins = np.floor((NFFT + 1) * hz_points / sample_rate)fbank = np.zeros((nfilt, int(np.floor(NFFT / 2 + 1))))
for m in range(1, nfilt + 1):f_m_minus = int(bins[m - 1])  # 左f_m = int(bins[m])  # 中f_m_plus = int(bins[m + 1])  # 右for k in range(f_m_minus, f_m):fbank[m - 1, k] = (k - bins[m - 1]) / (bins[m] - bins[m - 1])for k in range(f_m, f_m_plus):fbank[m - 1, k] = (bins[m + 1] - k) / (bins[m + 1] - bins[m])
filter_banks = np.dot(pow_frames, fbank.T)
filter_banks = np.where(filter_banks == 0, np.finfo(float).eps, filter_banks)  # 数值稳定性
filter_banks = 20 * np.log10(filter_banks)  # dB#五、梅尔频率倒谱系数(MFCCs)
num_ceps = 12
mfcc = dct(filter_banks, type=2, axis=1, norm='ortho')[:, 1 : (num_ceps + 1)] # 保持在2-13cep_lifter =22
(nframes, ncoeff) = mfcc.shape
n = numpy.arange(ncoeff)
lift = 1 + (cep_lifter / 2) * numpy.sin(numpy.pi * n / cep_lifter)
mfcc *= lift# 六、均值归一化(Mean Normalization)
filter_banks -= (numpy.mean(filter_banks, axis=0) + 1e-8)
mfcc -= (numpy.mean(mfcc, axis=0) + 1e-8)

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springBoot+knife4j+openapi3依赖问题参考

pom文件附带版本<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.1.12</version></parent><dependencies><!-- SpringDoc starter --><d…

XML DOM 高级

XML DOM 高级 引言 XML DOM(Document Object Model)是用于解析和操作XML文档的一种标准,它允许开发者通过编程方式访问和修改XML文档的内容。本文将深入探讨XML DOM的高级特性,包括XML解析、节点操作、事件处理以及性能优化等,帮助读者全面理解并掌握XML DOM的高级应用。…

「第18讲 内容生成应用场景与多语言支持」AI Agent开发与应用:基于大模型的智能体构建

第18讲核心内容概述内容生成应用场景营销文案生成&#xff1a;基于产品特征自动生成广告语、社交媒体文案&#xff0c;支持个性化推荐和A/B测试优化。新闻报道辅助&#xff1a;快速生成财经、体育等领域的结构化新闻摘要&#xff0c;结合实时数据更新内容。教育内容定制&#x…

金融业务安全增强方案:国密SM4/SM3加密+硬件加密机HSM+动态密钥管理+ShardingSphere加密

国密SM4/SM3 SM4&#xff1a;对称加密算法&#xff0c;分组长度128位&#xff0c;密钥长度128位&#xff0c;适用于数据加密&#xff08;如数据库字段、通信报文&#xff09;】 加密存储&#xff1a;用户身份证号、银行卡号等敏感字段&#xff08;配合ShardingSphere等中间件自…

Chaos Vantage 2.8.1 发布:实时探索与材质工作流的全新突破

作为行业领先的实时光线追踪渲染器&#xff0c;Chaos Vantage再添利器。2.8.1版本更新聚焦材质工作流、硬件效率与API拓展&#xff0c;为建筑可视化、动画制作等领域带来更流畅的操作体验与更深层的定制化可能。 一、核心功能更新&#xff1a;让创作更顺畅 完整V-Ray材质节点支…

【集合框架List接口】

&#x1f449; 用 ArrayList 存数据&#xff0c;结果插入时卡住了&#xff1f; &#x1f449; 想删除某个元素&#xff0c;却发现索引错乱了&#xff1f; &#x1f449; 不知道该用 ArrayList 还是 LinkedList&#xff0c;选错了导致性能瓶颈&#xff1f;一、List 是什么&#…

《棒球百科》奥运会取消了棒球·野球1号位

⚾️ 奥运会棒球消失&复活之谜&#xff01;深度揭秘全球体育权力游戏 ⚾️❌ 2008年为何被踢出奥运&#xff1f;(Why Removed in 2008?)MLB的致命抵制➤ 奥运赛期撞车MLB常规赛白热化阶段&#xff01;➤ 球队老板拒放巨星&#xff1a;2000年悉尼奥运美国队仅剩"替补阵…

基于js和html的点名应用

分享一个在课堂或者是公司团建上需要点名的应用程序&#xff0c;开箱即用。1、双击打开后先选择人员名单&#xff08;可以随时更改的&#xff09;2、下面的滚动速度可以根据需求调整<!DOCTYPE html> <html lang"zh"> <head> <meta charset"…

【深度学习-基础知识】单机多卡和多机多卡训练

1. 单机多卡训练&#xff08;Single Machine, Multi-GPU&#xff09; 概念 在同一台服务器上&#xff0c;有多块 GPU。一个训练任务利用所有 GPU 并行加速训练。数据集存放在本地硬盘或共享存储上。 核心原理数据并行&#xff08;Data Parallelism&#xff09; 将一个 batch 划…

数据库原理及应用_数据库基础_第2章关系数据库标准语言SQL_SQL语言介绍数据库的定义和删除

前言 "<数据库原理及应用>(MySQL版)".以下称为"本书"中2.1节和2.2节第一部分内容 引入 本书P40:SQL(Structure Query Language结构化查询语言)是一种在关系数据库中定义和操纵数据的标准语言,是用户和数据库之间进行交流的接口. ---SQL是一种语言,是…

实变函数中集合E的边界与其补集的边界是否相等

在实变函数&#xff08;或一般拓扑学&#xff09;中&#xff0c;给定一个集合 E \subseteq \mathbb{R}^n &#xff08;或更一般的拓扑空间&#xff09;&#xff0c;集合 E 的边界&#xff08;boundary&#xff09;与 E 的补集 E^c 的边界是否相等&#xff1f; 即&#x…

# C++ 中的 `string_view` 和 `span`:现代安全视图指南

C 中的 string_view 和 span&#xff1a;现代安全视图指南 文章目录C 中的 string_view 和 span&#xff1a;现代安全视图指南目录1. 原始指针的痛点1.1 安全问题1.2 所有权不明确1.3 接口笨拙1.4 生命周期问题2. string_view 深入解析2.1 基本特性2.2 高效解析示例2.3 防止常见…

Linux学习-多任务(线程)

定义轻量级进程&#xff0c;实现多任务并发&#xff0c;是操作系统任务调度最小单位&#xff08;进程是资源分配最小单位 &#xff09;。创建由进程创建&#xff0c;属于进程内执行单元。- 独立&#xff1a;线程有8M 独立栈区 。 - 共享&#xff1a;与所属进程及进程内其他线程…

高级堆结构

一、二项堆&#xff08;Binomial Heap&#xff09;&#xff1a;理解「合并操作」的优化二项堆的核心优势是高效合并&#xff0c;类似 “二进制加法”。我们通过「合并两个二项堆」的伪代码和步骤来理解&#xff1a;核心结构伪代码&#xff1a;class BinomialTreeNode:def __ini…

系统学习算法 专题十七 栈

题目一&#xff1a;算法思路&#xff1a;一开始还是暴力解法&#xff0c;即遍历字符串&#xff0c;如果出现当前位置的字符等于后面的字符&#xff0c;则删除这两个字符&#xff0c;然后再从头遍历&#xff0c;如此循环即可但是这样时间复杂度很高&#xff0c;每删除一次就从头…

深入解析函数指针及其数组、typedef关键字应用技巧

目录 一、函数指针变量的创建 1、什么是函数指针变量&#xff1f; 2、函数是否有地址&#xff1f; 3、创建函数指针变量 4、函数指针类型解析 二、函数指针变量的使用 三、两段有趣的代码 1、解释 (*(void (*)())0)(); 2、解释 void (*signal(int, void(*)(int)))(int…

k8s集群搭建一主多从的jenkins集群

方案 --------------------- | Jenkins Master | | - 持久化配置 |<---(hostpath 存储) | - 自动容灾 | --------------------|| Jenkins JNLP 通信| ----------v---------- ------------------- | Jenkins Agent | | Kubernetes Pl…

重温k8s基础概念知识系列三(工作负载)

文章目录1、工作负载简述2、Deployment1.1、创建 Deployment1.2、检查 Deployment上线状态3、StatefulSet4、DaemonSet3.1、创建 DaemonSet3.2、运行DaemonSet5、Job5.1、运行示例 Job5.2、检查 Job 的状态6、CronJob上一节&#xff0c;我们复习了Pod相关知识&#xff0c;大多情…

开源 Arkts 鸿蒙应用 开发(十八)通讯--Ble低功耗蓝牙服务器

文章的目的为了记录使用Arkts 进行Harmony app 开发学习的经历。本职为嵌入式软件开发&#xff0c;公司安排开发app&#xff0c;临时学习&#xff0c;完成app的开发。开发流程和要点有些记忆模糊&#xff0c;赶紧记录&#xff0c;防止忘记。 相关链接&#xff1a; 开源 Arkts …

Go语言并发编程 ------ 锁机制详解

Go语言提供了丰富的同步原语来处理并发编程中的共享资源访问问题。其中最基础也最常用的就是互斥锁&#xff08;Mutex&#xff09;和读写锁&#xff08;RWMutex&#xff09;。1. sync.Mutex&#xff08;互斥锁&#xff09;Mutex核心特性互斥性/排他性&#xff1a;同一时刻只有一…