AudioTexto / app.py
RenanOF's picture
Update app.py
1dfed8b verified
import gradio as gr
from transformers import pipeline
from pydub import AudioSegment
from pydub.utils import make_chunks
import tempfile
import os
# Inicialize o modelo Whisper com um modelo otimizado para CPU
transcriber = pipeline(
"automatic-speech-recognition",
model="openai/whisper-tiny", # Use modelos menores para maior velocidade
device="cpu" # Certifique-se de usar CPU, já que está na versão gratuita
)
# Função para dividir áudios longos em trechos menores (30 segundos)
def split_audio(audio_path, chunk_length=30_000):
audio = AudioSegment.from_file(audio_path)
chunks = make_chunks(audio, chunk_length) # Divide em trechos de 30 segundos
return chunks
# Função para comprimir áudio (ajustar taxa de amostragem, etc.)
def compress_audio(audio_path):
audio = AudioSegment.from_file(audio_path)
compressed_audio = audio.set_frame_rate(16000).set_channels(1).set_sample_width(2)
compressed_path = tempfile.NamedTemporaryFile(suffix=".wav", delete=False).name
compressed_audio.export(compressed_path, format="wav")
return compressed_path
# Função para transcrever o áudio
def transcribe(audio_file):
try:
# Verifique o tamanho do arquivo (máx. 60 MB)
if os.path.getsize(audio_file) > 60 * 1024 * 1024:
return "Erro: O arquivo excede o limite de 60 MB. Por favor, envie um áudio menor."
# Comprimir o áudio antes de processar
compressed_audio = compress_audio(audio_file)
# Divida o áudio em partes
chunks = split_audio(compressed_audio)
full_transcription = []
# Processar cada parte separadamente
for i, chunk in enumerate(chunks):
with tempfile.NamedTemporaryFile(suffix=".wav", delete=True) as temp_chunk:
chunk.export(temp_chunk.name, format="wav")
transcription = transcriber(temp_chunk.name, return_timestamps=False)["text"]
full_transcription.append(f"[Parte {i+1}]: {transcription}")
return "\n".join(full_transcription)
except Exception as e:
return f"Erro ao processar áudio: {str(e)}"
# Interface gráfica com Gradio
with gr.Blocks() as demo:
gr.Markdown("# 🎙️ Whisper Transcription - Suporte a Áudios Longos (60 Minutos / 60 MB)")
with gr.Row():
with gr.Column(scale=1):
gr.Markdown("### 1️⃣ Envie seu áudio (máx. 60 MB e 60 minutos)")
audio_input = gr.Audio(type="filepath", label="Envie um arquivo de áudio")
with gr.Column(scale=1):
gr.Markdown("### 2️⃣ Resultado da transcrição")
transcription_output = gr.Textbox(label="Transcrição", lines=15, interactive=False)
transcribe_button = gr.Button("🚀 Transcrever")
# Vincular ação ao botão
transcribe_button.click(transcribe, inputs=[audio_input], outputs=[transcription_output])
# Rodar a aplicação
demo.launch(share=True)