import gradio as gr from pydub import AudioSegment from time import sleep import os import tempfile from pathlib import Path with gr.Blocks() as demo: input_audio = gr.Audio(label="Input Audio", type="filepath", format="mp3") with gr.Row(): with gr.Column(): stream_as_file_btn = gr.Button("Stream as File") format = gr.Radio(["wav", "mp3"], value="wav", label="Format") stream_as_file_output = gr.Audio(streaming=True, elem_id="stream_as_file_output", autoplay=True, visible=False) def stream_file(audio_file, format): audio = AudioSegment.from_file(audio_file) i = 0 chunk_size = 1000 while chunk_size * i < len(audio): chunk = audio[chunk_size * i : chunk_size * (i + 1)] i += 1 if chunk: file = Path(tempfile.gettempdir()) / "stream_audio_demo" / f"{i}.{format}" file.parent.mkdir(parents=True, exist_ok=True) chunk.export(str(file), format=format) yield file sleep(0.5) stream_as_file_btn.click( stream_file, [input_audio, format], stream_as_file_output ) gr.Examples( [[os.path.join(os.path.dirname(__file__), "audio/cantina.wav"), "wav"], [os.path.join(os.path.dirname(__file__), "audio/cantina.wav"), "mp3"]], [input_audio, format], fn=stream_file, outputs=stream_as_file_output, cache_examples=False, ) with gr.Column(): stream_as_bytes_btn = gr.Button("Stream as Bytes") stream_as_bytes_output = gr.Audio(streaming=True, elem_id="stream_as_bytes_output", autoplay=True) def stream_bytes(audio_file): chunk_size = 20_000 with open(audio_file, "rb") as f: while True: chunk = f.read(chunk_size) if chunk: yield chunk sleep(1) else: break stream_as_bytes_btn.click(stream_bytes, input_audio, stream_as_bytes_output) if __name__ == "__main__": demo.launch()