python检测音乐开始实现方法是什么?在音乐术语中,开始是指音符或其他声音的开始。在这篇文章中,我们将看看如何使用 Python 的音频信号处理库Aubio和librosa检测音乐开始。
python如何检测音乐开始?即使你的应用程序不使用 Python,本教程也是相关的 - 例如,你正在使用 Unity 和 C# 构建游戏,该游戏没有用于开始检测的强大库。
如果是这种情况,你可以将检测到的开始时间戳导出到文本文件,以读入你选择的引擎。
如果你更喜欢视频教程而不是文章,这里是本教程的python检测音乐开始示例。
音乐开始检测的应用
我在构建节奏游戏时遇到了这种音乐开始检测技术,并希望有一种方法可以为任何歌曲自动生成节拍图。
python检测音乐开始示例:除了构建节奏游戏外,这种技术还有很多其他应用。
例如,检测开始通常是音乐信息检索和分析的第一步。
另一个例子可能是我们正在构建一个有战斗场景的游戏。我们可能会检测到 BGM 中的开始并在每次开始时产生一个敌人。这可以在我们的游戏中创建独特的节奏。
python如何检测音乐开始?我将演示如何检测音乐开始之后使用两种不同的Python包音频信号处理,Aubio和librosa。这两个软件包都非常准确地检测到发作。细微的差别是 librosa 适用于OGG格式,而 Aubio 不适用。
如何搭建开发环境
python检测音乐开始实现方法?我们将在虚拟环境中安装我们的软件包。
在命令行中,我们创建一个名为python-aubio-librosa
如下的虚拟环境。-m
代表module
.
$ python3 -m venv python-aubio-librosa
然后我们激活虚拟环境:
$ . python-aubio-librosa/bin/activate
请注意,如果你尝试使用以下命令激活环境,则会出现错误:
$ ./python-aubio-librosa/bin/activate
-bash: ./python-aubio-librosa/bin/activate: Permission denied
一旦你的环境被激活,环境名称将显示在括号中:
(python-aubio-librosa) $ ...
我们可以检查,如果我们调用python
或pip
,被调用的程序将是我们虚拟环境中的程序,而不是系统级程序。
如果我们还没有激活我们的环境,输出将指向系统级程序。
$ which python
/usr/bin/python
$ which pip
/usr/local/bin/pip
一旦我们激活了我们的环境,输出将指向本地环境。
(python-aubio-librosa) $ which python
/Users/USERNAME/Desktop/python-aubio-librosa/bin/python
(python-aubio-librosa) $ which pip
/Users/USERNAME/Desktop/python-aubio-librosa/bin/pip
python检测音乐开始示例:如何安装和使用 Aubio?
我们将通过pip
以下方式安装 Aubio :
(python-aubio-librosa) $ pip install aubio
python如何检测音乐开始?我们将用于生成以秒为单位的浮点数形式的开始时间戳列表的函数如下。该函数来自 Aubio 的官方文档,因此我们可以直接使用它,而无需了解音频信号处理中的细节(如 FFT、Fast-Fourier Transformations)。
from aubio import source, onset
def get_onset_times(file_path):
window_size = 1024 # FFT size
hop_size = window_size // 4
sample_rate = 0
src_func = source(file_path, sample_rate, hop_size)
sample_rate = src_func.samplerate
onset_func = onset('default', window_size, hop_size)
duration = float(src_func.duration) / src_func.samplerate
onset_times = [] # seconds
while True: # read frames
samples, num_frames_read = src_func()
if onset_func(samples):
onset_time = onset_func.get_last_s()
if onset_time < duration:
onset_times.append(onset_time)
else:
break
if num_frames_read < hop_size:
break
return onset_times
然后,我们编写了一个main
函数,它接收音频文件的路径,并将开始时间戳输出到一个文件中,保留每个浮点数的前四位小数,每行一个浮点数。
def main():
file_path = '../game/audio/my-music.mp3'
onset_times = get_onset_times(file_path)
# remove extension, .mp3, .wav etc.
file_name_no_extension, _ = os.path.splitext(file_path)
output_name = file_name_no_extension + '.beatmap.txt'
with open(output_name, 'wt') as f:
f.write('\n'.join(['%.4f' % onset_time for onset_time in onset_times]))
让我们从命令行调用脚本。Aubio 可能会提出关于准确性的警告,但我的实验表明 Aubio 仍然非常准确。
(python-aubio-librosa) $ python generate_beatmap_aubio.py
[mp3 @ 0x7fe671031e00] Estimating duration from bitrate, this may be inaccurate
示例输出文件如下所示。对于 15 秒的短音乐片段,Aubio 检测到 26 个开始。这些是我们可以用于我们的应用程序的时间戳。
这就是奥比奥。
如何安装和使用 Librosa
与 Aubio 类似,我们也将通过pip
以下方式安装 librosa :
(python-aubio-librosa) $ pip install librosa
与 Aubio 相比,librosa 的库方法更易于使用。librosa.load
返回一个 NumPy 数组x
和一个采样率sr
,我们将其传递给以librosa.onset.onset_detect
获取起始帧列表。
python检测音乐开始示例:最后,我们将起始帧转换为起始时间戳,并将每个时间戳写入输出文件,就像我们为 Aubio 所做的那样。
import librosa
def main():
file_path = '../game/audio/my-music.ogg'
x, sr = librosa.load(file_path)
onset_frames = librosa.onset.onset_detect(x, sr=sr, wait=1, pre_avg=1, post_avg=1, pre_max=1, post_max=1)
onset_times = librosa.frames_to_time(onset_frames)
# remove extension, .mp3, .wav etc.
file_name_no_extension, _ = os.path.splitext(file_path)
output_name = file_name_no_extension + '.beatmap.txt'
with open(output_name, 'wt') as f:
f.write('\n'.join(['%.4f' % onset_time for onset_time in onset_times]))
输出文件的格式与上面显示的 Aubio 格式相同。
结论
感谢你的阅读,我希望你已准备好将这种起始检测技术应用于你的下一个项目。🎶
python如何检测音乐开始?作为 Aubio 和 Librosa 之间差异的回顾,根据我的实验,两者都非常准确地检测了发作。
Aubio 在音频文件格式方面受到更多限制:它会发出有关 MP3 文件准确性的警告,并且不处理 OGG 文件。
python检测音乐开始实现方法:另一方面,Librosa 能够处理最常见的音频文件格式:MP3、OGG、FLAC 和 M4A。Librosa 的库界面也比 Aubio 更容易使用,特别是对于我们这些不是信号处理专业人士的人。