⚠申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址。 全文共计3077字,阅读大概需要3分钟 更多学习内容, 欢迎关注【文末】我的个人微信公众号:不懂开发的程序猿 个人网站:https://jerry-jy.co/

❗❗❗知识付费,止白嫖,有需要请后台私信或【文末】个人微信公众号联系我

语音识别之线性频谱图

线性频谱图一、任务需求二、任务目标1、掌握频谱图绘制方法2、掌握频谱图装饰方法3、学习修改频谱图轴刻度4、学习更改频谱图分析参数

三、任务环境1、jupyter开发环境2、python3.63、tensorflow2.4

四、任务实施过程1、频谱图2、装饰频谱图3、更改轴刻度4、更改分析参数

五、任务小结

说明

线性频谱图

一、任务需求

本实验深入演示specshow 可以做的所有事情,包括生成多种时、频域(spectro-temporal)数据的可视化。

librosa 的所有绘图函数都依赖于 matplotlib。因此在这里导入 matplotlib 的 pyplot API是有帮助的。

要求:利用librosa生成频谱图

二、任务目标

1、掌握频谱图绘制方法

2、掌握频谱图装饰方法

3、学习修改频谱图轴刻度

4、学习更改频谱图分析参数

三、任务环境

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')

1、频谱图

首先我们要显示一个普通的(线性)频谱图。我们将通过首先计算短时傅立叶变换,然后将幅度映射到分贝尺度来做到这一点。

# 短时傅里叶变换

D = librosa.stft(y)

S_db = librosa.amplitude_to_db(np.abs(D), ref=np.max)

matplotlib有两种主要的绘图方式,pyplot接口和面向对象接口,这两种方式librosa都支持。

接下来我们演示pyplot接口:

plt.figure()

# 绘制频谱图

librosa.display.specshow(S_db)

# 添加颜色条

plt.colorbar()

上图展示了一段声音对应的db频谱图,注意他的数值是负数,这和我们通常理解的分贝不同,音频分析中的db“参照点”不同寻常理解的分贝。

音频分析通常采用满刻度电平,0dBFS(0dB Full Scale),即把16bit采样的±32767允许的最大值作为0dB,这就是参考点。

也就是把有可能出现“数字过载”的临界点作为参照点,在这样的标准下,大多数的实际电平自然都是负值。

然后是面向对象接口

fig, ax = plt.subplots()

img = librosa.display.specshow(S_db, ax=ax)

fig.colorbar(img, ax=ax)

如你所见,两个图形其实是相同的,但它们使用不同的编程接口来构建。

大多数人都会认为 pyplot 界面学起来更快,但面向对象的界面对于复杂的图形可能更灵活一些。

对于本实验的其余部分,我们将使用面向对象的接口。

2、装饰频谱图

上一步表达了频谱图的基本内容,但缺少轴标签。没有这些信息,读者就不可能知道如何解释可视化结论。specshow 提供了许多工具来自动装饰绘图的轴。对于上图,x 轴对应于时间,y 轴对应于由离散傅立叶变换产生的线性间隔频率。我们可以告诉 specshow 相应地轴标签:

fig, ax = plt.subplots()

img = librosa.display.specshow(S_db, x_axis='time', y_axis='linear', ax=ax)

ax.set(title='Now with labeled axes!')

fig.colorbar(img, ax=ax, format="%+2.f dB")

看起来好多了,我们还在颜色条中添加了格式字符串,以便读者了解如何读取色标。

3、更改轴刻度

线性频率标度有时很有用,但通常很难阅读。或者,通常使用对数频率轴。这样做的好处是每个八度音程都占据恒定的垂直范围。

我们可以告诉 specshow 使用对数缩放频率轴,就像上面一样:

fig, ax = plt.subplots()

# 修改为指数坐标

img = librosa.display.specshow(S_db, x_axis='time', y_axis='log', ax=ax)

# 添加标题

ax.set(title='Using a logarithmic frequency axis')

fig.colorbar(img, ax=ax, format="%+2.f dB")

现在纵坐标轴被转换为对数标签,这样做的好处在于音程变成了线性的,例如国际标准音A440,它的下一个八度起始位置是880,再下一个八度是1760。这样指数增加的音程,在现在的坐标轴上,总是等距的。

4、更改分析参数

librosa 使用的默认参数设置(例如,sr=22050、hop_length=512等)可能不适用于每个信号。如果您更改参数的默认值,例如在计算 STFT 时,您可以将相同的参数传递给specshow。这可确保正确计算轴刻度(例如时间或频率)。

例如,在下面的示例中,我们将hop_length设置为256,n_fft设置为4096.

fig, ax = plt.subplots()

D_highres = librosa.stft(y, hop_length=256, n_fft=4096)

S_db_hr = librosa.amplitude_to_db(np.abs(D_highres), ref=np.max)

# 绘制频谱图,横坐标时间,纵坐标指数坐标

img = librosa.display.specshow(S_db_hr, hop_length=256, x_axis='time', y_axis='log',

ax=ax)

ax.set(title='Higher time and frequency resolution')

fig.colorbar(img, ax=ax, format="%+2.f dB")

hop_length决定了相邻两帧之间不重叠的音频样本数量。

五、任务小结

本实验完成了specshow 生成频谱图。通过本实验我们学习到了包括生成多种时、频域(spectro-temporal)数据的可视化的相关知识,需要掌握以下知识点:

掌握频谱图绘制方法掌握频谱图装饰方法学习修改频谱图轴刻度学习更改频谱图分析参数

–end–

说明

本实验(项目)/论文若有需要,请后台私信或【文末】个人微信公众号联系我

推荐链接

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。