File size: 2,411 Bytes
bf9c0e9
 
 
 
 
 
 
 
 
0afa9f0
bf9c0e9
 
 
 
 
 
 
 
cdef4d9
 
 
bf9c0e9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
cdef4d9
 
04fac4f
bf9c0e9
cdef4d9
04fac4f
 
bf9c0e9
 
 
 
 
2994563
bf9c0e9
 
 
 
 
 
 
 
 
 
 
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
import gradio as gr
import ffmpeg
import os
import tempfile
import re

gr.themes.Soft()

# Daftar format audio yang didukung
audio_formats = sorted(['MP3', 'WAV', 'AAC', 'FLAC', 'OGG', 'M4A', 'ALAC', 'WMA', 'AIFF', 'OPUS', 'APE', 'CAF', 'PCM', 'DTS', 'TTA', 'AMR', 'MID', 'SPX', 'WV', 'RA', 'TAK'])

def sanitize_filename(filename):
    """Sanitasi nama file dengan mengganti karakter khusus dan spasi."""
    filename = re.sub(r'[^a-zA-Z0-9_.-]', '_', filename)  # Ganti karakter yang tidak valid dengan '_'
    return filename

def convert_audio(audio_file, target_format):
    try:
        # Pastikan ffmpeg sudah terinstal
        ffmpeg.probe(audio_file)  # Cek keberadaan ffmpeg dan file yang valid

        # Membuat direktori sementara untuk file yang diunggah
        temp_dir = tempfile.mkdtemp()

        # Sanitasi nama file dan simpan audio yang diunggah ke direktori sementara
        base_name = os.path.splitext(os.path.basename(audio_file.name))[0]
        sanitized_base_name = sanitize_filename(base_name)
        audio_path = os.path.join(temp_dir, f"{sanitized_base_name}.mp3")  # Menyimpan sebagai mp3 secara default

        with open(audio_path, "wb") as f:
            f.write(audio_file.read())  # Menyimpan file audio yang diunggah

        output_file = f"{sanitized_base_name}_converted.{target_format.lower()}"
        ffmpeg.input(audio_path).output(output_file).run()  # Mengonversi audio ke format yang diinginkan

        return output_file
    except ffmpeg.Error as e:
        # Tangkap kesalahan ffmpeg dan tampilkan pesan error lebih rinci
        st.write(f"FFMPEG Error: {e.stderr.decode()}")
    except Exception as e:
        # Tangkap kesalahan lain dan tampilkan pesan error lebih rinci
        st.write(f"Error: {e}")
    return null

# Antarmuka Gradio dengan tema kustom untuk menyembunyikan footer
interface = gr.Interface(
    fn=convert_audio,
    inputs=[
        gr.File(label="Upload Audio File", type="filepath", file_types=[f'.{format}' for format in audio_formats]),
        gr.Dropdown(label="Select Target Format", choices=audio_formats)
    ],
    outputs=gr.File(label="Converted Audio File"),
    title="Audio Format Converter",
    description="Upload an audio file and select a target format for conversion. Supports multiple formats.",
    css="footer {visibility: hidden}"
)

# Jalankan aplikasi
if __name__ == "__main__":
    interface.launch()