|
import gradio as gr |
|
from pydub import AudioSegment |
|
from time import sleep |
|
|
|
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) |
|
|
|
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 = f"/tmp/{i}.{format}" |
|
chunk.export(file, format=format) |
|
yield file |
|
sleep(0.5) |
|
|
|
stream_as_file_btn.click( |
|
stream_file, [input_audio, format], stream_as_file_output |
|
) |
|
|
|
|
|
with gr.Column(): |
|
stream_as_bytes_btn = gr.Button("Stream as Bytes") |
|
stream_as_bytes_output = gr.Audio(format="bytes", streaming=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.queue().launch() |