Анализ аудио и музыки в реальном времени с помощью бесплатной библиотеки Python
Aubio — это библиотека Python с открытым исходным кодом для обработки аудио, используемая разработчиками программного обеспечения для определения высоты тона, отслеживания ударов, извлечения MFCC и обработки аудио в реальном времени.
Что такое Aubio?
Современные аудио‑приложения — такие как инструменты для музыкального производства, платформы аудио‑анализа и системы обработки звука в реальном времени — требуют эффективных способов анализа звуковых сигналов. Одним из популярных решений с открытым исходным кодом для этой задачи является Aubio, лёгкая, но мощная библиотека, предназначенная для извлечения значимой информации из аудиосигналов. Aubio — это библиотека с открытым исходным кодом, разработанная для получения аннотаций и музыкальных характеристик из аудиосигналов. Она анализирует аудиопотоки и определяет события, такие как начала нот, высота тона, удары и темп. Библиотека написана преимущественно на C для высокой производительности и работает на Linux, macOS и Windows.
Библиотека очень проста в использовании и поддерживает обработку аудио в реальном времени. Она может обнаруживать музыкальные события, такие как удар барабана, частоту музыкальной ноты и темп или ритм трека. Она может работать как офлайн (аудиофайлы), так и в потоках аудио в реальном времени, что делает её подходящей для аудио‑редакторов, цифровых инструментов и инструментов анализа звука. Поддерживая определение высоты тона, отслеживание битов, обнаружение онсетов, извлечение MFCC и обработку сигналов в реальном времени, она предоставляет разработчикам инструменты, необходимые для создания продвинутых аудио‑приложений.
Начало работы с Aubio
Самый простой способ установить Aubio — использовать Python Package Index (PyPI). Пожалуйста, выполните следующую команду для полной установки.
Установить с помощью Aubio
pip install aubio Установить Aubio с GitHub
go get -u github.com/aubio/aubio.git Обнаружение начала звука с помощью Python
Одной из самых полезных функций библиотеки Aubio является обнаружение атак (onset detection), которое определяет, когда начинается музыкальная нота или звуковое событие. Обнаружение атак находит точный момент, когда появляется новый звук или музыкальная нота. В музыке «атака» (onset) — это начало ноты — мгновение, когда ударяется барабан, щипается гитара или голос начинает слог. Aubio включает несколько алгоритмов обнаружения атак для разных случаев использования. Ниже приведён пример, демонстрирующий, как обнаруживать атаки в аудиофайле с помощью кода на Python.
Как обнаружить начала нот в аудиофайле с помощью библиотеки Python?
import aubio
import numpy as np
# Configuration
filename = "audio_sample.wav"
win_s = 512 # FFT window size
hop_s = 256 # Hop size (frames between analysis windows)
# Open the audio source
src = aubio.source(filename, hop_size=hop_s)
samplerate = src.samplerate
# Create the onset detector (using 'complex' method)
onset = aubio.onset("complex", win_s, hop_s, samplerate)
# Set detection threshold (0.0 to 1.0 — lower = more sensitive)
onset.set_threshold(0.3)
onsets = []
# Process audio frame by frame
while True:
samples, read = src() # Read one hop of audio
if onset(samples): # Returns True when onset detected
print(f"Onset at: {onset.get_last_s():.3f} seconds")
onsets.append(onset.get_last_s())
if read < hop_s: # End of file
break
print(f"\nTotal onsets detected: {len(onsets)}")
Поддержка определения высоты тона
Определение высоты тона — ещё одна важная возможность открытой библиотеки Aubio. Определение высоты тона выявляет фундаментальную частоту (F0) звука — по сути, «какая это музыкальная нота?». Это основа любого тюнера, извлекателя мелодии или инструмента вокального анализа. Aubio поддерживает несколько алгоритмов определения высоты тона, таких как yin, yinfft, mcomb, fcomb и др. Ниже приведён простой пример, демонстрирующий, как выполнять определение высоты тона в реальном времени в приложениях на Python.
Как выполнить определение высоты тона в реальном времени с помощью Python?
import aubio
import numpy as np
samplerate = 44100
win_s = 1024
hop_s = 512
pitch_o = aubio.pitch("yin", win_s, hop_s, samplerate)
pitch_o.set_unit("Hz")
pitch_o.set_silence(-40)
samples = np.random.rand(hop_s).astype(np.float32)
pitch = pitch_o(samples)
print("Detected pitch:", pitch)
Отслеживание темпа и обнаружение ударов с помощью Python
Открытая библиотека Aubio может анализировать ритмические шаблоны и обнаруживать удары и темп в музыке внутри приложений на Python. Aubio может прослушивать аудио и «отбивать» — определяя темп в BPM (ударов в минуту) и точно фиксируя отдельные метки времени ударов. Это бесценно для всего, от DJ‑программ до синхронизации музыки. Библиотека определяет места ударов, анализируя спектральные изменения и ритмические шаблоны в аудиосигнале.
Чтение и запись звуковых файлов с помощью Python
Библиотека Aubio для Python оборачивает ввод‑вывод аудиофайлов через свои объекты source и sink, поддерживая множество форматов (WAV, FLAC, OGG, MP3 через libav или ffmpeg) и автоматически обрабатывая преобразование частоты дискретизации. Ниже приведён простой пример, показывающий, как разработчики могут выполнять чтение, обработку и запись аудиофайлов с помощью команд Python.
Как читать, обрабатывать и записывать аудиофайлы с помощью Python?
import aubio
import numpy as np
input_file = "input.wav"
output_file = "output.wav"
target_samplerate = 22050 # Downsample to 22.05 kHz
hop_s = 512
# Open source — resamples automatically to target samplerate
src = aubio.source(input_file, samplerate=target_samplerate, hop_size=hop_s)
actual_sr = src.samplerate
num_channels = src.channels
# Open sink for writing
sink = aubio.sink(output_file, actual_sr, channels=1)
while True:
samples, read = src()
# Write mono (sink expects 1D array for mono output)
if num_channels > 1:
mono = samples.reshape(num_channels, -1).mean(axis=0)
else:
mono = samples
sink(mono[:read], read)
if read < hop_s:
break
del sink # Flushes and closes file
print(f"Written {output_file} at {actual_sr} Hz")