一、实战相关说明(实战项目相关文档)

代码文件说明

代码依赖

<span style="color:#24292f"><span style="background-color:#ffffff"><span style="background-color:var(--color-canvas-subtle)"><code>python3
librosa
</code></span></span></span>

如果需要观察特征频谱,请确保自己有matplotlib依赖并将代码中相关注解解掉

注:不要修改文件默认输出test.fbank test.mfcc的文件名

文件路径说明

<span style="color:#24292f"><span style="background-color:#ffffff"><span style="background-color:var(--color-canvas-subtle)"><code>mfcc.py 作业代码
test.wav 测试音频
Readme.md 说明文件</code></span></span></span>

二、实战代码

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# @FileName  :MFCC_test.py
# @Time      :2022/2/16 12:10
# @Author    :PangXZ
import librosa
import numpy as np
from scipy.fftpack import dct# Draw spectrogram pictures
import matplotlibmatplotlib.use('Agg')
import matplotlib.pyplot as pltdef plot_spectrogram(spec, note, file_name):"""Draw the spectrogram picture:param spec: a feature_dim by num_frames array (data):param note: title of the picture:param file_name: name of the file:return:"""fig = plt.figure(figsize=(20, 5))heatmap = plt.pcolor(spec)fig.colorbar(mappable=heatmap)plt.xlabel('Time(s')plt.ylabel(note)plt.tight_layout()plt.savefig(file_name)def preemphasis(signal, coeff=0.97):"""语音信号预加重,相当于一个一阶高通滤波器:param signal: 语音信号:param coeff:  预加重系数,0表示不加重,默认为0.97:return: 返回加重后的语音信号"""return np.append(signal[0], signal[1:] - coeff * signal[:-1])def enframe(signal, frame_len=400, frame_shift=160, win=np.hamming(M=400)):"""对语音信号进行分帧和加窗(汉明窗):param signal:      输入的语音信号:param frame_len:   帧长,这里用一帧中的采样点数:param frame_shift: 帧移:param win:         窗型:return:            返回加窗之后的语音信号"""num_samples = signal.size  # 语音信号的大小num_frames = np.floor((num_samples - frame_len) / frame_shift) + 1  # 帧数frames = np.zeros((int(num_frames), frame_len))for i in range(int(num_frames)):frames[i, :] = signal[i * frame_shift: i * frame_shift + frame_len]frames[i, :] = frames[i, :] * winreturn framesdef get_spectrum(frames, fft_len=512):"""使用快速傅里叶变换获得语音信号的频谱:param frames: 已分帧的语音信号,num_frames by frame_len array:param fft_len:快速傅里叶变换的长度,默认为512:return: 返回频谱,a num_frames by fft_len/2+1 array (real)"""cFFT = np.fft.fft(frames, n=fft_len)valid_len = int(fft_len / 2) + 1spectrum = np.abs(cFFT[:, 0:valid_len])return spectrumdef fbank(spectrum, num_filter=23, fft_len=512, sample_size=16000):"""从频谱中获得mel滤波器组特征:param spectrum:    频谱:param num_filter:  mel滤波器数目,默认为23:return: 返回fbank特征"""# 1. 获取一组梅尔滤波器组low_freq_mel = 0high_freq_mel = 2595 * np.log10(1 + (sample_size / 2) / 700)  # 转换到mel尺度mel_points = np.linspace(low_freq_mel, high_freq_mel, num_filter + 2)  # mel空间中线性取点hz_points = 700 * (np.power(10., (mel_points / 2595)) - 1)  # 转回线性谱bin = np.floor(hz_points / (sample_size / 2) * (fft_len / 2 + 1))  # 把原本的频率对应值缩放到FFT窗长上# 2. 用滤波器组对每一帧特征滤波,计算特征与滤波器的乘积,使用np.dotfbank = np.zeros((num_filter, int(np.floor(fft_len / 2 + 1))))for m in range(1, 1 + num_filter):f_left = int(bin[m - 1])    # 左边界点f_center = int(bin[m])      # 中心点f_right = int(bin[m + 1])   # 右边界点for k in range(f_left, f_center):fbank[m - 1, k] = (k - f_left) / (f_center - f_left)for k in range(f_center, f_right):fbank[m - 1, k] = (f_right - k) / (f_right - f_center)filter_banks = np.dot(spectrum, fbank.T)# finfo函数是根据括号中的类型来获得信息,获得符合这个类型的数型# eps是取非负的最小值,np.finfo(float).eps的值是2.220446049250313e-16,即最小的正数filter_banks = np.where(filter_banks == 0, np.finfo(float).eps, filter_banks)# 3. 取对数操作filter_banks = 20 * np.log10(filter_banks)return filter_banksdef mfcc(fbank, num_mfcc=22):"""基于Fbank特征获取MFCC特征:param fbank:   fbank特征:param num_mfcc: MFCC系数数目:return: MFCC特征"""# feats = np.zeros((fbank.shape[0], num_mfcc))# 1. 从上一步获得的fbank特征,计算获取的mfcc特征,主要是一个离散余弦变换的操作mfcc = dct(fbank, type=2, axis=1, norm='ortho')[:, 1:(num_mfcc + 1)]return mfccdef write_file(feats, file_name):"""保存特征到文件中:param feats:   语音信号特征:param file_name: 文件名称"""f = open(file_name, 'w')(row, col) = feats.shapefor i in range(row):f.write('[')for j in range(col):f.write(str(feats[i, j]) + ' ')f.write(']\n')f.close()if __name__ == "__main__":# 预加重系数 0.97alpha = 0.97# 帧设置sample_size = 16000  # fs 16kHzframe_len = 400  # 一帧有400个采样点,即16000 × 0.025 = 400, 采样率fs=16kHz, 帧长为25msframe_shift = 160  # 帧移10ms × 采样率16kHz = 160fft_len = 512  # 快速傅里叶变换的采样信号长度512 = 2的9次幂# Mel滤波器组设置num_filter = 23  # 滤波器个数num_mfcc = 12  # 倒谱的个数# 读取WAV格式语音文件wav, fs = librosa.load('test.wav', sr=None)signal = preemphasis(wav, coeff=alpha)frames = enframe(signal, frame_len=frame_len, frame_shift=frame_shift, win=np.hamming(M=frame_len))spectrum = get_spectrum(frames, fft_len=fft_len)fbank_feats = fbank(spectrum, num_filter=num_filter, fft_len=fft_len, sample_size=sample_size)mfcc_feats = mfcc(fbank_feats, num_mfcc=num_mfcc)plot_spectrogram(fbank_feats, 'Filter Bank', 'fbank.png')write_file(fbank_feats, 'test.fbank')plot_spectrogram(mfcc_feats, 'MFCC', 'mfcc.png')write_file(mfcc_feats, 'test.mfcc')

实战一:给定一段音频,请提取12维MFCC特征,阅读代码预加重、分帧、加窗部分,完善作业代码中fbank和mfcc部分,并给出最终的Fbank和MFCC特征,用默认的配置参数,无需进行修改相关推荐

  1. 声纹技术(二):音频信号处理基础【模拟信号(连续)--采样-->数字信号(离散)--量化-->振幅简化为整数--编码-->二进制序列】【WAV音频格式】【SoX】【分帧-加窗-】

    2.1 欲懂声纹,先学音频 从学科分类上讲,声纹技术是语音信号处理的一个分支,而语音信号处理则属于音频信号处理这个大类. 语音信号和音频信号,这二者的区别在于: 语音信号专指人类说话时所发出的具有社会 ...

  2. 音乐音频 | openSMILE提取6373维静态特征

    文章目录 静态特征提取代码 提取后的文件 part1:6373维特征的name part2:song and features 提取后的文件的处理 以DEAM数据集为例 静态特征提取代码 因为要提取6 ...

  3. Helm部署服务前自定义Chart包默认的配置参数(四)

    Helm安装服务前自定义Chart默认配置项 文章目录 Helm安装服务前自定义Chart默认配置项 1.修改Chart默认配置项的两种方式 2.使用--values的方式自定义chart配置项 2. ...

  4. JavaScript学习(八十)—请写一段JS程序提取URL中的各个get参数(参数名和参数个数不确定),将其按key-value形式返回到一个json结构中

    JavaScript学习(八十)-请写一段JS程序提取URL中的各个get参数(参数名和参数个数不确定),将其按key-value形式返回到一个json结构中 题目: 代码:

  5. 爬虫项目实战一:基于Scrapy+MongDB爬取并存储糗事百科用户信息

    爬虫项目实战一:基于Scrapy+MongDB爬取并存储糗事百科用户信息 一.前言 二.项目目标 三.项目的环境配置 四.项目实现 1. 创建QSBK项目 2. 实现Spider 1. 实现一页网页上 ...

  6. GridView实战一:自定义分页、排序、修改、插入、删除

    前言: 在某次公司面试时被问到对GridView操作的熟悉程度,在那之前一直用Repeater内嵌table标签对GridView操作确实很少,于是最近在项目的后台上对GridView进行了一番实操, ...

  7. 把音频中的某个人声去掉_能不能把一段音频中的人声和背景音乐分开

    能不能把一段音频中的人声和背景音乐分开 能不能把一段音频中的人声和背景音乐分开 [方法一]1.可以尝试使用音频编辑软件Audacity 2.打开音频文件,在特效菜单有个Vocal Remover工具, ...

  8. 【k8s实战一】Jenkins 部署应用到 Kubernetes

    [k8s实战一]Jenkins 部署应用到 Kubernetes 01 本文主旨 目标是演示整个Jenkins从源码构建镜像到部署镜像到Kubernetes集群过程. 为了简化流程与容易重现文中效果, ...

  9. Android之使用SoundPool播放一小段音频,实现猜歌的功能

    这里,首先附上软件运行后的界面: 1.在播放音乐中,我介绍过利用MediaPlayer来播放音乐,这个类占用资源多,并且不支持播放多个音频,在Android中还提供了一个播放音频的类,即SoundPo ...

  10. Flutter实战一Flutter聊天应用(二十)

    在上一篇文章<Flutter实战一Flutter聊天应用(十九)>中,我们完成了删除用户的逻辑,就是将会话的有效性设置为false就可以了.那么当会话的有效性为false时,用户再次添加该 ...

最新文章

  1. Java项目:电商书城平台系统设计和实现(java+springboot+mysql+spring+jsp)
  2. 快速书写常见的 Kotlin 代码 MD
  3. C语言中的extern关键字用法
  4. Solaris的syslog机制
  5. [@Controller]4 详解@ModelAttribute
  6. 基于8086CPU微处理器的汇编学习之PUSH、POP指令
  7. Go语言中的匿名函数和闭包的样子
  8. linux so文件统一目录,linux加载指定目录的so文件
  9. IPC Binder
  10. 解析全球热点安全事件背后的玄机
  11. opencv——convertTo
  12. Discuz论坛验证码破解
  13. 介绍几种wifi电源管理模式
  14. vga焊接线顺序_vga线序是怎么排列的?
  15. S5P6818开发板移植OV5640摄像头
  16. 什么平板电脑能够用来编程
  17. 几何学五大公理_数学几何的五大公理、五大公设是什么??
  18. 当AI对话系统像自动驾驶一样分级,谁能率先跑出L5?
  19. 用C语言编程写高考祝福,2020高考祝福自己的句子_高考给自己加油打气的话精选100句...
  20. 嵌入式经典面试题总结

热门文章

  1. 比湿和相对湿度的转换、体感温度的计算
  2. JAVA测试人员考核_自动化测试的绩效考核
  3. confusion matix
  4. 二进制方式部署k8s集群1.21版本-域名形式
  5. xp系统怎么看计算机内存条,XP环境下怎么查看虚拟内存?XP系统虚拟内存过低怎么设置?...
  6. 江苏咪咕MGV3000_YST代工_S905L3_线刷固件包
  7. java 生成 rtf,JAVA实现BI报表中RTF模版转PDF
  8. 解释什么是啸叫,为什么会发生啸叫,啸叫的为何和如何防止啸叫
  9. 2021湖北技能高考成绩时间查询,2020湖北技能高考成绩查询时间
  10. IT行业都有哪些职位,初学者(0基础,新人)该如何选择,才能够快速进入这个行业?... 1