实战一:给定一段音频,请提取12维MFCC特征,阅读代码预加重、分帧、加窗部分,完善作业代码中fbank和mfcc部分,并给出最终的Fbank和MFCC特征,用默认的配置参数,无需进行修改
一、实战相关说明(实战项目相关文档)
代码文件说明
代码依赖
<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特征,用默认的配置参数,无需进行修改相关推荐
- 声纹技术(二):音频信号处理基础【模拟信号(连续)--采样-->数字信号(离散)--量化-->振幅简化为整数--编码-->二进制序列】【WAV音频格式】【SoX】【分帧-加窗-】
2.1 欲懂声纹,先学音频 从学科分类上讲,声纹技术是语音信号处理的一个分支,而语音信号处理则属于音频信号处理这个大类. 语音信号和音频信号,这二者的区别在于: 语音信号专指人类说话时所发出的具有社会 ...
- 音乐音频 | openSMILE提取6373维静态特征
文章目录 静态特征提取代码 提取后的文件 part1:6373维特征的name part2:song and features 提取后的文件的处理 以DEAM数据集为例 静态特征提取代码 因为要提取6 ...
- Helm部署服务前自定义Chart包默认的配置参数(四)
Helm安装服务前自定义Chart默认配置项 文章目录 Helm安装服务前自定义Chart默认配置项 1.修改Chart默认配置项的两种方式 2.使用--values的方式自定义chart配置项 2. ...
- JavaScript学习(八十)—请写一段JS程序提取URL中的各个get参数(参数名和参数个数不确定),将其按key-value形式返回到一个json结构中
JavaScript学习(八十)-请写一段JS程序提取URL中的各个get参数(参数名和参数个数不确定),将其按key-value形式返回到一个json结构中 题目: 代码:
- 爬虫项目实战一:基于Scrapy+MongDB爬取并存储糗事百科用户信息
爬虫项目实战一:基于Scrapy+MongDB爬取并存储糗事百科用户信息 一.前言 二.项目目标 三.项目的环境配置 四.项目实现 1. 创建QSBK项目 2. 实现Spider 1. 实现一页网页上 ...
- GridView实战一:自定义分页、排序、修改、插入、删除
前言: 在某次公司面试时被问到对GridView操作的熟悉程度,在那之前一直用Repeater内嵌table标签对GridView操作确实很少,于是最近在项目的后台上对GridView进行了一番实操, ...
- 把音频中的某个人声去掉_能不能把一段音频中的人声和背景音乐分开
能不能把一段音频中的人声和背景音乐分开 能不能把一段音频中的人声和背景音乐分开 [方法一]1.可以尝试使用音频编辑软件Audacity 2.打开音频文件,在特效菜单有个Vocal Remover工具, ...
- 【k8s实战一】Jenkins 部署应用到 Kubernetes
[k8s实战一]Jenkins 部署应用到 Kubernetes 01 本文主旨 目标是演示整个Jenkins从源码构建镜像到部署镜像到Kubernetes集群过程. 为了简化流程与容易重现文中效果, ...
- Android之使用SoundPool播放一小段音频,实现猜歌的功能
这里,首先附上软件运行后的界面: 1.在播放音乐中,我介绍过利用MediaPlayer来播放音乐,这个类占用资源多,并且不支持播放多个音频,在Android中还提供了一个播放音频的类,即SoundPo ...
- Flutter实战一Flutter聊天应用(二十)
在上一篇文章<Flutter实战一Flutter聊天应用(十九)>中,我们完成了删除用户的逻辑,就是将会话的有效性设置为false就可以了.那么当会话的有效性为false时,用户再次添加该 ...
最新文章
- Java项目:电商书城平台系统设计和实现(java+springboot+mysql+spring+jsp)
- 快速书写常见的 Kotlin 代码 MD
- C语言中的extern关键字用法
- Solaris的syslog机制
- [@Controller]4 详解@ModelAttribute
- 基于8086CPU微处理器的汇编学习之PUSH、POP指令
- Go语言中的匿名函数和闭包的样子
- linux so文件统一目录,linux加载指定目录的so文件
- IPC Binder
- 解析全球热点安全事件背后的玄机
- opencv——convertTo
- Discuz论坛验证码破解
- 介绍几种wifi电源管理模式
- vga焊接线顺序_vga线序是怎么排列的?
- S5P6818开发板移植OV5640摄像头
- 什么平板电脑能够用来编程
- 几何学五大公理_数学几何的五大公理、五大公设是什么??
- 当AI对话系统像自动驾驶一样分级,谁能率先跑出L5?
- 用C语言编程写高考祝福,2020高考祝福自己的句子_高考给自己加油打气的话精选100句...
- 嵌入式经典面试题总结
热门文章
- 比湿和相对湿度的转换、体感温度的计算
- JAVA测试人员考核_自动化测试的绩效考核
- confusion matix
- 二进制方式部署k8s集群1.21版本-域名形式
- xp系统怎么看计算机内存条,XP环境下怎么查看虚拟内存?XP系统虚拟内存过低怎么设置?...
- 江苏咪咕MGV3000_YST代工_S905L3_线刷固件包
- java 生成 rtf,JAVA实现BI报表中RTF模版转PDF
- 解释什么是啸叫,为什么会发生啸叫,啸叫的为何和如何防止啸叫
- 2021湖北技能高考成绩时间查询,2020湖北技能高考成绩查询时间
- IT行业都有哪些职位,初学者(0基础,新人)该如何选择,才能够快速进入这个行业?... 1