Librosa.load: примеры (PYTHON)
librosa.load(path: str): tupleОписание функции librosa.load
Функция librosa.load служит для загрузки и декодирования аудиофайлов в числовые массивы, пригодные для обработки в Python. Она является основным инструментом для чтения аудио в библиотеке Librosa.
Когда используется:
Функцию применяют на начальном этапе анализа аудиосигналов для задач машинного обучения, обработки звука, извлечения признаков, визуализации или для простого воспроизведения аудио через Python.
Аргументы функции:
path(строка, байты, файловый объект или path-like объект): Путь к аудиофайлу или источник данных. Поддерживаются форматы: WAV, MP3, FLAC, OGG и другие (зависит от доступных декодеров).sr(число, >0, необязательный): Частота дискретизации целевого сигнала. Еслиsr=None, используется исходная частота файла. Если задано числовое значение, сигнал ресемплируется к этой частоте.mono(булевый, необязательный): Преобразование сигнала в монофонический (одноканальный). По умолчаниюTrue. При значенииFalseсохраняется многоканальность, форма вывода будет (каналы, время).offset(число, >=0, необязательный): Время начала загрузки в секундах. По умолчанию 0.0.duration(число, >0, необязательный): Длительность загружаемого фрагмента в секундах. ЕслиNone, загружается весь файл отoffset.dtype(тип данных NumPy, необязательный): Тип данных для выходного аудиосигнала. По умолчаниюnp.float32с диапазоном значений от -1.0 до 1.0.res_type(строка, необязательный): Тип ресемплера. Например, 'kaiser_best', 'kaiser_fast', 'soxr_vhq'. По умолчанию 'soxr_vhq' для высокого качества.
Возвращаемые значения:
Функция возвращает кортеж из двух элементов:
y(np.ndarray): Аудиосигнал в виде одномерного (моно) или двумерного (стерео) массива NumPy. Форма: (n_samples,) для моно или (n_channels, n_samples) для стерео.sr(число): Частота дискретизации загруженного сигнала. Если аргументsrбыл задан, возвращается именно это значение.
Простые примеры использования
Пример 1: Базовая загрузка файла
import librosa
# Загрузка с исходной частотой дискретизации
y, sr = librosa.load('audio.wav')
print(f'Тип y: {type(y)}')
print(f'Форма y: {y.shape}')
print(f'Частота sr: {sr}')Тип y: <class 'numpy.ndarray'> Форма y: (264600,) Частота sr: 22050
Пример 2: Загрузка с ресемплированием и преобразованием в моно
y, sr = librosa.load('audio.wav', sr=16000, mono=True)
print(f'Форма y: {y.shape}')
print(f'Частота sr: {sr}')Форма y: (192000,) Частота sr: 16000
Пример 3: Загрузка фрагмента файла
# Загрузка фрагмента с 10-й по 15-ю секунду
y, sr = librosa.load('audio.wav', offset=10.0, duration=5.0)
print(f'Длина фрагмента в семплах: {len(y)}')
print(f'Длительность в секундах: {len(y)/sr}')Длина фрагмента в семплах: 110250 Длительность в секундах: 5.0
Пример 4: Загрузка стерео-аудио без преобразования в моно
y, sr = librosa.load('stereo_audio.wav', mono=False)
print(f'Форма y (каналы, сэмплы): {y.shape}')Форма y (каналы, сэмплы): (2, 529200)
Похожие функции в Python
soundfile.read (библиотека SoundFile):
Функция из библиотеки SoundFile (pysoundfile) также предназначена для чтения аудиофайлов. Её преимущество - более высокая скорость загрузки для некоторых форматов (WAV, FLAC) и прямое чтение в целочисленных форматах. Однако поддержка сжатых форматов (MP3) требует отдельной установки.
import soundfile as sf
data, samplerate = sf.read('audio.wav')scipy.io.wavfile.read:
Функция из SciPy предназначена только для чтения WAV-файлов. Она возвращает данные в их оригинальном целочисленном формате, что требует последующей нормализации. Не поддерживает другие аудиоформаты или ресемплинг.
from scipy.io import wavfile
samplerate, data = wavfile.read('audio.wav')torchaudio.load (библиотека TorchAudio):
Функция из библиотеки TorchAudio загружает аудио напрямую в тензоры PyTorch, что удобно для задач глубокого обучения. Поддерживает различные бэкенды для декодирования.
import torchaudio
waveform, sample_rate = torchaudio.load('audio.wav')Выбор функции:
- librosa.load - оптимальный выбор для общего анализа и извлечения аудиопризнаков, особенно в связке с другими функциями Librosa.
- soundfile.read - предпочтительнее, когда важна скорость загрузки несжатых форматов.
- scipy.io.wavfile.read - подходит для простых задач работы исключительно с WAV-файлами в научных вычислениях.
- torchaudio.load - используется в пайплайнах машинного обучения, основанных на PyTorch.
Аналоги функции в других языках
JavaScript (Web Audio API, библиотека tone.js):
В браузерном JavaScript загрузка аудио часто происходит асинхронно через Web Audio API.
// Использование Fetch API и AudioContext для декодирования
async function loadAudio(url) {
const response = await fetch(url);
const arrayBuffer = await response.arrayBuffer();
const audioContext = new (window.AudioContext || window.webkitAudioContext)();
const audioBuffer = await audioContext.decodeAudioData(arrayBuffer);
// audioBuffer содержит данные (sampleRate, duration, channelData)
return audioBuffer;
}Java (Библиотека TarsosDSP, javax.sound.sampled):
Пакет javax.sound.sampled предоставляет базовые возможности для чтения аудио.
import javax.sound.sampled.*;
import java.io.File;
public class AudioLoadExample {
public static void main(String[] args) throws Exception {
File file = new File("audio.wav");
AudioInputStream audioStream = AudioSystem.getAudioInputStream(file);
AudioFormat format = audioStream.getFormat();
System.out.println("Sample Rate: " + format.getSampleRate());
// Далее чтение байтов в массив
}
}C# (Библиотека NAudio):
Библиотека NAudio является популярным выбором для работы с аудио в .NET.
using NAudio.Wave;
public void LoadAudio(string filePath)
{
using (var audioFile = new AudioFileReader(filePath))
{
var sampleRate = audioFile.WaveFormat.SampleRate;
// Чтение семплов в массив
var samples = new float[audioFile.Length / 4]; // для float
audioFile.Read(samples, 0, samples.Length);
}
}Основные отличия от Python:
В большинстве других языков загрузка аудио является более низкоуровневой операцией, требующей явного создания потока, декодера и обработки байтовых массивов. Библиотеки реже предоставляют встроенные функции для ресемплинга, обрезки по времени и нормализации в одну строку кода, как это делает librosa.load.
Типичные ошибки
Ошибка 1: Файл не найден или путь указан неверно
y, sr = librosa.load('несуществующий_файл.mp3')FileNotFoundError: [Errno 2] No such file or directory: 'несуществующий_файл.mp3'
Решение: Проверить правильность пути и расширения файла. Использовать абсолютные пути или корректные относительные.
Ошибка 2: Неподдерживаемый или битый аудиоформат
y, sr = librosa.load('corrupted_audio.mp3')NoBackendError: Unable to load 'corrupted_audio.mp3'. ...
Решение: Убедиться, что файл не поврежден и его формат поддерживается установленными аудиобэкендами (чаще всего ffmpeg или libsndfile).
Ошибка 3: Параметр duration или offset выходит за пределы файла
# Файл длительностью 5 секунд
y, sr = librosa.load('short_audio.wav', offset=6.0, duration=2.0)# Функция вернет пустой массив или массив с нулевой длиной y.shape # (0,)
Решение: Добавить проверку длительности файла перед загрузкой фрагмента.
Ошибка 4: Попытка загрузки защищенного или DRM-файла
Библиотека не может загружать аудио с защитой от копирования (например, некоторые покупные треки в формате M4P).
Изменения в последних версиях
Librosa 0.10.0 (2023):
- Значение по умолчанию для параметра
res_typeизменено с 'kaiser_best' на 'soxr_vhq'. Это обеспечивает более высокое качество ресемплинга при сравнимой скорости. - Улучшена обработка метаданных и тегов в некоторых аудиоформатах.
Librosa 0.9.0 (2022):
- Улучшена совместимость с новыми версиями NumPy и зависимостей для декодирования.
- Появились предупреждения о deprecated параметрах в связанных функциях, но
librosa.loadосталась стабильной.
Рекомендуется обновлять библиотеку до последней версии для исправления ошибок и повышения производительности.
Расширенные примеры использования
Пример 1: Пакетная загрузка и анализ нескольких файлов
import librosa
import numpy as np
import os
audio_dir = 'путь_к_папке'
sample_rate = 22050
duration = 5.0 # сек
data_list = []
for filename in os.listdir(audio_dir):
if filename.endswith('.wav'):
filepath = os.path.join(audio_dir, filename)
try:
# Загрузка только первых 5 секунд каждого файла
y, sr = librosa.load(filepath, sr=sample_rate, duration=duration)
data_list.append(y)
print(f'Загружен {filename}, форма: {y.shape}')
except Exception as e:
print(f'Ошибка загрузки {filename}: {e}')
# Объединение в один массив (например, для спектрограммы)
if data_list:
stacked_data = np.array(data_list)
print(f'Итоговый массив: {stacked_data.shape}')Загружен file1.wav, форма: (110250,) Загружен file2.wav, форма: (110250,) Итоговый массив: (2, 110250)
Пример 2: Загрузка с сохранением оригинальных семплов (без нормализации)
import soundfile as sf # Используем soundfile для чтения сырых данных
y_int, sr = sf.read('audio.wav', dtype='int16') # Чтение как int16
y_float = librosa.util.buf_to_float(y_int, dtype=np.float32) # Ручная нормализация
print(f'Максимальное значение в int16: {np.max(y_int)}')
print(f'Максимальное значение после нормализации: {np.max(y_float)}')Максимальное значение в int16: 16384 Максимальное значение после нормализации: 0.5
Пример 3: Загрузка аудио из буфера в памяти (например, из сетевого запроса)
import io
import requests
import librosa
# Скачивание аудиофайла в память
url = 'https://example.com/audio.mp3'
response = requests.get(url)
audio_buffer = io.BytesIO(response.content)
# Загрузка напрямую из буфера
# Требуется librosa >= 0.8.0
y, sr = librosa.load(audio_buffer, sr=16000)
print(f'Аудио загружено из буфера. Длина: {len(y)/sr:.2f} сек.')Аудио загружено из буфера. Длина: 30.12 сек.
Пример 4: Использование различных типов ресемплинга и сравнение
import librosa
import time
path = 'audio.wav'
res_types = ['soxr_vhq', 'soxr_hq', 'soxr_mq', 'kaiser_best', 'kaiser_fast']
for res_type in res_types:
start = time.time()
y, sr = librosa.load(path, sr=8000, res_type=res_type)
elapsed = time.time() - start
print(f'res_type: {res_type:12} | Время: {elapsed:.3f} сек | Форма: {y.shape}')res_type: soxr_vhq | Время: 0.452 сек | Форма: (64000,) res_type: soxr_hq | Время: 0.231 сек | Форма: (64000,) res_type: soxr_mq | Время: 0.198 сек | Форма: (64000,) res_type: kaiser_best | Время: 0.521 сек | Форма: (64000,) res_type: kaiser_fast | Время: 0.145 сек | Форма: (64000,)
Пример 5: Загрузка и немедленное вычисление признаков (спектрограмма, MFCC)
import librosa
import matplotlib.pyplot as plt
# Загрузка с нужными параметрами для последующего анализа
y, sr = librosa.load('speech.wav', sr=16000, offset=1.0, duration=3.0)
# Прямое вычисление спектрограммы
D = librosa.stft(y) # Кратковременное преобразование Фурье
S_db = librosa.amplitude_to_db(abs(D), ref=np.max)
# Извлечение MFCC признаков
mfccs = librosa.feature.mfcc(y=y, sr=sr, n_mfcc=13)
print(f'Форма спектрограммы: {S_db.shape}')
print(f'Форма MFCC: {mfccs.shape}')Форма спектрограммы: (1025, 188) Форма MFCC: (13, 188)