⚠申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址。 全文共计3077字,阅读大概需要3分钟
🌈更多学习内容, 欢迎👏关注👀【文末】我的个人微信公众号:不懂开发的程序猿
个人网站:https://jerry-jy.co/❗❗❗知识付费,🈲止白嫖,有需要请后台私信或【文末】个人微信公众号联系我
语音识别之其他谱图
- 其他谱图
- 一、任务需求
- 二、任务目标
- 1、掌握梅尔频谱图
- 2、掌握音名修饰
- 3、掌握Chroma特征表示
- 4、掌握音符表示
- 5、掌握非谱数据可视化
- 6、掌握颜色映射方法
- 三、任务环境
- 1、jupyter开发环境
- 2、python3.6
- 3、tensorflow2.4
- 四、任务实施过程
- 1、梅尔频谱图
- 2、音符名修饰的频谱图
- 3、Chroma特征表示
- 4、音符
- 5、非谱数据可视化
- 6、颜色映射
- 五、任务小结
- 说明
其他谱图
一、任务需求
常见的谱图,除了频谱图以外,还包含很多其他类型,例如 梅尔频谱, constant-Q, variable-Q, 色谱图, 时频图 等等。在本实验中,我们将学习了解这些频谱图。
要求:学习梅尔频谱图,Chroma特征表示等其他谱图展现方式
二、任务目标
1、掌握梅尔频谱图
2、掌握音名修饰
3、掌握Chroma特征表示
4、掌握音符表示
5、掌握非谱数据可视化
6、掌握颜色映射方法
三、任务环境
1、jupyter开发环境
2、python3.6
3、tensorflow2.4
四、任务实施过程
加载工具和数据
import numpy as np
import matplotlib.pyplot as plt
import librosa
import librosa.display
y, sr = librosa.load('/home/jovyan/datas/sorohanro_-_solo-trumpet-06.ogg')
对音频数据做短时傅里叶变换
# 短时傅里叶变换
D = librosa.stft(y)
S_db = librosa.amplitude_to_db(np.abs(D), ref=np.max)
1、梅尔频谱图
fig, ax = plt.subplots()
# 获取梅尔倒谱系数
M = librosa.feature.melspectrogram(y=y, sr=sr)
# 将功率转化为分贝
M_db = librosa.power_to_db(M, ref=np.max)
# 绘制频谱图
img = librosa.display.specshow(M_db, y_axis='mel', x_axis='time', ax=ax)
ax.set(title='Mel spectrogram display')
fig.colorbar(img, ax=ax, format="%+2.f dB")
上图展示的是梅尔频谱图,并将功率谱转换为db,其纵坐标刻度为对数刻度。
2、音符名修饰的频谱图
可以使用频率 (Hz) 或它们在科学音高符号中的音符名称来修饰频谱图,如下:
C = librosa.cqt(y=y, sr=sr)
# 将振幅转化为分贝
C_db = librosa.amplitude_to_db(np.abs(C), ref=np.max)
fig, ax = plt.subplots()
# 绘制指数坐标频谱图
librosa.display.specshow(C_db, y_axis='cqt_hz', x_axis='time', ax=ax)
ax.set(title='Frequency (Hz) axis decoration')
fig, ax = plt.subplots()
# 绘制音名频谱图
librosa.display.specshow(C_db, y_axis='cqt_note', x_axis='time', ax=ax)
ax.set(title='Pitch axis decoration')
[Text(0.5, 1.0, ‘Pitch axis decoration’)]
留意第二个谱图的纵坐标,被替换为八度的音高符号,在这种情况下,底层数据表示仍以 Hz 为单位;仅更改刻度标签。
3、Chroma特征表示
所谓chroma,是指一个八度中的十二个音级(对应钢琴的七个白键音符及之间的五个黑键)。
Chroma特征表示没有固定的频率轴,而是汇总与给定音级对应的所有频率的信息。specshow 也可以绘制这些:
# 获取chroma特征表示
chroma = librosa.feature.chroma_cqt(y=y, sr=sr)
fig, ax = plt.subplots()
img = librosa.display.specshow(chroma, y_axis='chroma', x_axis='time', ax=ax)
ax.set(title='Chromagram demonstration')
fig.colorbar(img, ax=ax)
现在我们将频谱纵坐标转换为音名格式,由于音名是离散的,因此我们看到的频谱图就是一个一个小格子的样子。
4、音符
如果您还碰巧知道正在分析的乐曲的调,您可以将其传递给 specshow,它会正确拼写音符:
fig, ax = plt.subplots()
# 将频谱图Y轴设置为音调
img = librosa.display.specshow(chroma, y_axis='chroma', x_axis='time',
key='Eb:maj', ax=ax)
ax.set(title='Chromagram explicitly in Eb:maj')
fig.colorbar(img, ax=ax)
如你所见,这其实和Chroma特征表示没什么区别,只不过把纵坐标换成了更常见的乐谱的调。
5、非谱数据可视化
specshow 也可用于不完全是光谱时间的数据。一种常见的应用是递归(自相似性)图,它是逐时间呈现的,如下图所示。
R = librosa.segment.recurrence_matrix(chroma, mode='affinity')
fig, ax = plt.subplots()
# 绘制自相关图
img = librosa.display.specshow(R, y_axis='time', x_axis='time', ax=ax)
ax.set(title='Recurrence / self-similarity')
fig.colorbar(img, ax=ax)
请注意我们对两个轴标签都使用了“时间”。它显示了一个时序数据(声音)之间的自相关关系。
本质上,这只是一个矩阵而已,因此,任何支持的模式均可用于任一轴,我们还可以绘制每个轴上带有色度装饰的色度协方差图:
ccov = np.cov(chroma)
fig, ax = plt.subplots()
img = librosa.display.specshow(ccov, y_axis='chroma', x_axis='chroma',
key='Eb:maj', ax=ax)
ax.set(title='Chroma covariance')
fig.colorbar(img, ax=ax)
<matplotlib.colorbar.Colorbar at 0x7f16a1f5eda0>
某些图(例如协方差、自相似性)在specshow中会自动平方。可以通过传递auto_scale=False参数来取消。
6、颜色映射
在specshow
中,颜色可以自动设置,自动颜色映射遵循的逻辑如下:
- 数据是布尔值,则使用黑白
- 数据是(大部分)正数或(大部分)负数,使用序列颜色,就是上面常见的颜色条。默认颜色条为
magma
- 如果数据同时包含正值和负值,请使用离散颜色图。
我们可以通过设置cmap
参数来手动指定颜色映射。
fig, ax = plt.subplots()
# 修改频谱图的颜色映射
img = librosa.display.specshow(S_db, cmap='gray_r', y_axis='log', x_axis='time', ax=ax)
ax.set(title='Inverted grayscale')
fig.colorbar(img, ax=ax, format="%+2.f dB")
specshow使用matplotlib.pyplot.pcolormesh
生成底层图像。因此pcolormesh 的任何参数都可以传递给specshow使用,例如,设置颜色的最小和最大值范围,明确界限。当将离散的颜色图以 0(或其他值)为中心时,这会很有帮助。
max_var = np.max(np.abs(ccov))
fig, ax = plt.subplots()
img = librosa.display.specshow(ccov, vmin=-max_var, vmax=max_var,
y_axis='chroma', x_axis='chroma',
key='Eb:maj', ax=ax)
ax.set(title='Chroma covariance')
fig.colorbar(img, ax=ax)
<matplotlib.colorbar.Colorbar at 0x7f17f5954828>
此时我们相当于使用librosa的频谱图绘制了一张热力图。
五、任务小结
本实验中,我们学习了多种其他谱图的绘制方法及修饰方法,具体而言,包括:
1、掌握梅尔频谱图
2、掌握音名修饰
3、掌握Chroma特征表示
4、掌握音符表示
5、掌握非谱数据可视化
6、掌握颜色映射方法
–end–
说明
本实验(项目)/论文若有需要,请后台私信或【文末】个人微信公众号联系我