Librosa.load: примеры (PYTHON)

Загрузка аудиофайлов с помощью 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' для высокого качества.

Возвращаемые значения:

Функция возвращает кортеж из двух элементов:

  1. y (np.ndarray): Аудиосигнал в виде одномерного (моно) или двумерного (стерео) массива NumPy. Форма: (n_samples,) для моно или (n_channels, n_samples) для стерео.
  2. 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: Пакетная загрузка и анализ нескольких файлов

Пример python
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: Загрузка с сохранением оригинальных семплов (без нормализации)

Пример python
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: Загрузка аудио из буфера в памяти (например, из сетевого запроса)

Пример python
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: Использование различных типов ресемплинга и сравнение

Пример python
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)

Пример python
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)

питон librosa.load function comments

En
Librosa.load Load audio file