赞
踩
这东西真好,提取特征是件挺麻烦的事情,预加重、分帧、加窗 … 不得不感叹py是真舒服。
相比python_speech_features的文档,librosa似乎更舒适
import matplotlib.pyplot as plt import librosa.display from python_speech_features import * import numpy as np import utils x , sr = librosa.load("output.wav") print(f'x.shape = {x.shape}') print(f'sr = {sr}') x=utils.trim_long_silences(x) # -----------------------波形图------------------------------ librosa.display.waveplot(x) plt.show() # -----------------------短时傅里叶------------------------------ plt.title('librosa.stft') # n_fft 为 FFT窗口大小 值越大,信号越清晰 stft = librosa.stft(x, n_fft=9216) print("短时傅里叶") print(stft.shape) librosa.display.specshow(stft, x_axis='time', y_axis='hz') plt.show() # ------------------------梅尔----------------------------- plt.title('librosa.feature.mfcc') mfcc = librosa.feature.mfcc(x, n_fft=9216, n_mfcc = 20) print("梅尔") print(mfcc.shape) librosa.display.specshow(mfcc, x_axis='time', y_axis='hz') plt.show() # ------------------------梅尔对数---------------------------- plt.title('librosa.feature.melspectrogram') # hop_length 连续帧之间的样本数 melspec = librosa.feature.melspectrogram(x, 16000, n_fft=9216, hop_length=512) logmelspec = librosa.power_to_db(melspec) print("梅尔对数") print(logmelspec.shape) librosa.display.specshow(logmelspec, x_axis='time', y_axis='hz') plt.show() # ------------------------log Mel 能量---------------------------- plt.title('librosa.display.specshow') logf=logfbank(x) print("log Mel 能量") print(logf.shape) librosa.display.specshow(logf, x_axis='time', y_axis='hz') plt.show() # ------------------------光谱对比---------------------------- plt.title('librosa.feature.spectral_contrast') stft = np.abs(librosa.stft(x,n_fft=9216)) contrast=librosa.feature.spectral_contrast(S=stft, sr=16000) print("光谱对比") print(contrast.shape) librosa.display.specshow(contrast, x_axis='time', y_axis='hz') plt.show() # ------------------根据波形或功率谱图计算色谱图------------------- plt.title('librosa.feature.chroma_stft') chroma_stft=librosa.feature.chroma_stft(x,sr=16000) print("色谱图") print(chroma_stft.shape) librosa.display.specshow(chroma_stft, x_axis='time', y_axis='hz') plt.show() # ------------------恒定Q色谱图------------------- plt.title('librosa.feature.chroma_cqt') chroma_cqt=librosa.feature.chroma_cqt(x,sr=16000) librosa.display.specshow(chroma_cqt, x_axis='time', y_axis='hz') print("恒定Q色谱图") print(chroma_cqt.shape) plt.show() # ------------------色度能量归一化------------------- plt.title('librosa.feature.chroma_cens') chroma_cens=librosa.feature.chroma_cens(x,sr=16000) librosa.display.specshow(chroma_cqt, x_axis='time', y_axis='hz') print("色度能量归一化") print(chroma_cens.shape) plt.show()
import numpy as np
import librosa
import struct
import webrtcvad
from scipy.ndimage.morphology import binary_dilation
# ** a的b次方 32767
int16_max = (2 ** 15) - 1
audio_norm_target_dBFS=-30
partials_n_frames=160
sampling_rate=16000
mel_window_step = 10 # In milliseconds
mel_window_length = 25 # In milliseconds
mel_n_channels = 40
def trim_long_silences(wav,vad_window_length=30,sampling_rate=16000):
# 计算语音检测窗口大小 //为整除 30秒X16000=总帧长
samples_per_window = (vad_window_length * sampling_rate) // 1000
# 修剪音频的结尾,使其具有窗口大小的倍数。使wav的长度能被 samples_per_window整除
wav = wav[:len(wav) - (len(wav) % samples_per_window)]
# 浮点数波形转换为16位单声道PCM *:接收到的参数会形成一个元组,**:接收到的参数会形成一个字典。如下代码。
# webrtcvad 的 is_speech 接收的是buf 所以这里需要转换
pcm_wave = struct.pack("%dh" % len(wav), *(np.round(wav * int16_max)).astype(np.int16))
# 执行语音激活检测
voice_flags = []
# 这里共有三种帧长可以用到,分别是80/10ms,160/20ms,240/30ms。其它采样率
# 的48k,32k,24k,16k会重采样到8k来计算VAD。之所以选择上述三种帧长度,是因为语
# 音信号是短时平稳信号,其在10ms~30ms之间可看成平稳信号,高斯马尔科夫等比较
# 的信号处理方法基于的前提是信号是平稳的,在10ms~30ms,平稳信号处理方法是可
# 以使用的。
# 从vad的代码中可以看出,实际上,系统只处理默认10ms,20ms,30ms长度的数据,
# 其它长度的数据没有支持,笔者修改过可以支持其它在10ms-30ms之间长度的帧长度
# 发现也是可以的。
# vad检测共四种模式,用数字0~3来区分,激进程度与数值大小正相关。
# 0: Normal,1:low Bitrate, 2:Aggressive;3:Very Aggressive 可以根据实际的使用
vad = webrtcvad.Vad(mode=3)
for window_start in range(0, len(wav), samples_per_window):
window_end = window_start + samples_per_window
# append 进来的都是Boolean 这里以samples_per_windowx2 的长度去检测是否为人声
voice_flags.append(vad.is_speech(pcm_wave[window_start * 2:window_end * 2],
sample_rate=sampling_rate))
voice_flags = np.array(voice_flags)
# 声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/288656
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。