Музыкальный анализ и визуализация

Мне интересно программировать музыкальный визуализатор в Python.

Первая проблема заключается в том, как получить информацию из музыки? Как объем, частота, об/мин и т.д. И откуда? Из звуковой карты или фактического музыкального файла?

Моя догадка звучит из звуковой карты, но как мне получить доступ к звуковой карте и необходимой информации? Предпочтительно, независимо от платформы (Linux является обязательным). Я уже немного читал о преобразовании Фурье, но я не уверен, что это лучший способ.

Я думал об использовании OpenGL для визуализации, но я по-прежнему открыт для предложений.

Я уже смотрел на эти википедии, но еще не нашел ответа: http://wiki.python.org/moin/Audio/
http://wiki.python.org/moin/PythonInMusic

Ответы

Ответ 1

Если вы ищете кросс-платформенную аудио-библиотеку, я настоятельно рекомендую использовать FMOD, который просто скалывает. Существует также обертка, чтобы использовать его в доступных python (хотя я никогда не использовал его).
Он будет предоставлять такие функции, как получение спектра из коробки.
Если вы хотите проанализировать звуковой файл, мой алгоритм de choix - это диапазон частот. Он вычисляет матрицу подобия, сравнивая каждую короткую выборку музыки со всеми остальными. После вычисления матрицы подобия можно получить среднее сходство между всеми парами выборок {S (T); S (T + 1)} для каждого временного интервала T: это спектр удара.
Это позволяет получить BPM вашей аудиопоследовательности, но может сделать гораздо больше, как определение различных частей музыки, найти переходы между аналогичными образцами. Я не знаю, что вы подразумеваете под "визуализацией звука", но я думаю, что этот алгоритм должен предоставить вам достаточно информации, чтобы начать синхронизацию изображения с аудио (если это то, что вы хотите сделать).

Ответ 2

Другим инструментом для этого является librosa. Он предлагает Beat tracking для получения bpm в дополнение к действиям по умолчанию. Согласно руководству, для отслеживания бит:

import librosa
audio_path = librosa.util.example_audio_file()
# or uncomment the line below and point it at your favorite song:
# audio_path = '/path/to/your/favorite/song.mp3'
y, sr = librosa.load(audio_path)
y_percussive = librosa.effects.hpss(y)
tempo, beats = librosa.beat.beat_track(y=y_percussive, sr=sr)

Как @dionyziz также сказал,

биты будут в кадрах. Вы можете преобразовать их в фактическое время, используя

librosa.frames_to_time(beats)

Я не пробовал это.

Ответ 3

Больше не является хорошим ответом, поскольку API Echo Nest больше недоступен. Только для исторических целей

Рассмотрим Echo Nest API, который отлично работает с Python и будет возвращать информацию об ударах в минуту (возможно, что вы хотите вместо RPM), средняя амплитуда, даже "танчность" для любого аудиофайла. Вам нужен ключ API, но кроме того он бесплатный и работает хорошо.

Он также имеет код для управления музыкой, а также через пакет Echo Nest Remix. Вот их пример кода:

"""Reverse a song by playing its beats 
   forward starting from the end of the song"""
import echonest.audio as audio   

# Easy around wrapper mp3 decoding and Echo Nest analysis
audio_file = audio.LocalAudioFile("NeverGonnaTellIt.mp3")

# You can manipulate the beats in a song as a native python list
beats = audio_file.analysis.beats
beats.reverse()


# And render the list as a new audio file!
audio.getpieces(audio_file, beats).encode("NeverGonnaTellItBackwardsByBeat.mp3")