Advertisement
Guest User

Untitled

a guest
Mar 29th, 2020
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.34 KB | None | 0 0
  1. import librosa
  2. import librosa.display
  3. from scipy.spatial import distance
  4. import numpy
  5. import matplotlib.pyplot as plt
  6.  
  7.  
  8. # calculates the averages of a librosa stft output
  9. def calc_stft_averages(stft):
  10. return [numpy.average(t) for t in stft]
  11.  
  12.  
  13. # calculates the euclidean distance of two full signal stft ouputs
  14. def calc_euclidean_distance(stft1, stft2):
  15. stft1_averages = calc_stft_averages(stft1)
  16. stft2_averages = calc_stft_averages(stft2)
  17. euclidean_distances = []
  18. for index in range(0, (len(stft1_averages) - 1)):
  19. euclidean_distances.append(distance.euclidean(stft1_averages[index], stft2_averages[index]))
  20. return numpy.average(euclidean_distances)
  21.  
  22.  
  23. # calculates segment scores for a list of beat clips
  24. def score_segments(clips, segment_length, midpoint, density, bias_mode=False):
  25. scores = []
  26. # only compute scores for first or last third of song depending on bias mode
  27. if bias_mode:
  28. #precalculate stfts of needed clips
  29. clip_stfts = [numpy.abs(librosa.stft(clips[i])) for i in range(0, int(len(clips) * 0.33))]
  30. for si in range(0, (int(len(clip_stfts) * 0.33)-int(segment_length * density))):
  31. if midpoint > 2:
  32. score_first = numpy.average(
  33. [calc_euclidean_distance(clip_stfts[si], clip_stfts[si+i]) for i in range(1, (midpoint*density - 1), density)])
  34. score_second = numpy.average([calc_euclidean_distance(clip_stfts[si], clip_stfts[si+i]) for i in
  35. range((midpoint*density), (segment_length*density - 1), density)])
  36. else:
  37. score_first = calc_euclidean_distance(clip_stfts[si], clip_stfts[si+1*density])
  38. score_second = numpy.average([calc_euclidean_distance(clip_stfts[si], clip_stfts[si+i]) for i in
  39. range((midpoint*density) , (segment_length*density - 1), density)])
  40.  
  41. score = score_first + score_second
  42.  
  43. scores.append(score)
  44.  
  45. #create dummy values
  46. for si in range(0, int(len(clips) * 0.66)):
  47. scores.append(1000)
  48. else:
  49. #precalculate stfts of needed clips
  50. clip_stfts = [numpy.abs(librosa.stft(clips[i])) for i in range(int(len(clips) * 0.66), (len(clips) - 1))]
  51. #create dummy values to
  52. for si in range(0, (int(len(clips) * 0.66))):
  53. scores.append(1000)
  54. for si in range(0, (len(clip_stfts) - int(segment_length * density))):
  55. if midpoint > 2:
  56. score_first = numpy.average(
  57. [calc_euclidean_distance(clip_stfts[si], clip_stfts[si+i]) for i in range(1, (midpoint*density - 1), density)])
  58. score_second = numpy.average([calc_euclidean_distance(clip_stfts[si], clip_stfts[si+i]) for i in
  59. range((midpoint*density), (int(segment_length*density) - 1), density)])
  60. else:
  61. score_first = calc_euclidean_distance(clip_stfts[si], clip_stfts[si+1*density])
  62. score_second = numpy.average([calc_euclidean_distance(clip_stfts[si], clip_stfts[si+i]) for i in
  63. range((midpoint*density), (segment_length*density - 1), density)])
  64.  
  65. score = score_first + score_second
  66.  
  67. scores.append(score)
  68. return scores
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement