File size: 2,915 Bytes
3e89400
 
 
 
8f82d17
3e89400
 
 
9d2ec4b
3e89400
9d2ec4b
 
8f82d17
3e89400
 
 
 
 
 
 
 
9d2ec4b
 
3e89400
9d2ec4b
 
 
 
 
 
3e89400
 
 
 
8f82d17
3e89400
 
 
9d2ec4b
7c82cab
b8972a5
9b50ad7
9d2ec4b
3e89400
b8972a5
3e89400
 
 
 
 
 
 
 
 
 
 
 
9d2ec4b
 
 
 
 
3e89400
 
9d2ec4b
3e89400
 
 
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
import os
import uuid
import zipfile
import gradio as gr
from tqdm import tqdm
from datetime import datetime
from pydub import AudioSegment

def convert_audio(input_files, output_format, session_id, merge_files, gap_duration):
    output_files = []
    merged_audio = AudioSegment.silent(duration=0)

    for input_file in tqdm(input_files, desc="Converting files"):
        audio = AudioSegment.from_file(input_file)
        base_name = os.path.splitext(os.path.basename(input_file))[0]
        output_filename = f"{base_name}.{output_format}"
        output_path = os.path.join(session_id, output_filename)
        os.makedirs(session_id, exist_ok=True)
        audio.export(output_path, format=output_format)
        output_files.append(output_path)

        if merge_files:
            merged_audio += audio + AudioSegment.silent(duration=gap_duration)

    if merge_files:
        merged_output_path = os.path.join(session_id, f"merged_output.{output_format}")
        merged_audio.export(merged_output_path, format=output_format)
        output_files.append(merged_output_path)

    return output_files

def create_zip(output_files, session_id):
    zip_filename = f"{session_id}.zip"
    with zipfile.ZipFile(zip_filename, 'w') as zipf:
        for file in tqdm(output_files, desc="Creating ZIP"):
            zipf.write(file, os.path.basename(file))
    return zip_filename

def process_files(files, output_format, merge_files, gap_duration, progress=gr.Progress(track_tqdm=True)):
    session_id = datetime.now().strftime("%Y-%m-%d_%H-%M-%S") + "_" + str(uuid.uuid4())[:8]
    print(f"\nStarting conversion process for session: {session_id}")
    print(f"Total files to convert: {len(files)} to {output_format}")
    output_files = convert_audio(files, output_format, session_id, merge_files, gap_duration)
    zip_filename = create_zip(output_files, session_id)
    print(f"Processing completed!")
    return zip_filename

audio_formats = [
    "wav", "flac", "mp3", "ogg", "aac", "m4a", "aiff", "wma", "opus", "ac3",
    "amr", "dts", "mka", "au", "ra", "voc", "iff", "sd2", "wv", "caf",
    "mpc", "tta", "spx", "gsm"
]

with gr.Blocks() as demo:
    gr.Markdown("## Audio File Converter")
    with gr.Row():
        file_input = gr.Files(file_types=["audio"], height=160)
        with gr.Column():
            format_choice = gr.Dropdown(choices=audio_formats, label="Output Format", value="mp3")
            with gr.Row():
                merge_files_checkbox = gr.Checkbox(label="Merge all files into one")
                gap_slider = gr.Slider(minimum=0, maximum=5000, step=100, value=500, label="Gap between files (ms)")
    submit_button = gr.Button("Convert")
    output_file = gr.File(label="Download Converted File")
    submit_button.click(process_files, inputs=[file_input, format_choice, merge_files_checkbox, gap_slider], outputs=output_file)

if __name__ == "__main__":
    demo.launch()