⚠申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址。 全文共计3077字,阅读大概需要3分钟
🌈更多学习内容, 欢迎👏关注👀【文末】我的个人微信公众号:不懂开发的程序猿
个人网站:https://jerry-jy.co/❗❗❗知识付费,🈲止白嫖,有需要请后台私信或【文末】个人微信公众号联系我
语音识别---节拍器
- 节拍器
- 一、任务需求
- 二、任务目标
- 1、掌握clicks轨迹
- 2、掌握动态编程节拍跟踪器函数
- 三、任务环境
- 1、jupyter开发环境
- 2、python3.6
- 3、tensorflow2.4
- 四、任务实施过程
- 1、加载工具和数据
- 2、观察数据
- 3、生成节奏
- 4、绘制节拍器
- 5、节拍器演示
- 五、任务小结
- 说明
节拍器
一、任务需求
在本实验中,我们将根据给出的音乐,生成与之对应的节拍器。
生成节拍器最关键的函数是librosa.clicks和librosa.beat.beat_track。
要求:利用librosa.clicks和librosa.beat.beat_track实现节拍器功能。
二、任务目标
1、掌握clicks轨迹
2、掌握动态编程节拍跟踪器函数
三、任务环境
1、jupyter开发环境
2、python3.6
3、tensorflow2.4
四、任务实施过程
在本实验中,我们将根据给出的音乐,生成与之对应的节拍器。
生成节拍器最关键的函数是librosa.clicks
和librosa.beat.beat_track
,librosa.clicks
函数专门用来生成clicks轨迹,其参数如下:
- times: 每秒放置clicks次数
- frames: 用于放置clicks的帧索引
- sr: 采样率
- length: 输出信号所需样本数
- click_freq: 默认clicks信号的频率(以赫兹为单位)。默认为 1KHz
- click_duration: 默认clicks信号的持续时间(以秒为单位)。默认值为 100 毫秒。
函数返回值为合成clicks信号
而librosa.beat.beat_track
则是动态编程节拍跟踪器函数
1、加载工具和数据
import librosa
import librosa.display
import numpy as np
import IPython.display as ipd
import matplotlib.pyplot as plt
读取并播放音频,这是一段Drum-bass(某种鼓)的音乐
# 检测beat事件
y, sr = librosa.load('/home/jovyan/datas/admiralbob77_-_Choice_-_Drum-bass.ogg', duration=10)
ipd.Audio(y,rate=sr)
2、观察数据
在生成节拍器之前,我们先来查看波形图
plt.figure(figsize=(12,3))
librosa.display.waveshow(y,sr)
<librosa.display.AdaptiveWaveplot at 0x7f7923993cf8>
从波形图上,可以看出这段音频应该存在一定的节奏,接下来我们就要用librosa.beat.beat_track
来生成节奏,这是一个动态编程节拍跟踪器函数。生成节奏以后,使用librosa.clicks
来合成节奏。
3、生成节奏
# 使用beat_track生成节奏
tempo, beats = librosa.beat.beat_track(y=y, sr=sr)
y_beats = librosa.clicks(frames=beats, sr=sr)
查看一下beats
,显然,这是节奏所在的帧序号
beats
array([ 3, 21, 40, 59, 78, 96, 116, 135, 154, 173, 192, 211, 230,
249, 268, 287, 306, 325, 344, 363])
或者通过下面这种方法产生和y长度相同的信号
y_beats_len = librosa.clicks(frames=beats, sr=sr, length=len(y))
或者使用计时而不是帧索引生成节奏信号(将帧转换为计时)
times = librosa.frames_to_time(beats, sr=sr)
y_beat_times = librosa.clicks(times=times, sr=sr)
或使用880Hz的点击频率和500ms的采样生成节奏信号
y_beat_times880 = librosa.clicks(times=times, sr=sr,
click_freq=880, click_duration=0.5)
4、绘制节拍器
我们可以将生成的节奏波形图绘制出来,方便你对不同节拍器进行区别。
# 绘制不同的节拍器
fig, ax = plt.subplots(nrows=4, sharex=True,figsize=(12,6))
librosa.display.waveshow(y_beats, sr=sr, label='y_beats', ax=ax[0],x_axis=None)
librosa.display.waveshow(y_beats_len, sr=sr, label='y_beats_len', ax=ax[1],x_axis=None)
librosa.display.waveshow(y_beat_times, sr=sr, label='y_beat_times', ax=ax[2],x_axis=None)
librosa.display.waveshow(y_beat_times880, sr=sr, label='y_beat_times880', ax=ax[3])
[ax[i].legend() for i in range(4)];
当然,我们还可以将原始音频的频谱图和节拍器波形图放在一起比较
import matplotlib.pyplot as plt
fig, ax = plt.subplots(nrows=2, sharex=True)
S = librosa.feature.melspectrogram(y=y, sr=sr)
# 绘制频谱图
librosa.display.specshow(librosa.power_to_db(S, ref=np.max),
x_axis='time', y_axis='mel', ax=ax[0])
# 绘制波形图
librosa.display.waveshow(y_beats_len, sr=sr, label='Beat clicks',
ax=ax[1])
ax[1].legend()
ax[0].label_outer()
ax[0].set_title(None);
5、节拍器演示
我们也可以听一听生成的节拍器
ipd.Audio(y_beats_len,rate=sr)
也可以把音频和节拍器组合在一起,需要注意这是一个双声道音频
two_channel = np.vstack((y,y_beats_len))
ipd.Audio(two_channel,rate=sr)
将双声道音频转换为单声道音频,也许能帮助你更好的理解节拍器
ipd.Audio(librosa.to_mono(two_channel),rate=sr)
五、任务小结
本实验中,我们 通过librosa节拍器函数生成节拍,并找到节拍对应的位置。
然后使用可视化工具将节拍绘制出来,并将节拍器通过音频播放出来。
–end–
说明
本实验(项目)/论文若有需要,请后台私信或【文末】个人微信公众号联系我