def find_chorus(chroma, sr, song_length_sec, clip_length): """ Find the most repeated chorus Args: chroma: 12 x n frequency chromogram sr: sample rate of the song, usually 22050 song_length_sec: length in seconds of the song (lost in processing chroma) clip_length: minimum length in seconds we want our chorus to be (at least 10-15s) Returns: Time in seconds of the start of the best chorus """ num_samples = chroma.shape[1] time_time_similarity = TimeTimeSimilarityMatrix(chroma, sr) time_lag_similarity = TimeLagSimilarityMatrix(chroma, sr) # Denoise the time lag matrix chroma_sr = num_samples / song_length_sec smoothing_size_samples = int(SMOOTHING_SIZE_SEC * chroma_sr) time_lag_similarity.denoise(time_time_similarity.matrix, smoothing_size_samples) # Detect lines in the image clip_length_samples = clip_length * chroma_sr candidate_rows = local_maxima_rows(time_lag_similarity.matrix) lines = detect_lines(time_lag_similarity.matrix, candidate_rows, clip_length_samples) if len(lines) == 0: print( f"No choruses were detected. Trying with a smaller search duration." ) return None line_scores = count_overlapping_lines( lines, OVERLAP_PERCENT_MARGIN * clip_length_samples, clip_length_samples) best_chorus = best_segment(line_scores) return best_chorus.start / chroma_sr
from pychorus import create_chroma from pychorus.similarity_matrix import TimeTimeSimilarityMatrix, TimeLagSimilarityMatrix chroma, _, sr, _ = create_chroma("daft.wav") time_time_similarity = TimeTimeSimilarityMatrix(chroma, sr) time_lag_similarity = TimeLagSimilarityMatrix(chroma, sr) # Visualize the results # time_time_similarity.display() # time_lag_similarity.display()