参考:《语音识别技术》、《入门语音识别》
主要内容:
chroma特征 与 CQT (Constant-Q)特征
简单示例:
load: - `y,sr = librosa.load(wav_file,sr=22050);`mfcc:- `librosa.feature.mfcc(y=y,n_mfcc=64,sr=sr,n_mels=64)`mel:- `librosa.feature.melspectrogram(y=y,sr=sr,n_mels=64)`
x , sr = librosa.load("./乌梅子酱-李荣浩.wav", sr=22050)
print(x.shape, sr)
(5672672,) 22050
d = librosa.get_duration(y=x, sr=22050, S=None, n_fft=2048, hop_length=512, center=True, filename=None)
sr = librosa.get_samplerate("./乌梅子酱-李荣浩.wav")
sr,d
(44100, 257.26403628117913)
audio_file, _ = librosa.effects.trim(x)
print('Audio File:', audio_file, '\n')
print('Audio File shape:', np.shape(audio_file))
Audio File: [-3.2841001e-04 -3.0707751e-04 -2.6176337e-04 ... 2.7146576e-052.7009228e-04 2.0527366e-05] Audio File shape: (5627904,)
# import IPython# IPython.display.Audio("./乌梅子酱-李荣浩.wav")
plt.figure(figsize=(20, 5))
librosa.display.waveplot(x, sr=sr)
plt.show()
X = librosa.stft(x)
Xdb = librosa.amplitude_to_db(abs(X))
plt.figure(figsize=(20, 5))
librosa.display.specshow(Xdb, sr=sr, x_axis='time', y_axis='hz')
plt.colorbar()
plt.show()
mfccs = librosa.feature.mfcc(y=x, sr=sr)
mfccs.shapeplt.figure(figsize=(20, 5))
librosa.display.specshow(mfccs, sr=sr, x_axis='time')
plt.colorbar()
plt.show()
n0 = 7000
n1 = 7025
plt.figure(figsize=(14, 5))
plt.plot(x[n0:n1])
plt.show()
zero_crossings = librosa.zero_crossings(x[n0:n1], pad=False)
zero_crossings.shape, zero_crossings.sum()
((25,), 1)
# 可以使用整个音频来遍历这个并推断出整个数据的过零
zcrs = librosa.feature.zero_crossing_rate(x)
print(zcrs.shape)plt.figure(figsize=(14, 5))
plt.plot(zcrs[0])
spectral_centroids = librosa.feature.spectral_centroid(x, sr=sr)[0]
spectral_centroids.shapeframes = range(len(spectral_centroids))
t = librosa.frames_to_time(frames)import sklearn
def normalize(x, axis=0):return sklearn.preprocessing.minmax_scale(x, axis=axis)plt.figure(figsize=(20, 5))
librosa.display.waveplot(x, sr=sr, alpha=0.4)
plt.plot(t, normalize(spectral_centroids), color='r')
spectral_bandwidth_2 = librosa.feature.spectral_bandwidth(x+0.01, sr=sr)[0]
spectral_bandwidth_3 = librosa.feature.spectral_bandwidth(x+0.01, sr=sr, p=3)[0]
spectral_bandwidth_4 = librosa.feature.spectral_bandwidth(x+0.01, sr=sr, p=4)[0]
plt.figure(figsize=(20, 5))
librosa.display.waveplot(x, sr=sr, alpha=0.4)
plt.plot(t, normalize(spectral_bandwidth_2), color='r')
plt.plot(t, normalize(spectral_bandwidth_3), color='g')
plt.plot(t, normalize(spectral_bandwidth_4), color='y')
plt.legend(('p = 2', 'p = 3', 'p = 4'))
spectral_rolloff = librosa.feature.spectral_rolloff(x+0.01, sr=sr)[0]
plt.figure(figsize=(20, 5))
librosa.display.waveplot(x, sr=sr, alpha=0.4)
plt.plot(t, normalize(spectral_rolloff), color='r')
chromagram = librosa.feature.chroma_stft(x, sr=sr, hop_length=512)
plt.figure(figsize=(20, 5))
librosa.display.specshow(chromagram, x_axis='time', y_axis='chroma', hop_length=512, cmap='coolwarm')
pitches, magnitudes = librosa.piptrack(y=x, sr=sr)
print(pitches)
[[0. 0. 0. ... 0. 0. 0.][0. 0. 0. ... 0. 0. 0.][0. 0. 0. ... 0. 0. 0.]...[0. 0. 0. ... 0. 0. 0.][0. 0. 0. ... 0. 0. 0.][0. 0. 0. ... 0. 0. 0.]]
chroma特征:
CQT (Constant-Q)特征:
其他
## Constant-Q transform# cqt_a = librosa.cqt(x)
cqt_a = np.abs(librosa.cqt(x))# 将幅度频谱转换为dB标度频谱。也就是对S取对数。与这个函数相反的是librosa.db_to_amplitude(S)
# 这也是我们较为常用的绘制前要做的变换
cqt_a = librosa.amplitude_to_db(cqt_a, ref=np.max)# 将功率谱(幅度平方)转换为分贝(dB)单位,与这个函数相反的是librosa.db_to_power(S)
# 与上一个一致
# cqt_a = librosa.power_to_db(cqt_a**2, ref=np.max)plt.figure(figsize=(20, 5))
librosa.display.specshow(cqt_a, sr=sr, x_axis='time', y_axis='hz')
plt.colorbar(format='%+2.0f dB')
plt.show()
## chroma cqt
chromagram = librosa.feature.chroma_cqt(x, sr=sr, hop_length=512)
plt.figure(figsize=(20, 5))
librosa.display.specshow(chromagram, x_axis='time', y_axis='chroma', hop_length=512, cmap='coolwarm')
plt.colorbar(format='%+.2f dB')
plt.show()
import warnings
warnings.filterwarnings("ignore")
import matplotlib.pyplot as plt
import numpy as np
from pydub import AudioSegment
import librosa
from librosa import display
from ffmpy import FFmpeg
def getWAV(in_path, out_path):
# ff_in_path = './test.mp4'
# ff_out_path = './test.wav'FFmpeg(inputs={in_path: None}, outputs={out_path: '-ar 22050 -ac 2 -b:a 48k -y'}).run()return out_pathdef getCQT(in_path, out_path, need_abs=False):data, sr = librosa.load(in_path) # 默认加载的sr=22050print(len(data),sr)cqt_v = librosa.cqt(y=data, sr=sr)if need_abs:# 使用np.abs将cqt复数的特征矩阵 转成负数模的形式cqt_v = np.abs(cqt_v) height, length = cqt_v.shapeprint(height, length)np.save(out_path, cqt_v)return cqt_vdef getFileInfo(in_path,fmt="wav"):# 获取音乐相关信息:(音乐时长,帧数,2.5s帧数)sound = AudioSegment.from_file(in_path, format=fmt)# durations_duration_in_milliseconds = len(sound)s_frame_count = sound.frame_count()s_frame_count_2500 = sound.frame_count(ms=2500)print('音乐时长ms:',s_duration_in_milliseconds)print('音频帧数:',s_frame_count)print('2500ms对应音频帧数:',s_frame_count_2500)return s_duration_in_milliseconds,s_frame_count,s_frame_count_2500 getWAV("./乌梅子酱-李荣浩.m4a","./乌梅子酱-李荣浩.wav")
data1 = getCQT("./乌梅子酱-李荣浩.wav","./乌梅子酱-李荣浩.npy",need_abs=True)
getFileInfo("./乌梅子酱-李荣浩.wav")
5672672 22050
84 11080
音乐时长ms: 257264
音频帧数: 5672672.0
2500ms对应音频帧数: 55125.0
def plt_show(cqt_a, sr):cqt_a = librosa.amplitude_to_db(cqt_a, ref=np.max)plt.figure(figsize=(20, 5))librosa.display.specshow(cqt_a, sr=sr, x_axis='time', y_axis='hz')plt.colorbar(format='%+2.0f dB')plt.show()plt_show(data1,22050)