Phân tích âm thanh và âm nhạc thời gian thực qua thư viện Python miễn phí
Aubio là một thư viện xử lý âm thanh Python mã nguồn mở được các nhà phát triển phần mềm sử dụng cho việc phát hiện cao độ, theo dõi nhịp, trích xuất MFCC và xử lý âm thanh thời gian thực.
Aubio là gì?
Các ứng dụng âm thanh hiện đại—như công cụ sản xuất nhạc, nền tảng phân tích âm thanh và hệ thống xử lý âm thanh thời gian thực—đòi hỏi các phương pháp hiệu quả để phân tích tín hiệu âm thanh. Một giải pháp mã nguồn mở phổ biến cho mục đích này là Aubio, một thư viện nhẹ nhưng mạnh mẽ được thiết kế để trích xuất thông tin có ý nghĩa từ tín hiệu âm thanh. Aubio là một thư viện mã nguồn mở được thiết kế để trích xuất các chú thích và đặc trưng âm nhạc từ tín hiệu âm thanh. Nó phân tích luồng âm thanh và xác định các sự kiện như điểm bắt đầu nốt nhạc, cao độ, nhịp và tempo. Nó được viết chủ yếu bằng C để đạt hiệu năng cao và hoạt động trên Linux, macOS và Windows.
Thư viện rất dễ sử dụng và hỗ trợ xử lý âm thanh thời gian thực. Thư viện có thể phát hiện các sự kiện âm nhạc như khi một cú trống được đánh, tần số của một nốt nhạc và tempo hoặc nhịp điệu của một bản nhạc. Nó có thể hoạt động cả ở chế độ ngoại tuyến (tệp âm thanh) và trong các luồng âm thanh thời gian thực, làm cho nó phù hợp cho các trình chỉnh sửa âm thanh, nhạc cụ kỹ thuật số và công cụ phân tích âm thanh. Với hỗ trợ phát hiện cao độ, theo dõi nhịp, phát hiện khởi đầu, trích xuất MFCC và xử lý tín hiệu thời gian thực, nó cung cấp cho các nhà phát triển các công cụ cần thiết để xây dựng các ứng dụng âm thanh tiên tiến.
Bắt đầu với Aubio
Cách dễ nhất để cài đặt Aubio là sử dụng Python Package Index (PyPI). Vui lòng sử dụng lệnh sau để cài đặt đầy đủ.
Cài đặt bằng Aubio
pip install aubio Cài đặt Aubio từ GitHub
go get -u github.com/aubio/aubio.git Phát hiện onset bằng Python
Một trong những tính năng hữu ích nhất của thư viện Aubio là phát hiện onset, cho phép xác định khi nào một nốt nhạc hoặc sự kiện âm thanh bắt đầu. Phát hiện onset tìm ra khoảnh khắc chính xác mà một âm thanh hoặc nốt nhạc mới bắt đầu. Trong âm nhạc, "onset" là phần tấn công của một nốt — ngay khi một chiếc trống được đánh, một cây guitar được gảy, hoặc giọng nói bắt đầu một âm tiết. Aubio bao gồm nhiều thuật toán phát hiện onset cho các trường hợp sử dụng khác nhau. Ví dụ sau đây minh họa cách phát hiện Onset trong một tệp âm thanh bằng mã Python.
Cách phát hiện các điểm bắt đầu trong tệp âm thanh bằng thư viện 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)}")
Hỗ trợ phát hiện cao độ
Phát hiện cao độ là một khả năng quan trọng khác của thư viện Aubio mã nguồn mở. Phát hiện cao độ xác định tần số cơ bản (F0) của một âm thanh — về cơ bản, "đây là nốt nhạc nào?" Đây là cốt lõi của bất kỳ bộ chỉnh âm, bộ trích xuất giai điệu, hoặc công cụ phân tích giọng hát nào. Aubio hỗ trợ nhiều thuật toán phát hiện cao độ như yin, yinfft, mcomb, fcomb, v.v. Dưới đây là một ví dụ đơn giản minh họa cách thực hiện phát hiện cao độ theo thời gian thực trong các ứng dụng Python.
Cách thực hiện phát hiện cao độ thời gian thực bằng 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)
Theo dõi tempo và phát hiện nhịp bằng Python
Thư viện mã nguồn mở Aubio có thể phân tích các mẫu nhịp điệu và phát hiện nhịp và tempo trong âm nhạc trong các ứng dụng Python. Aubio có thể lắng nghe âm thanh và gõ theo — phát hiện tempo tính bằng BPM (nhịp mỗi phút) và xác định thời gian của từng nhịp. Điều này vô giá cho mọi thứ từ phần mềm DJ đến đồng bộ âm nhạc. Thư viện xác định vị trí nhịp bằng cách phân tích các thay đổi phổ và các mẫu nhịp trong tín hiệu âm thanh.
Đọc và ghi tệp âm thanh bằng Python
Thư viện Python Aubio bao bọc I/O tệp âm thanh thông qua các đối tượng source và sink, hỗ trợ nhiều định dạng (WAV, FLAC, OGG, MP3 qua libav hoặc ffmpeg) và tự động xử lý chuyển đổi tần số mẫu. Dưới đây là một ví dụ đơn giản cho thấy các nhà phát triển phần mềm có thể thực hiện việc đọc, xử lý và ghi tệp âm thanh bằng các lệnh Python.
Cách đọc, xử lý và ghi tệp âm thanh bằng 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")