File size: 6,057 Bytes
0a0ea7b f056450 0a0ea7b f056450 0a0ea7b f056450 0a0ea7b f056450 0a0ea7b f056450 0a0ea7b f056450 0a0ea7b f056450 0a0ea7b f056450 0a0ea7b f056450 0a0ea7b f056450 0a0ea7b f056450 0a0ea7b f056450 0a0ea7b f056450 0a0ea7b f056450 0a0ea7b f056450 0a0ea7b f056450 0a0ea7b f056450 0a0ea7b f056450 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 |
# tabs/audio_merger_tab.py - Audio Merger Tab Component
import gradio as gr
from numpy import ndarray
from utils.audio_utils import load_audio_info, format_time, merge_audio_files
def update_file_status(audio1_file, audio2_file):
"""Update the status when audio files are uploaded"""
if not audio1_file and not audio2_file:
return "No files uploaded yet", "π Ready to upload audio files"
total_duration = 0
valid_files = 0
file_info = []
# Check first audio file
if audio1_file:
try:
audio_data, sample_rate, duration = load_audio_info(audio1_file)
if audio_data is not None:
valid_files += 1
total_duration += duration
file_info.append(f" 1. First Audio: {duration:.1f}s ({sample_rate:,} Hz)")
else:
file_info.append(f" 1. First Audio: β Invalid file")
except:
file_info.append(f" 1. First Audio: β Error loading file")
# Check second audio file
if audio2_file:
try:
audio_data, sample_rate, duration = load_audio_info(audio2_file)
if audio_data is not None:
valid_files += 1
total_duration += duration
file_info.append(f" 2. Second Audio: {duration:.1f}s ({sample_rate:,} Hz)")
else:
file_info.append(f" 2. Second Audio: β Invalid file")
except:
file_info.append(f" 2. Second Audio: β Error loading file")
if valid_files == 0:
status = "β No valid audio files found"
details = "Please upload valid audio files (MP3, WAV, FLAC, etc.)"
elif valid_files == 1:
status = f"π 1 valid file uploaded ({format_time(total_duration)})"
details = "Upload one more file to enable merging\n" + "\n".join(file_info)
else:
status = f"π 2 files ready ({format_time(total_duration)} total)"
details = f"Files ready for merging:\n" + "\n".join(file_info)
return status, details
def process_merge(audio1_file, audio2_file) -> tuple[tuple[int, ndarray] | None, str]:
"""Process merging of two audio files"""
if not audio1_file or not audio2_file:
return None, "β Please upload both audio files to merge"
# Create file paths list for the merge function
file_paths = [audio1_file, audio2_file]
# Call the merge function
result, status = merge_audio_files(file_paths)
return result, status
def reset_everything():
"""Reset all components to initial state"""
return None, None, None, "No files uploaded yet", "π Ready to upload audio files", "Ready to merge! Upload both audio files to get started."
def create_audio_merger_tab():
"""Create the audio merger tab interface"""
gr.Markdown("Upload two audio files and merge them in sequence. The first audio will play before the second audio.")
with gr.Row():
with gr.Column(scale=2):
# Audio Upload Section
gr.Markdown("### π Upload Audio Files")
with gr.Row():
audio1_file = gr.Audio(
label="π΅ First Audio File",
type="filepath",
interactive=True
)
audio2_file = gr.Audio(
label="π΅ Second Audio File",
type="filepath",
interactive=True
)
# File status
file_status = gr.Textbox(
value="No files uploaded yet",
label="π Upload Status",
interactive=False,
lines=1
)
# Detailed file info
file_details = gr.Textbox(
value="π Ready to upload audio files",
label="π File Details",
interactive=False,
lines=4
)
with gr.Column(scale=1):
gr.Markdown("### ποΈ Merge Controls")
merge_btn = gr.Button(
"π΅ Merge Audio Files",
variant="primary",
size="lg"
)
clear_btn = gr.Button(
"ποΈ Clear All Files",
variant="secondary",
size="lg"
)
# Instructions
gr.Markdown("""
**π Instructions:**
1. **Upload** first audio file (will play first)
2. **Upload** second audio file (will play second)
3. **Merge** files in sequence
4. **Download** the merged result
**π― Features:**
β’ Automatic sample rate conversion
β’ Stereo to mono conversion
β’ Duration calculations
β’ High-quality WAV output
""")
# Results section
with gr.Row():
with gr.Column(scale=1):
# Status output
merge_status = gr.Textbox(
value="Ready to merge! Upload both audio files to get started.",
label="π Merge Status & Details",
interactive=False,
lines=8
)
with gr.Column(scale=1):
# Audio output
merged_audio = gr.Audio(
label="π΅ Merged Audio Result",
type="numpy",
interactive=False
)
# Event handlers
audio1_file.change(
fn=update_file_status,
inputs=[audio1_file, audio2_file],
outputs=[file_status, file_details]
)
audio2_file.change(
fn=update_file_status,
inputs=[audio1_file, audio2_file],
outputs=[file_status, file_details]
)
merge_btn.click(
fn=process_merge,
inputs=[audio1_file, audio2_file],
outputs=[merged_audio, merge_status]
)
clear_btn.click(
fn=reset_everything,
outputs=[audio1_file, audio2_file, merged_audio, file_status, file_details, merge_status]
) |