当前位置: 首页 > news >正文

python实现梅尔频率倒谱系数(MFCC) 除了傅里叶变换和离散余弦变换

语音识别第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.lryc.cn/news/623630.html

相关文章:

  • 3.逻辑回归:从分类到正则化
  • pyecharts可视化图表组合组件_Grid:打造专业数据仪表盘
  • 数据赋能(396)——大数据——抽象原则
  • tauri2项目WindowConfig配置中titleBarStyle样式区别,仅macOS有效
  • 【Jenkins】01 - Jenkins安装
  • 阶段二:7-上网行为安全概述
  • Kotlin集合概述
  • 《PEFLL: Personalized Federated Learning by Learning to Learn》——论文阅读
  • 【Android】Activity创建、显式和隐式跳转、清单文件声明
  • Android 对话框 - 基础对话框补充(不同的上下文创建 AlertDialog、AlertDialog 的三个按钮)
  • 飞算JavaAI结合Redis实现高性能存储:从数据瓶颈到极速读写的实战之旅
  • 关于虾的智能养殖系统的开发与实现(LW+源码+讲解+部署)
  • 数据结构(排序篇)——七大排序算法奇幻之旅:从扑克牌到百亿数据的魔法整理术
  • 三维重建-动手学计算机视觉19(完结)
  • SHAP分析!NRBO-Transformer-BiLSTM回归预测SHAP分析,深度学习可解释分析!
  • ReID/OSNet 算法模型量化转换实践
  • 牛客周赛 Round 105
  • Redis-plus-plus API使用指南:通用操作与数据类型接口介绍
  • EDMA(增强型直接内存访问)技术
  • [每周一更]-(第155期):Go 1.25 发布:新特性、技术思考与 Go vs Rust 竞争格局分析
  • 多线程—飞机大战(加入排行榜功能版本)
  • 亚马逊拉美市场爆发:跨境卖家的本土化增长方程式
  • UE5多人MOBA+GAS 48、制作闪现技能
  • 第四章:大模型(LLM)】06.langchain原理-(7)LangChain 输出解析器(Output Parser)
  • CSS中linear-gradient 的用法
  • 【Python】Python 面向对象编程详解​
  • 多线程—飞机大战(加入播放音乐功能版本)
  • macos 安装nodepad++ (教程+安装包+报错后的解决方法)
  • Sentinel和12.5米高程的QGIS 3D效果
  • scikit-learn/sklearn学习|套索回归Lasso解读