SubSync / app.py
mrblackdev's picture
La app en questión.
da7fa56 verified
raw
history blame
2.82 kB
import gradio as gr
import os
from moviepy.editor import VideoFileClip
import speech_recognition as sr
import noisereduce as nr
import pydub
def extract_audio(video_path):
"""Extrae el audio del video y devuelve la ruta del archivo de audio."""
audio_path = "temp_audio.wav"
video = VideoFileClip(video_path)
audio = video.audio
audio.write_audiofile(audio_path)
audio.close()
video.close()
return audio_path
def split_audio(audio_path, segment_duration=10):
"""Divide el audio en segmentos más pequeños y devuelve la lista de rutas."""
audio = pydub.AudioSegment.from_wav(audio_path)
segments = []
for i in range(0, len(audio), segment_duration * 1000):
segment = audio[i:i + segment_duration * 1000]
segment_path = f'segment_{i // 1000}.wav'
segment.export(segment_path, format='wav')
segments.append(segment_path)
return segments
def convert_audio_to_text(audio_path):
"""Convierte el audio a texto utilizando SpeechRecognition."""
recognizer = sr.Recognizer()
with sr.AudioFile(audio_path) as source:
audio_data = recognizer.record(source)
# Reduce el ruido (ajusta según sea necesario)
audio_data = nr.reduce_noise(y=audio_data, sr=16000)
try:
text = recognizer.recognize_google(audio_data, language='es-ES')
return text
except sr.UnknownValueError:
return "[No se pudo reconocer el audio]"
except sr.RequestError:
return "[Error en la solicitud]"
def generate_subtitles(video_path):
"""Genera subtítulos a partir de un video."""
audio_path = extract_audio(video_path)
segments = split_audio(audio_path)
subtitles = []
for index, segment in enumerate(segments):
text = convert_audio_to_text(segment)
# Agregar el texto de cada segmento a la lista de subtítulos
subtitles.append((index * 10, (index + 1) * 10, text)) # Asumiendo segmentos de 10 segundos
# Generar el archivo de subtítulos SRT
srt_path = "subtitles.srt"
with open(srt_path, 'w') as f:
for i, (start, end, subtitle) in enumerate(subtitles):
f.write(f"{i + 1}\n")
f.write(f"00:00:{start:02},000 --> 00:00:{end:02},000\n")
f.write(f"{subtitle}\n\n")
# Limpiar los segmentos temporales
for segment in segments:
os.remove(segment)
os.remove(audio_path)
return srt_path
# Crear la interfaz de Gradio
iface = gr.Interface(
fn=generate_subtitles,
inputs=gr.inputs.File(label="Sube tu video"),
outputs=gr.outputs.File(label="Descargar subtítulos"),
title="Generador de Subtítulos",
description="Convierte el audio de un video en subtítulos automáticamente."
)
if __name__ == "__main__":
iface.launch()