Музыкальный анализ и визуализация
Мне интересно программировать музыкальный визуализатор в 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")