root
commited on
Commit
路
670bed3
1
Parent(s):
50549e3
ss
Browse files
app.py
CHANGED
@@ -2585,9 +2585,9 @@ def format_beat_timeline(audio_file, lyrics=None):
|
|
2585 |
timeline += "S = Strong beat | m = Medium beat | w = Weak beat | 路 = No beat\n\n"
|
2586 |
|
2587 |
# Calculate total duration and create time markers
|
2588 |
-
if beats_info['beat_times']:
|
2589 |
-
#
|
2590 |
-
max_beat_time =
|
2591 |
total_duration = max_beat_time + 2 # Add 2 seconds of padding
|
2592 |
else:
|
2593 |
total_duration = 30 # Default duration if no beats found
|
@@ -2668,7 +2668,7 @@ def format_beat_timeline(audio_file, lyrics=None):
|
|
2668 |
# Calculate end time (start of next measure or end of song)
|
2669 |
if i < len(measure_starts) - 1:
|
2670 |
end_time = measure_starts[i+1][1]
|
2671 |
-
elif beats_info['beat_times']:
|
2672 |
# Get the last beat time and convert to float if needed
|
2673 |
last_beat = beats_info['beat_times'][-1]
|
2674 |
end_time = float(last_beat) if isinstance(last_beat, np.ndarray) else last_beat
|
@@ -2685,17 +2685,19 @@ def format_beat_timeline(audio_file, lyrics=None):
|
|
2685 |
break
|
2686 |
|
2687 |
# Add phrase information
|
2688 |
-
if beats_info['phrases']:
|
2689 |
timeline += "\n=== MUSICAL PHRASES ===\n\n"
|
2690 |
for i, phrase in enumerate(beats_info['phrases']):
|
2691 |
if i < 10: # Limit to first 10 phrases
|
2692 |
if not phrase:
|
2693 |
continue
|
2694 |
-
|
2695 |
-
|
2696 |
-
|
2697 |
-
if start_beat >= len(beats_info['beat_times']) or end_beat >= len(beats_info['beat_times']):
|
2698 |
continue
|
|
|
|
|
|
|
2699 |
|
2700 |
# Convert to float if needed
|
2701 |
phrase_start = beats_info['beat_times'][start_beat]
|
@@ -2788,11 +2790,12 @@ def format_beat_timeline(audio_file, lyrics=None):
|
|
2788 |
timeline += f" Syllables: {syllable_count}\n"
|
2789 |
|
2790 |
# Show ideal timing (if we have enough phrases)
|
2791 |
-
if beats_info['phrases'] and i < len(beats_info['phrases']):
|
2792 |
phrase = beats_info['phrases'][i]
|
2793 |
-
|
2794 |
-
|
2795 |
-
|
|
|
2796 |
|
2797 |
start_time = beats_info['beat_times'][start_beat]
|
2798 |
start_time = float(start_time) if isinstance(start_time, np.ndarray) else start_time
|
@@ -2814,7 +2817,11 @@ def format_beat_timeline(audio_file, lyrics=None):
|
|
2814 |
if j < len(beats_info['beat_times']):
|
2815 |
beat_time = beats_info['beat_times'][j]
|
2816 |
beat_time = float(beat_time) if isinstance(beat_time, np.ndarray) else beat_time
|
2817 |
-
|
|
|
|
|
|
|
|
|
2818 |
|
2819 |
while len(syllable_viz) <= relative_pos:
|
2820 |
syllable_viz.append("路")
|
|
|
2585 |
timeline += "S = Strong beat | m = Medium beat | w = Weak beat | 路 = No beat\n\n"
|
2586 |
|
2587 |
# Calculate total duration and create time markers
|
2588 |
+
if beats_info['beat_times'] and len(beats_info['beat_times']) > 0:
|
2589 |
+
# Get the max value safely
|
2590 |
+
max_beat_time = max([float(t) if isinstance(t, np.ndarray) else t for t in beats_info['beat_times']])
|
2591 |
total_duration = max_beat_time + 2 # Add 2 seconds of padding
|
2592 |
else:
|
2593 |
total_duration = 30 # Default duration if no beats found
|
|
|
2668 |
# Calculate end time (start of next measure or end of song)
|
2669 |
if i < len(measure_starts) - 1:
|
2670 |
end_time = measure_starts[i+1][1]
|
2671 |
+
elif beats_info['beat_times'] and len(beats_info['beat_times']) > 0:
|
2672 |
# Get the last beat time and convert to float if needed
|
2673 |
last_beat = beats_info['beat_times'][-1]
|
2674 |
end_time = float(last_beat) if isinstance(last_beat, np.ndarray) else last_beat
|
|
|
2685 |
break
|
2686 |
|
2687 |
# Add phrase information
|
2688 |
+
if 'phrases' in beats_info and beats_info['phrases']:
|
2689 |
timeline += "\n=== MUSICAL PHRASES ===\n\n"
|
2690 |
for i, phrase in enumerate(beats_info['phrases']):
|
2691 |
if i < 10: # Limit to first 10 phrases
|
2692 |
if not phrase:
|
2693 |
continue
|
2694 |
+
|
2695 |
+
# Safely check phrase indices
|
2696 |
+
if not (len(phrase) > 0 and len(beats_info['beat_times']) > 0):
|
|
|
2697 |
continue
|
2698 |
+
|
2699 |
+
start_beat = min(phrase[0], len(beats_info['beat_times'])-1)
|
2700 |
+
end_beat = min(phrase[-1], len(beats_info['beat_times'])-1)
|
2701 |
|
2702 |
# Convert to float if needed
|
2703 |
phrase_start = beats_info['beat_times'][start_beat]
|
|
|
2790 |
timeline += f" Syllables: {syllable_count}\n"
|
2791 |
|
2792 |
# Show ideal timing (if we have enough phrases)
|
2793 |
+
if 'phrases' in beats_info and beats_info['phrases'] and i < len(beats_info['phrases']):
|
2794 |
phrase = beats_info['phrases'][i]
|
2795 |
+
# Safely check if phrase has elements and indices are valid
|
2796 |
+
if phrase and len(phrase) > 0 and len(beats_info['beat_times']) > 0:
|
2797 |
+
start_beat = min(phrase[0], len(beats_info['beat_times'])-1)
|
2798 |
+
end_beat = min(phrase[-1], len(beats_info['beat_times'])-1)
|
2799 |
|
2800 |
start_time = beats_info['beat_times'][start_beat]
|
2801 |
start_time = float(start_time) if isinstance(start_time, np.ndarray) else start_time
|
|
|
2817 |
if j < len(beats_info['beat_times']):
|
2818 |
beat_time = beats_info['beat_times'][j]
|
2819 |
beat_time = float(beat_time) if isinstance(beat_time, np.ndarray) else beat_time
|
2820 |
+
# Handle edge case where phrase_duration is very small
|
2821 |
+
if phrase_duration > 0.001: # Avoid division by very small numbers
|
2822 |
+
relative_pos = int((beat_time - start_time) / phrase_duration * syllable_count)
|
2823 |
+
else:
|
2824 |
+
relative_pos = 0
|
2825 |
|
2826 |
while len(syllable_viz) <= relative_pos:
|
2827 |
syllable_viz.append("路")
|