mrblackdev's picture
Update app.py
d40b108 verified
import os
import moviepy as mp
from pydub import AudioSegment
from pydub.effects import normalize
from scipy.io.wavfile import read, write
import noisereduce as nr
import numpy as np
import gradio as gr
# --- FUNCIONES PARA EL PROCESAMIENTO DE AUDIO ---
def convert_audio_to_wav(input_file_path, wav_file_path):
"""Convierte cualquier archivo de audio a WAV usando pydub."""
audio = AudioSegment.from_file(input_file_path) # Cargar el archivo de audio
audio.export(wav_file_path, format="wav") # Exportar como WAV
def extract_audio(video_path, output_audio_path):
"""Extrae el audio de un video y lo guarda como un archivo de audio."""
video = mp.VideoFileClip(video_path)
video.audio.write_audiofile(output_audio_path)
def denoise_audio(input_audio_path, output_audio_path):
"""Aplica reducci贸n de ruido a un archivo de audio."""
rate, data = read(input_audio_path)
if data.ndim > 1: # Convertir a mono si el audio es est茅reo
data = np.mean(data, axis=1).astype(np.int16)
reduced_noise = nr.reduce_noise(y=data, sr=rate)
write(output_audio_path, rate, reduced_noise.astype(np.int16))
def process_audio(input_audio_path, output_audio_path):
"""Aplica mejoras como normalizaci贸n y ecualizaci贸n al audio."""
audio = AudioSegment.from_file(input_audio_path)
audio = normalize(audio) # Normaliza el volumen
# Opcional: Filtrar frecuencias no deseadas (ejemplo: ruido de baja frecuencia)
audio = audio.low_pass_filter(3000).high_pass_filter(100)
audio.export(output_audio_path, format="wav")
def replace_audio(video_path, new_audio_path, output_video_path):
"""Reemplaza el audio original de un video con uno procesado."""
video = mp.VideoFileClip(video_path)
audio = mp.AudioFileClip(new_audio_path)
video = video.set_audio(audio)
video.write_videofile(output_video_path, codec="libx264", audio_codec="aac")
# --- FUNCIONES PRINCIPALES PARA PROCESAR VIDEO O AUDIO ---
def process_video_audio(video_path, output_video_path):
"""Procesa el audio de un video y lo integra nuevamente."""
temp_audio_path = "temp_audio.wav"
temp_denoised_audio_path = "temp_denoised_audio.wav"
temp_processed_audio_path = "temp_processed_audio.wav"
# Extraer el audio del video
extract_audio(video_path, temp_audio_path)
# Reducir ruido del audio
denoise_audio(temp_audio_path, temp_denoised_audio_path)
# Procesar y mejorar el audio
process_audio(temp_denoised_audio_path, temp_processed_audio_path)
# Reemplazar el audio original en el video
replace_audio(video_path, temp_processed_audio_path, output_video_path)
# Limpiar archivos temporales
os.remove(temp_audio_path)
os.remove(temp_denoised_audio_path)
os.remove(temp_processed_audio_path)
def process_audio_file(input_audio_path, output_audio_path):
"""Procesa 煤nicamente un archivo de audio."""
temp_denoised_audio_path = "temp_denoised_audio.wav"
# Reducir ruido del audio
denoise_audio(input_audio_path, temp_denoised_audio_path)
# Procesar y mejorar el audio
process_audio(temp_denoised_audio_path, output_audio_path)
# Limpiar archivo temporal
os.remove(temp_denoised_audio_path)
# --- INTERFAZ GRADIO MEJORADA ---
def audio_processing_interface(video_file=None, audio_file=None):
if video_file is not None:
output_video_path = "processed_video.mp4"
process_video_audio(video_file.name, output_video_path)
return output_video_path
elif audio_file is not None:
output_audio_path = "processed_audio.wav"
process_audio_file(audio_file.name, output_audio_path)
return output_audio_path
# Interfaz Gradio Mejorada
iface = gr.Interface(
fn=audio_processing_interface,
inputs=[
gr.File(
label="Sube un video (para procesar su audio)",
type="filepath",
file_count="single",
file_types=[".mp4", ".avi", ".mov", ".mkv"],
),
gr.File(
label="O sube un archivo de audio",
type="filepath",
file_count="single",
file_types=[".mp3", ".wav", ".ogg", ".flac", ".aac"],
),
],
outputs=gr.File(label="Archivo Procesado"),
live=False,
title="Procesador de Audio y Video",
description="Sube un archivo de video o audio para procesarlo. El audio ser谩 mejorado (reducci贸n de ruido, normalizaci贸n) y, si es video, se reemplazar谩 el audio del video.",
)
iface.launch(share=True)