Индекс сходства между 2 спектрограммами - PullRequest
0 голосов
/ 17 апреля 2020

Итак, я хочу получить индекс сходства между двумерными массивами, представляющими голоса двух певцов. Я читаю мои mp3 файлы с pydub. AudioFunctions.py

from pydub import AudioSegment

class SongData():
    def __init__(self, path):
        self.audio = AudioSegment.from_file(path).set_channels(1)
        self.rate, self.data = self.audio.frame_rate, np.array(self.audio.get_array_of_samples())
        self.length = len(self.data)
        self.duration = self.audio.duration_seconds
        self.time = np.linspace(0, self.duration, self.length)
        self.freq = np.linspace(0, self.rate / 2, int(self.length / 2))
        self.fftArray = fft(self.data)
        self.fftArrayPositive = self.fftArray[:self.length // 2]
        self.fftArrayNegative = np.flip(self.fftArray[self.length // 2:])
        self.fftArrayAbs = np.abs(self.fftArray)
        self.fftPlotting = self.fftArrayAbs[: self.length // 2]


def song2data(path):
    songClass = SongData(path)
    return songClass


def getFirstData(songArr, time):
    selectedData = songArr[:int(time*44100)]
    return selectedData

А это мой код для получения данных двух песен и получения их спектрограмм ...

main.py

from AudioFunctions import *
from scipy import signal
import matplotlib.pyplot as plt
import librosa
import sklearn
from scipy import spatial
from sklearn.metrics.pairwise import cosine_similarity



songClass1 = song2data("sia1.mp3")
songClass2 = song2data("sia2.mp3")

# print(songClass.data)
# print(songClass.rate)
# print(songClass.duration)
# print(songClass.length)

songArray = getFirstData(songClass1.data, 120)
songArray2 = getFirstData(songClass2.data, 120)


frequencies, times, spectrogram = signal.spectrogram(songArray, 44100)
frequencies2, times2, spectrogram2 = signal.spectrogram(songArray2, 44100)

# print(frequencies)
spec = spectrogram.flatten()
spec2 = spectrogram2.flatten()


result = 1 - spatial.distance.cosine(spec, spec2)
print(result)

результат представляет индекс подобия между двумя голосами. Тем не менее, это дает мне низкое число (0,133) при сравнении двух песен одного певца (Sia).

Песня 1: https://drive.google.com/file/d/1svV0Ry_lNaEA9Z8c61t3S25XCSgIv6sW/view

Песня 2: https://drive.google.com/file/d/1ToKQo2MERBbxZezqDcEtEE2dhgmH-wus/view

Есть ли проблемы в моей логике c? Или этот результат может быть logi c для некоторых случаев? Заранее спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...