File size: 2,959 Bytes
3e89400
 
 
 
8f82d17
3e89400
 
 
9d2ec4b
3e89400
9d2ec4b
 
8f82d17
3e89400
 
 
 
 
 
 
9d2ec4b
 
3e89400
9d2ec4b
 
 
ef13ebb
9d2ec4b
ef13ebb
3e89400
 
 
 
8f82d17
3e89400
 
 
9d2ec4b
7c82cab
b8972a5
9b50ad7
ef13ebb
9d2ec4b
ef13ebb
 
 
 
 
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
70
71
72
73
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)

        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)
        return merged_output_path

    return [os.path.join(session_id, f) for f in os.listdir(session_id)]

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)

    print("Processing completed!")
    if merge_files:
        return output_files

    zip_filename = create_zip(output_files, session_id)
    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()