От mp3 к функциям: кластеризация музыки - PullRequest
0 голосов
/ 26 февраля 2020

Кому-нибудь интересно иметь кластер MP3 musi c? Я использовал librosa, ffmpeg и скрипт Python, который я написал, чтобы получить карту из одного файла MP3 для последовательности функций из 114 числовых функций (например, темп, mf cc, ...). Если процесс будет повторяться для, скажем, 100.000 MP3, будет возможно иметь кластер musi c. Вопрос в том, как я могу позволить людям конвертировать свои MP3 в функции? Еще один интересный вопрос - можно ли вернуть функции обратно в MP3? Вот сценарий:

#!/bin/bash

ffmpeg -y -i "$1" -acodec pcm_u8 -ar 22050 "$1".wav

python prova.py "$1".wav

и Python Wav для кода функций, prova.py:

# Beat tracking example
from __future__ import print_function
import librosa
import numpy as np
import sys


# ffmpeg -i song.mp3 -acodec pcm_u8 -ar 22050 song.wav

# 1. Get the file path to the included audio example
filename = sys.argv[1]
print(filename)
name, extension1, extension2 = filename.split(".")

print("Song name = " + name)

# 2. Load the audio as a waveform `y`
#    Store the sampling rate as `sr`
y, sr = librosa.load(filename)

onset_env = librosa.onset.onset_strength(y, sr=sr)
tempo = librosa.beat.tempo(onset_envelope=onset_env, sr=sr)

# Set the hop length; at 22050 Hz, 512 samples ~= 23ms
hop_length = 512

# Separate harmonics and percussives into two waveforms
y_harmonic, y_percussive = librosa.effects.hpss(y)


#print("y_armonic= " + str(len(y_harmonic)))
#print("y_percussive= " + str(len(y_percussive)))

# Beat track on the percussive signal
tempo, beat_frames = librosa.beat.beat_track(y=y_percussive,
                                             sr=sr)

# Compute MFCC features from the raw signal
mfcc = librosa.feature.mfcc(y=y, sr=sr, hop_length=hop_length, n_mfcc=13)

# And the first-order differences (delta features)
mfcc_delta = librosa.feature.delta(mfcc)

# Stack and synchronize between beat events
# This time, we'll use the mean value (default) instead of median
beat_mfcc_delta = librosa.util.sync(np.vstack([mfcc, mfcc_delta]),
                                    beat_frames)

# Compute chroma features from the harmonic signal
chromagram = librosa.feature.chroma_cqt(y=y_harmonic,
                                        sr=sr)

# Aggregate chroma features between beat events
# We'll use the median value of each feature between beat frames
beat_chroma = librosa.util.sync(chromagram,
                                beat_frames,
                                aggregate=np.median)

# Finally, stack all beat-synchronous features together
beat_features = np.vstack([beat_chroma, beat_mfcc_delta])

print(str(mfcc.shape) + " " + str(mfcc_delta.shape) + " " + str(beat_mfcc_delta.shape) + " " + str(chromagram.shape) + " " + str(beat_chroma.shape) + str(beat_features.shape))

f = open(name + ".txt","w")

f.write(str(tempo)+ ',')

for i in range(0, len(mfcc)):
    f.write(str(np.mean(mfcc[i]))+ ',')

for i in range(0, len(mfcc_delta)):
    f.write(str(np.mean(mfcc_delta[i]))+ ',')

for i in range(0, len(beat_mfcc_delta)):
    f.write(str(np.mean(beat_mfcc_delta[i]))+ ',')

for i in range(0, len(chromagram)):
    f.write(str(np.mean(chromagram[i]))+ ',')

for i in range(0, len(beat_chroma)):
    f.write(str(np.mean(beat_chroma[i]))+ ',')

for i in range(0, len(beat_features)):
    f.write(str(np.mean(beat_features[i]))+ ',')

f.close()

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

1 Ответ

1 голос
/ 08 марта 2020

Либо вы предоставляете код, который люди могут запускать в своих MP3 (например, инструмент командной строки или настольное приложение), либо люди предоставляют вам свои MP3, чтобы вы могли запускать код (например, веб-приложение или HTTP API) .

...