Spaces:
Running
Running
import gradio as gr | |
import os | |
import ffmpeg | |
import shutil | |
# Function to split the audio file using FFmpeg | |
def split_audio_ffmpeg(input_audio, output_directory, chunk_duration=30): | |
""" | |
Split an audio file into smaller chunks using FFmpeg. | |
:param input_audio: Path to the input audio file | |
:param output_directory: Directory where output chunks will be saved | |
:param chunk_duration: Duration of each chunk in seconds | |
""" | |
os.makedirs(output_directory, exist_ok=True) | |
try: | |
# Get the total duration of the audio file using ffmpeg.probe() | |
probe = ffmpeg.probe(input_audio.name, v='error', select_streams='a', show_entries='stream=duration') | |
duration = float(probe['streams'][0]['duration']) | |
print(f"Audio duration: {duration} seconds") | |
# Split the file into chunks | |
chunks = [] | |
for i in range(0, int(duration), chunk_duration): | |
chunk_file = os.path.join(output_directory, f"chunk_{i // chunk_duration + 1}.mp3") | |
ffmpeg.input(input_audio.name, ss=i, t=chunk_duration).output(chunk_file).run(quiet=True, overwrite_output=True) | |
chunks.append(chunk_file) | |
print(f"Generated: {chunk_file}") | |
# Create a zip archive of the chunks | |
zip_filename = '/tmp/audio_chunks.zip' | |
shutil.make_archive(zip_filename.replace('.zip', ''), 'zip', output_directory) | |
return zip_filename | |
except Exception as e: | |
print(f"Error during split: {e}") | |
return f"Error during file processing: {e}" | |
# Gradio interface function | |
def process_audio(input_audio): | |
output_directory = "/tmp/output_chunks" | |
zip_file = split_audio_ffmpeg(input_audio, output_directory, chunk_duration=30) | |
# Check if zip creation was successful | |
if "Error" in zip_file: | |
return zip_file | |
return gr.File(zip_file) | |
# Gradio interface setup | |
interface = gr.Interface( | |
fn=process_audio, | |
inputs=gr.File(label="Upload Audio", file_types=["audio"]), | |
outputs=gr.File(label="Download Chunks as Zip"), | |
title="Audio Splitter", | |
description="Upload an audio file to split it into smaller chunks of 30 seconds each and download as a zip.", | |
) | |
# Launch the Gradio interface | |
if __name__ == "__main__": | |
interface.launch() | |