File size: 4,566 Bytes
d3aec91
449fe14
d3aec91
 
 
 
 
 
 
 
 
379b8de
 
 
 
 
d3aec91
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9d4c812
d3aec91
 
 
 
 
 
 
 
 
 
 
 
379b8de
d3aec91
 
 
379b8de
 
 
 
 
 
 
 
 
 
 
 
d3aec91
 
379b8de
 
 
d3aec91
 
379b8de
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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)