Spaces:
Sleeping
Sleeping
import numpy as np | |
def slice_songs(X, Y, S, | |
sr=22050, | |
hop_length=512, | |
length_in_seconds=30, | |
overlap=0.5): | |
""" | |
Slice spectrograms into smaller splits with overlap. | |
Parameters: | |
X: Array of spectrograms | |
Y: Array of labels | |
S: Array of song names | |
sr: Sample rate (default: 22050) | |
hop_length: Hop length used in spectrogram creation (default: 512) | |
length_in_seconds: Length of each slice in seconds (default: 30) | |
overlap: Overlap ratio between consecutive slices (default: 0.5 for 50% overlap) | |
""" | |
# Compute the number of frames for the desired slice length | |
frames_per_second = sr / hop_length | |
slice_length_frames = int(length_in_seconds * frames_per_second) | |
# Calculate hop size for overlapping (stride) | |
stride = int(slice_length_frames * (1 - overlap)) | |
# Initialize lists for sliced data | |
X_slices = [] | |
Y_slices = [] | |
S_slices = [] | |
# Slice each spectrogram | |
for i, spectrogram in enumerate(X): | |
num_frames = spectrogram.shape[1] | |
# Calculate start positions for all slices | |
start_positions = range(0, num_frames - slice_length_frames + 1, stride) | |
for start_frame in start_positions: | |
end_frame = start_frame + slice_length_frames | |
# Extract the slice | |
slice_ = spectrogram[:, start_frame:end_frame] | |
# Only add if the slice is the expected length | |
if slice_.shape[1] == slice_length_frames: | |
X_slices.append(slice_) | |
Y_slices.append(Y[i]) | |
S_slices.append(S[i]) | |
# Convert lists to numpy arrays | |
X_slices = np.array(X_slices) | |
Y_slices = np.array(Y_slices) | |
S_slices = np.array(S_slices) | |
return X_slices, Y_slices, S_slices |