【小项目-1】用Python进行人声伴奏分离和音乐特征提取

本文重点

  • Python分离音乐的伴奏和人声
  • 音频的基本特征分析和提取 (色度频谱很有意思)
  • 短时傅里叶变换的理解:理论理解,Python操作理解

一、读取音频文件

比如采样率为22050,音频文件有36s,那么x为长度为22050*36=793800的float。


#read the file

import librosa

audio_path = './test.wav'

x , sr = librosa.load(audio_path)

print(type(x), type(sr)) #sample rate(Hz)

print(x.shape, sr)

二、用Python实现音乐的人声和伴奏分离

  1. 原理和库

用到了python库 Spleeter
抽象地了解下原理吧
参考文章是这篇:Spleeter: a fast and efficient music source separation tool with pre-trained models
原理文章是这篇SINGING VOICE SEPARATION: A STUDY ON TRAINING DATA
粗略扫了一眼,原理主要是用U-Net进行分割,然后这个Python工具主要是利用了一个pre-trained的model。

  1. 运行命令
    在命令行中输入以下命令,会生成人声和伴奏文件
    spleeter separate -p spleeter:2stems -o output audio_example.mp3

三、音频特征提取

参考链接:机器之心的一篇文章

  • 波形幅度包络图

  • 谱图waterfalls

纵轴表示频率(从0到10kHz),横轴表示剪辑的时间。由于我们看到所有动作都发生在频谱的底部,我们可以将频率轴转换为对数轴。

可以对频率取对数。

  • 过零率:每帧中,语音信号通过零点( 从正变为负或从负变为正)的次数

感觉这个参数蛮有意思的

n0 = 9000
n1 = 9100
zero_crossings = librosa.zero_crossings(x[n0:n1], pad=False)
print(sum(zero_crossings))
  • 色度频率

整个频谱被投影到12个区间,代表音乐八度音的12个不同的半音(或色度),librosa.feature.chroma_stft用于计算。

  • 频谱图

先对音频进行短时傅里叶变换

X = librosa.stft(x)

其中每行存储一个窗口的STFT,大小为1025*1551

这里要注意理解怎么基于stft的结果来画频谱图


Xdb = librosa.amplitude_to_db(abs(X))

plt.figure(figsize=(14, 5))

librosa.display.specshow(Xdb, sr=sr, x_axis='time', y_axis='hz')

plt.colorbar()
  • 光谱质心

它指示声音的“质心”位于何处,并计算为声音中存在的频率的加权平均值。如果有两首歌曲,一首来自布鲁斯类型,另一首属于金属。与长度相同的布鲁斯流派歌曲相比,金属歌曲在最后有更多的频率。因此,布鲁斯歌曲的光谱质心将位于其光谱中间附近,而金属歌曲的光谱质心将朝向它的末端。

没太了解,感觉就大概知道有这么个量可以用到就行。

librosa.feature.spectral_centroid计算信号中每帧的光谱质心:

spectral_centroids = librosa.feature.spectral_centroid(x, sr=sr)[0]
spectral_centroids.shape
# Computing the time variable for visualization
frames = range(len(spectral_centroids))
t = librosa.frames_to_time(frames)
# Normalising the spectral centroid for visualisation
def normalize(x, axis=0):
    return sklearn.preprocessing.minmax_scale(x, axis=axis)
#Plotting the Spectral Centroid along the waveform
librosa.display.waveplot(x, sr=sr, alpha=0.4)
plt.plot(t, normalize(spectral_centroids), color='r')

四、STFT:短时傅里叶变换

1. 先理解连续傅里叶变换

image

2. 再理解离散傅里叶变换
对连续函数进行离散采样

image

3. 最后进入短时傅里叶变换
是先把一个函数和窗函数进行相乘,然后再进行一维的傅里叶变换。并通过窗函数的滑动得到一系列的傅里叶变换结果,将这些结果竖着排开得到一个二维的表象。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容