UOMOP
"Similarity Detection" using Pearson Correlation Coefficient 본문
Project/Music Plagiarism Project
"Similarity Detection" using Pearson Correlation Coefficient
Happy PinGu 2022. 7. 19. 19:10def Pearson(A, B, sr, period, mode, num_of_ij) :
# mode가 1이면 전체 음원데이터 사용
# mode가 2이면 전체 음원의 절반만을 사용
length = int( ( min(len(A.tolist()), len(B.tolist())) ) / mode )
A = (A[0 : length])
B = (B[0 : length])
num_of_window = int(math.floor(length / int(period * sr)))
final_index_A = 0
final_index_B = 0
save_score = list()
Mat_A = [[0 for col in range(int(period * sr))] for row in range(num_of_window)]
Mat_B = [[0 for col in range(int(period * sr))] for row in range(num_of_window)]
for i in range(0, num_of_window) :
for j in range(0, int(period * sr)) :
Mat_A[i][j] = A[final_index_A + j]
Mat_B[i][j] = B[final_index_B + j]
final_index_A = int(period * sr) * (i+1)
final_index_B = int(period * sr) * (i+1)
for i in range(0, num_of_window) :
for j in range(0, num_of_window) :
save_ij = list()
pearson_coef, _ = stats.pearsonr(np.array(Mat_A[i]), np.array(Mat_B[j]))
save_ij.append(i)
save_ij.append(j)
save_ij.append(abs(pearson_coef))
save_score.append(save_ij)
col_name = ['i', 'j', 'max_corl']
df = pd.DataFrame(save_score, columns = col_name)
df_sorted_mid = df.sort_values(by = ['max_corl'], ascending = False)
df_sorted = df_sorted_mid.iloc[0 : num_of_ij]
return df_sorted, Mat_A, Mat_B
Pearson Correlation Coefficient (피어슨 상관 계수)
공분산을 각 변수의 표준 편차로 나누어준 피어슨 상관 계수를 사용하여 음원 표절 논란이 발생하는 영역을 Detection해보는 것을 목표로 한다. 음원의 경우, 임의의 음원마다 서로 다른 세기 즉, y(t)값을 가지게 된다. 하지만 사람에게 유사하게 들리는 노래는 음원의 세기와는 독립적이다. 만약 음원의 강도, 크기, 세기가 음원의 유사판단을 영향을 주게 된다면 박자를 동일하게 설정하고 Error만 추출하면 될 것이다.
y1, sr = librosa.load('1-1.wav')
y2, sr = librosa.load('1-2.wav')
df, Mat_y1, Mat_y2 = Pearson(y1, y2, sr = sr, period = 0.5, mode = 2, num_of_ij = 30)
챔피언(PSY) vs Axel F(비버리 힐스 캅 ost)
두 음원은 거의 동일한 멜로디가 초반 8초에서 확인된다.
두 음원을 Load한 후 0.5초씩 Seperate.
두 곡의 나눠진 영역을 모두 상관 값 계산 실시.
이 정보를 Pandas DataFrame 형태로 저장 후 Sorting.
정렬된 DataFrame에 초반 8초에 해당하는 영역이 포함되는지 확인.
df.head(30)
확인 결과, (0, 0), (14, 0)포함되는 것을 확인가능.
약 35000의 결과 샘플 중에서 (14, 0)은 3번째로 상관값이 높은 것을 확인.
성공적.
다른 음원들도 위 함수를 통해서 유사영역이 Sorted DF에서 확인되는지 Check.
'Project > Music Plagiarism Project' 카테고리의 다른 글
Librosa - tempo contorl (0) | 2022.10.09 |
---|---|
Cutting Period에 따른 Pearson Coef. (0) | 2022.07.19 |
Colab 다중 선택, 수정 (0) | 2022.07.09 |
Writing audio file using soundfile library (0) | 2022.07.04 |
librosa를 통해서 ReSampling (0) | 2022.07.04 |
Comments