import gradio as gr import speech_recognition as sr # Libreria de Audio from ttsmms import TTS from deep_translator import GoogleTranslator import subprocess # Libreria para procesamiento de comandos cmd para video import os import time # Libreria para manejo de tiempos import math # Libreria matemática, usada para redondeo de cifras from threading import Thread # Librería para manejo de Hilos de procesamiento from num2words import num2words # Liberia para convertir de numeros a texto import re # Libreria para buscar caracteres en un string # Idioma de ingreso input_language = 'es-ES' output_audio_format = 'mp3' output_video_format = 'mp4' # Inicializa el modelo TTS para los idiomas soportados spanish = TTS("data/spa") #español english = TTS("data/eng") #inglés misak = TTS("data/gum") #misak quechua = TTS("data/quz") #quechua # Crea la lista de idiomas soportados para traducir y su modelo TTS correspondiente #langs = [{"lang": 'spanish', "tts": spanish}, {"lang": 'english', "tts": english}, {"lang": 'guarani', "tts": misak}, {"lang": 'quechua', "tts": quechua}] langs = [{"lang": 'english', "tts": english}, {"lang": 'quechua', "tts": quechua}, {"lang": 'spanish', "tts": spanish}] # *************************** MÉTODOS *************************** # TEXT TO TEXT: Función que convierte texto a texto def text_to_text(text, lang, logs_file): tiempo = time.ctime().split() print(tiempo[3] + " - Traduciendo el texto a texto en el idioma seleccionado...") logs_file.write(tiempo[3] + " - Traduciendo el texto a texto en el idioma seleccionado...\n") selected_lang = next((lang_item for lang_item in langs if lang_item["lang"] == lang), None) # Busca el idioma seleccionado en la lista de idiomas disponibles if selected_lang is None: raise ValueError(f"Lenguaje '{lang}' no disponible.") if text.isdigit(): text = num2words (text, lang='es', ordinal=False) # Convierte de numeros a el numero pero en texto (Ej: 2024 -> dos mil veinticuatro) else: # Sino revisa si alguna de las palabras que componen la frase, es un número text_split = text.split() i=0 for word in text_split: if word.isdigit(): text_split[i] = num2words(word, lang='es', ordinal=False) if word.startswith("$"): # Revisa si es valor de moneda: $2000 word = word.replace("$","") if word.isdigit(): text_split[i] = num2words(word, lang='es', ordinal=False) + " pesos" # Convierte de numeros a el numero pero en texto (Ej: 2024 -> dos mil veinticuatro) if word.endswith("%"): # Revisa si es valor de porcentaje: 12.24% word = word.replace("%","") if word.isdigit(): try: text_split[i] = num2words(word, lang='es', ordinal=False) + " por ciento" # Convierte de numeros a el numero pero en texto (Ej: 2024 -> dos mil veinticuatro) except NotImplementedError: None if word.count(".") == 1: word_split = word.split(".") word_split[0] = num2words(word_split[0], lang='es', ordinal=False) + " punto" word_split[1] = num2words(word_split[1], lang='es', ordinal=False) + " por ciento" text_split[i] = ' '.join(word_split) i += 1 text = ' '.join(text_split) text_translated = GoogleTranslator(source='auto', target=lang).translate(text) # Traduce el texto al idioma seleccionado usando Google Translator if text_translated.isdigit(): try: text_translated = num2words (text_translated, lang=lang, ordinal=False) # Convierte de numeros a el numero pero en texto (Ej: 2024 -> dos mil veinticuatro) except NotImplementedError: None else: # Sino revisa si alguna de las palabras que componen la frase, es un número text_split = text_translated.split() i=0 for word in text_split: if word.isdigit(): try: text_split[i] = num2words(word, lang=lang, ordinal=False) # Convierte de numeros a el numero pero en texto (Ej: 2024 -> dos mil veinticuatro) except NotImplementedError: None if word.startswith("$"): # Revisa si es valor de moneda: $2000 word = word.replace("$","") if word.isdigit(): try: text_split[i] = num2words(word, lang=lang, ordinal=False) + " pesos" # Convierte de numeros a el numero pero en texto (Ej: 2024 -> dos mil veinticuatro) except NotImplementedError: None if word.endswith("%"): # Revisa si es valor de porcentaje: 12.24% word = word.replace("%","") if word.isdigit(): try: text_split[i] = num2words(word, lang=lang, ordinal=False) + " percent" # Convierte de numeros a el numero pero en texto (Ej: 2024 -> dos mil veinticuatro) except NotImplementedError: None if word.count(".") == 1: word_split = word.split(".") word_split[0] = num2words(word_split[0], lang=lang, ordinal=False) + " point" word_split[1] = num2words(word_split[1], lang=lang, ordinal=False) + " percent" text_split[i] = ' '.join(word_split) i += 1 text_translated = ' '.join(text_split) months = ['January','january','February','february','March','march','April','april','May','may','June','june','July','july','August','august','September','september','October','october','November','november','December','december'] for month in months: # Busca si hay fechas en el string con formato americano: August 10, 2025. date_full_founded = re.search(month + " .., .....$", text_translated) # August 26, 2024. Con el punto al final del año date_founded = re.search(month + " ..,", text_translated) # August 26, if date_full_founded != None: date = date_full_founded.group() # Captura el dato de la fecha date_split = date.split() # Separa el mes y el día day = date_split[1].replace(",","") # Elimina la coma ',' del número del dia de la fecha year = date_split[2].replace(".","") if day.isdigit(): day = num2words (day, lang=lang, ordinal=False) + "," # Convierte de numeros a el numero pero en texto (Ej: 2024 -> dos mil veinticuatro) if year.isdigit(): year = num2words (year, lang=lang, ordinal=False) + "." # Convierte de numeros a el numero pero en texto (Ej: 2024 -> dos mil veinticuatro) text_translated = text_translated.replace(date, month + " " + day + " " + year) # Reemplaza el antiguo formato por el nuevo formato if date_founded != None: date = date_founded.group() # Captura el dato de la fecha date_split = date.split() # Separa el mes y el día day = date_split[1].replace(",","") # Elimina la coma ',' del número del dia de la fecha if day.isdigit(): day = num2words (day, lang=lang, ordinal=False) + "," # Convierte de numeros a el numero pero en texto (Ej: 2024 -> dos mil veinticuatro) text_translated = text_translated.replace(date, month + " " + day) # Reemplaza el antiguo formato por el nuevo formato tiempo = time.ctime().split() print(tiempo[3] + " - Texto traducido: ", text_translated) logs_file.write(tiempo[3] + " - Texto traducido: " + text_translated + "\n") return text_translated # TEXT TO AUDIO: Función que convierte texto a audio def text_to_audio(text, lang, logs_file): tiempo = time.ctime().split() print(tiempo[3] + " - Convirtiendo el texto extraido a audio en el idioma seleccionado...") logs_file.write(tiempo[3] + " - Convirtiendo el texto extraido a audio en el idioma seleccionado...\n") selected_lang = next((lang_item for lang_item in langs if lang_item["lang"] == lang), None) # Busca el idioma seleccionado en la lista de idiomas disponibles if selected_lang is None: raise ValueError(f"Lenguaje '{lang}' no disponible.") selected_tts = selected_lang["tts"] if text.isdigit(): text = num2words (text, lang='es', ordinal=False) # Convierte de numeros a el numero pero en texto (Ej: 2024 -> dos mil veinticuatro) else: # Sino revisa si alguna de las palabras que componen la frase, es un número text_split = text.split() i=0 for word in text_split: if word.isdigit(): text_split[i] = num2words(word, lang='es', ordinal=False) if word.startswith("$"): # Revisa si es valor de moneda: $2000 word = word.replace("$","") if word.isdigit(): text_split[i] = num2words(word, lang='es', ordinal=False) + " pesos" # Convierte de numeros a el numero pero en texto (Ej: 2024 -> dos mil veinticuatro) if word.endswith("%"): # Revisa si es valor de porcentaje: 12.24% word = word.replace("%","") if word.isdigit(): try: text_split[i] = num2words(word, lang='es', ordinal=False) + " por ciento" # Convierte de numeros a el numero pero en texto (Ej: 2024 -> dos mil veinticuatro) except NotImplementedError: None if word.count(".") == 1: word_split = word.split(".") word_split[0] = num2words(word_split[0], lang='es', ordinal=False) + " punto" word_split[1] = num2words(word_split[1], lang='es', ordinal=False) + " por ciento" text_split[i] = ' '.join(word_split) i += 1 text = ' '.join(text_split) text_translated = text_to_text(text, lang, logs_file) # Traduce el texto al idioma seleccionado usando Google Translator wav_path = "audio_output." + output_audio_format selected_tts.synthesis(text_translated, wav_path=wav_path) # Genera el audio y lo graba como un archivo WAV tiempo = time.ctime().split() print(tiempo[3] + " - Audio traducido generado: ",wav_path) logs_file.write(tiempo[3] + " - Audio traducido generado: " + wav_path + "\n") return wav_path, text_translated # AUDIO TO TEXT: Función que convierte audio a texto usando Google's speech recognition API def audio_to_text(audio_file, logs_file): tiempo = time.ctime().split() print(tiempo[3] + " - Convirtiendo el audio a texto...") logs_file.write(tiempo[3] + " - Convirtiendo el audio a texto...\n") r = sr.Recognizer() with sr.AudioFile(audio_file) as source: audio = r.record(source) try: text = r.recognize_google(audio, language=input_language) tiempo = time.ctime().split() print(tiempo[3] + " - Reconocimiento de texto obtenido del audio: ",text) logs_file.write(tiempo[3] + " - Reconocimiento de texto obtenido del audio: " + text + "\n") return text except sr.UnknownValueError: print("Google Speech Recognition no pudo transcribir el audio.") logs_file.write("Google Speech Recognition no pudo transcribir el audio.\n") return None except sr.RequestError: print("Reconocimiento de audio no disponible.") logs_file.write("Reconocimiento de audio no disponible.\n") return None # VIDEO TO AUDIO: Función que extrae el audio del video def video_to_audio(video_file, output_audio_ext, logs_file): tiempo = time.ctime().split() print(tiempo[3] + " - Extrayendo el audio del video...") logs_file.write(tiempo[3] + " - Extrayendo el audio del video...\n") filename, ext = os.path.splitext(video_file) # Se extrae el nombre del archivo y su extensión subprocess.call(["ffmpeg", "-y", "-i", video_file, "-ar", "16000", "-ac", "1", f"{filename+'_audio'}.{output_audio_ext}"], # Se extrae el archivo de audio del video stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT) audio_video = filename + "_audio." + output_audio_ext tiempo = time.ctime().split() print(tiempo[3] + " - Audio extraido: ",audio_video) logs_file.write(tiempo[3] + " - Audio extraido: " + audio_video + "\n") return audio_video # VIDEO TO VIDEO: Función que concatena audio con el video traducido def video_to_video(video_file, audio_file_traslated, output_video_ext, logs_file): length_video = get_length_video(video_file) # Se obtiene la duración del video print("length_video: ", length_video) tiempo = time.ctime().split() print(tiempo[3] + " - Procesando el video para obtenerlo sin audio...") logs_file.write(tiempo[3] + " - Procesando el video para obtenerlo sin audio...\n") filename, ext = os.path.splitext(video_file) # Se extrae el nombre del archivo y su extensión subprocess.call(["ffmpeg", "-y", "-i", video_file, "-an", f"{filename+'_muted'}.{output_video_ext}"], stdout=subprocess.DEVNULL, # Se extrae el video sin audio stderr=subprocess.STDOUT) video_mute = filename + "_muted." + output_video_ext length_video_mute = round(get_length_video(video_mute),3) # Se obtiene la duración del video print("length_video_mute: ", length_video_mute) length_audio = round(get_length_video(audio_file_traslated),3) print("length_audio: ", length_audio) if length_video_mute > length_audio: # Se determina el largo del video subtitulado, si es mas largo el video muted o el audio length_video_subtitled = str(length_video_mute) if length_audio > length_video_mute: length_video_subtitled = str(length_audio) tiempo = time.ctime().split() print(tiempo[3] + " - Doblando el video con el audio traducido...") logs_file.write(tiempo[3] + " - Doblando el video con el audio traducido...\n") #subprocess.call(["ffmpeg", "-y", "-i", video_mute, "-i", audio_file_traslated, "-shortest", f"{filename+'_traslated'}.{output_video_ext}"], subprocess.call(["ffmpeg", "-y", "-i", video_mute, "-i", audio_file_traslated, "-t", length_video_subtitled, f"{filename+'_traslated'}.{output_video_ext}"], stdout=subprocess.DEVNULL, # Se concatena el video sin audio con el audio traducido stderr=subprocess.STDOUT) video_traslated = filename + "_traslated." + output_video_ext tiempo = time.ctime().split() print(tiempo[3] + " - Video traducido: ",video_traslated) logs_file.write(tiempo[3] + " - Video traducido: " + video_traslated + "\n") return video_traslated # VIDEO TO VIDEO SUBTITULADO: Función que coloca subtitulos traducidos al video def video_to_video_subtitled(video_file, text_traslated, output_video_ext, logs_file): tiempo = time.ctime().split() print(tiempo[3] + " - Procesando el video subtitulado...") logs_file.write(tiempo[3] + " - Procesando el video subtitulado...\n") subtitles = text_traslated.split() filename, ext = os.path.splitext(video_file) # Se extrae el nombre del archivo y su extensión length_video = get_length_video(video_file) # Se obtiene la duración del video miliseg, seg = math.modf(length_video) # Se obtienen los milisegundos de la duración del video miliseg_video = int(round(miliseg,3)*1000) # Se pasa el número de milisegundos de flotante a entero if miliseg_video == 0: miliseg_video = "000" length_line_subtitle = math.ceil(len(subtitles)/length_video) # Rate de palabras por segundo de video i=0 j=0 subtitles_line = [] print("length_video", length_video) print("length_line_subtitle", length_line_subtitle) print("length_video//length_line_subtitle: ", length_video//length_line_subtitle) print("len(subtitles)", len(subtitles)) while i < length_video//length_line_subtitle: # Ciclo para timming de subtítulos while j < len(subtitles): line = ' '.join(subtitles[j:j+length_line_subtitle]) # Concatena palabras en una frase de acuerdo al rate de palabras subtitles_line.append(line) # Inserta la frase en el vector final de subtítulos j += length_line_subtitle i += 1 subtitles_file = open(f"{'video_subtitles'}.srt","w+") # Se genera el archivo de subtítulos .srt i=0 while i < len(subtitles_line): if len(subtitles_line)-i > 1: subtitles_content = (''''''+str(i+1)+''' '''+ time.strftime('%H:%M:%S', time.gmtime(i)) + ''',001 --> ''' + time.strftime('%H:%M:%S', time.gmtime(i+1)) + ''',000 --> ''' + ''' '''''''''+ subtitles_line[i] +'''''' ''' ''') if len(subtitles_line)-i == 1: # Revisa si es la ultima línea para agregar los milisegundos finales subtitles_content = (''''''+str(i+1)+''' '''+ time.strftime('%H:%M:%S', time.gmtime(i)) + ''',001 --> ''' + time.strftime('%H:%M:%S', time.gmtime(i+1)) + ''',''' + str(miliseg_video) + ''' --> ''' + ''' '''''''''+ subtitles_line[i] +'''''' ''' ''') subtitles_file.write(subtitles_content) i += 1 subtitles_file.close() subprocess.call(["ffmpeg", "-y", "-copyts", "-i", video_file, "-vf", "subtitles=video_subtitles.srt:force_style='Fontname=Futura,Fontsize=20,MarginV=50,Shadow=1'", f"{filename+'_subtitled'}.{output_video_ext}"], stdout=subprocess.DEVNULL, # Se insertan los subtitulos al video con el audio original stderr=subprocess.STDOUT) video_subtitled = filename + "_subtitled." + output_video_ext tiempo = time.ctime().split() print(tiempo[3] + " - Video subtitulado: ",video_subtitled) logs_file.write(tiempo[3] + " - Video subtitulado: " + video_subtitled + "\n") return video_subtitled def get_length_video(filename): result = subprocess.run(["ffprobe", "-v", "error", "-show_entries", "format=duration", "-of", "default=noprint_wrappers=1:nokey=1", filename], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) return float(result.stdout) # *************************** MAIN *************************** # ************************** ROUTER ************************** # ROUTER: Función para transcribir video, audio y texto al lenguaje seleccionado def multimedia_to_multimedia_app(lang_input, video_file_upload, audio_file_upload, video_file_webcam, audio_file_microphone, text_input): tiempo = time.ctime().split() logs_file = open("logs.txt","w+") logs_file.write("LOGS TRADUCTOR MULTILENGUAJE\n") if video_file_webcam and lang_input: print("PROCESANDO GRABACIÓN VIDEO DE LA WEBCAM") logs_file.write("PROCESANDO GRABACIÓN VIDEO DE LA WEBCAM\n") print(tiempo[3] + " - Traduciendo el video grabado: " + video_file_webcam + " al idioma " + lang_input) logs_file.write(tiempo[3] + " - Traduciendo el video grabado: " + video_file_webcam + " al idioma " + lang_input + "\n") text_transcribed = convert_video_to_text_app(lang_input, video_file_webcam, logs_file) if text_transcribed.isdigit(): # Revisa si la frase completa es un número text_transcribed = num2words (text_transcribed, lang='es', ordinal=False) # Convierte de numeros a el numero pero en texto (Ej: 2024 -> dos mil veinticuatro) else: # Sino revisa si alguna de las palabras que componen la frase, es un número text_split = text_transcribed.split() i=0 for word in text_split: if word.isdigit(): text_split[i] = num2words(word, lang='es', ordinal=False) if word.startswith("$"): # Revisa si es valor de moneda: $2000 word = word.replace("$","") if word.isdigit(): text_split[i] = num2words(word, lang='es', ordinal=False) + " pesos" # Convierte de numeros a el numero pero en texto (Ej: 2024 -> dos mil veinticuatro) if word.endswith("%"): # Revisa si es valor de porcentaje: 12.24% word = word.replace("%","") if word.isdigit(): try: text_split[i] = num2words(word, lang='es', ordinal=False) + " por ciento" # Convierte de numeros a el numero pero en texto (Ej: 2024 -> dos mil veinticuatro) except NotImplementedError: None if word.count(".") == 1: word_split = word.split(".") word_split[0] = num2words(word_split[0], lang='es', ordinal=False) + " punto" word_split[1] = num2words(word_split[1], lang='es', ordinal=False) + " por ciento" text_split[i] = ' '.join(word_split) i += 1 text_transcribed = ' '.join(text_split) audio_traslated, text_translated = text_to_audio(text_transcribed, lang_input, logs_file) return_video_subtitled = [None]*1 return_video_traslated = [None]*1 hilo_video_subtitled = Thread(target=convert_video_to_video_subtitled_app, args=(video_file_webcam, text_translated,logs_file,return_video_subtitled,)) hilo_video_traslated = Thread(target=convert_video_to_video_app, args=(video_file_webcam, audio_traslated,logs_file,return_video_traslated,)) hilo_video_subtitled.start() hilo_video_traslated.start() hilo_video_subtitled.join() hilo_video_traslated.join() video_subtitled = return_video_subtitled[0] video_traslated = return_video_traslated[0] print("FIN PROCESO GRABACIÓN VIDEO DE LA WEBCAM") logs_file.write("FIN PROCESO GRABACIÓN VIDEO DE LA WEBCAM\n") logs_file.close() return text_transcribed, text_translated, audio_traslated, video_subtitled, video_traslated if audio_file_microphone and lang_input: print("PROCESANDO GRABACIÓN AUDIO DEL MICRÓFONO") logs_file.write("PROCESANDO GRABACIÓN AUDIO DEL MICRÓFONO\n") print(tiempo[3] + " - Traduciendo el audio grabado " + audio_file_microphone + " al idioma " + lang_input) logs_file.write(tiempo[3] + " - Traduciendo el audio grabado " + audio_file_microphone + " al idioma " + lang_input + "\n") text_translated, text_transcribed, audio_traslated = convert_audio_to_audio_app(lang_input,audio_file_microphone,logs_file) video_subtitled = None video_traslated = None print("FIN PROCESO GRABACIÓN AUDIO DEL MICRÓFONO") logs_file.write("FIN PROCESO GRABACIÓN AUDIO DEL MICRÓFONO\n") logs_file.close() if text_transcribed.isdigit(): text_transcribed = num2words (text_transcribed, lang='es', ordinal=False) # Convierte de numeros a el numero pero en texto (Ej: 2024 -> dos mil veinticuatro) else: # Sino revisa si alguna de las palabras que componen la frase, es un número text_split = text_transcribed.split() i=0 for word in text_split: if word.isdigit(): text_split[i] = num2words(word, lang='es', ordinal=False) if word.startswith("$"): # Revisa si es valor de moneda: $2000 word = word.replace("$","") if word.isdigit(): text_split[i] = num2words(word, lang='es', ordinal=False) + " pesos" # Convierte de numeros a el numero pero en texto (Ej: 2024 -> dos mil veinticuatro) if word.endswith("%"): # Revisa si es valor de porcentaje: 12.24% word = word.replace("%","") if word.isdigit(): try: text_split[i] = num2words(word, lang='es', ordinal=False) + " por ciento" # Convierte de numeros a el numero pero en texto (Ej: 2024 -> dos mil veinticuatro) except NotImplementedError: None if word.count(".") == 1: word_split = word.split(".") word_split[0] = num2words(word_split[0], lang='es', ordinal=False) + " punto" word_split[1] = num2words(word_split[1], lang='es', ordinal=False) + " por ciento" text_split[i] = ' '.join(word_split) i += 1 text_transcribed = ' '.join(text_split) return text_transcribed, text_translated, audio_traslated, video_subtitled, video_traslated if video_file_upload and lang_input: print("PROCESANDO ARCHIVO DE VIDEO") logs_file.write("PROCESANDO ARCHIVO DE VIDEO\n") print(tiempo[3] + " - Traduciendo el video ingresado " + video_file_upload + " al idioma " + lang_input) logs_file.write(tiempo[3] + " - Traduciendo el video ingresado " + video_file_upload + " al idioma " + lang_input + "\n") text_transcribed = convert_video_to_text_app(lang_input,video_file_upload,logs_file) if text_transcribed.isdigit(): text_transcribed = num2words (text_transcribed, lang='es', ordinal=False) # Convierte de numeros a el numero pero en texto (Ej: 2024 -> dos mil veinticuatro) else: # Sino revisa si alguna de las palabras que componen la frase, es un número text_split = text_transcribed.split() i=0 for word in text_split: if word.isdigit(): text_split[i] = num2words(word, lang='es', ordinal=False) if word.startswith("$"): # Revisa si es valor de moneda: $2000 word = word.replace("$","") if word.isdigit(): text_split[i] = num2words(word, lang='es', ordinal=False) + " pesos" # Convierte de numeros a el numero pero en texto (Ej: 2024 -> dos mil veinticuatro) if word.endswith("%"): # Revisa si es valor de porcentaje: 12.24% word = word.replace("%","") if word.isdigit(): try: text_split[i] = num2words(word, lang='es', ordinal=False) + " por ciento" # Convierte de numeros a el numero pero en texto (Ej: 2024 -> dos mil veinticuatro) except NotImplementedError: None if word.count(".") == 1: word_split = word.split(".") word_split[0] = num2words(word_split[0], lang='es', ordinal=False) + " punto" word_split[1] = num2words(word_split[1], lang='es', ordinal=False) + " por ciento" text_split[i] = ' '.join(word_split) i += 1 text_transcribed = ' '.join(text_split) audio_traslated, text_translated = text_to_audio(text_transcribed, lang_input,logs_file) return_video_subtitled = [None]*1 return_video_traslated = [None]*1 hilo_video_subtitled = Thread(target=convert_video_to_video_subtitled_app, args=(video_file_upload, text_translated,logs_file,return_video_subtitled,)) hilo_video_traslated = Thread(target=convert_video_to_video_app, args=(video_file_upload, audio_traslated,logs_file,return_video_traslated,)) hilo_video_subtitled.start() hilo_video_traslated.start() hilo_video_subtitled.join() hilo_video_traslated.join() video_subtitled = return_video_subtitled[0] video_traslated = return_video_traslated[0] print("FIN PROCESO ARCHIVO DE VIDEO") logs_file.write("FIN PROCESO ARCHIVO DE VIDEO\n") logs_file.close() return text_transcribed, text_translated, audio_traslated, video_subtitled, video_traslated if audio_file_upload and lang_input: print("PROCESANDO ARCHIVO DE AUDIO") logs_file.write("PROCESANDO ARCHIVO DE AUDIO\n") print(tiempo[3] + " - Traduciendo el audio ingresado " + audio_file_upload + " al idioma " + lang_input) logs_file.write(tiempo[3] + " - Traduciendo el audio ingresado " + audio_file_upload + " al idioma " + lang_input + "\n") text_translated, text_transcribed, audio_traslated = convert_audio_to_audio_app(lang_input,audio_file_upload,logs_file) video_subtitled = None video_traslated = None print("FIN PROCESO ARCHIVO DE AUDIO") logs_file.write("FIN PROCESO ARCHIVO DE AUDIO\n") logs_file.close() if text_transcribed.isdigit(): text_transcribed = num2words (text_transcribed, lang='es', ordinal=False) # Convierte de numeros a el numero pero en texto (Ej: 2024 -> dos mil veinticuatro) else: # Sino revisa si alguna de las palabras que componen la frase, es un número text_split = text_transcribed.split() i=0 for word in text_split: if word.isdigit(): text_split[i] = num2words(word, lang='es', ordinal=False) if word.startswith("$"): # Revisa si es valor de moneda: $2000 word = word.replace("$","") if word.isdigit(): text_split[i] = num2words(word, lang='es', ordinal=False) + " pesos" # Convierte de numeros a el numero pero en texto (Ej: 2024 -> dos mil veinticuatro) if word.endswith("%"): # Revisa si es valor de porcentaje: 12.24% word = word.replace("%","") if word.isdigit(): try: text_split[i] = num2words(word, lang='es', ordinal=False) + " por ciento" # Convierte de numeros a el numero pero en texto (Ej: 2024 -> dos mil veinticuatro) except NotImplementedError: None if word.count(".") == 1: word_split = word.split(".") word_split[0] = num2words(word_split[0], lang='es', ordinal=False) + " punto" word_split[1] = num2words(word_split[1], lang='es', ordinal=False) + " por ciento" text_split[i] = ' '.join(word_split) i += 1 text_transcribed = ' '.join(text_split) return text_transcribed, text_translated, audio_traslated, video_subtitled, video_traslated if text_input and lang_input: print("PROCESANDO TEXTO INGRESADO") logs_file.write("PROCESANDO TEXTO INGRESADO\n") print(tiempo[3] + " - Traduciendo el texto ingresado " + text_input + " al idioma " + lang_input) logs_file.write(tiempo[3] + " - Traduciendo el texto ingresado " + text_input + " al idioma " + lang_input + "\n") if text_input.isdigit(): # Revisa si la frase completa es un número text_input = num2words(text_input, lang='es', ordinal=False) # Convierte de numeros a el numero pero en texto (Ej: 2024 -> dos mil veinticuatro) else: # Sino revisa si alguna de las palabras que componen la frase, es un número text_split = text_input.split() i=0 for word in text_split: if word.isdigit(): text_split[i] = num2words(word, lang='es', ordinal=False) if word.startswith("$"): # Revisa si es valor de moneda: $2000 word = word.replace("$","") if word.isdigit(): text_split[i] = num2words(word, lang='es', ordinal=False) + " pesos" # Convierte de numeros a el numero pero en texto (Ej: 2024 -> dos mil veinticuatro) if word.endswith("%"): # Revisa si es valor de porcentaje: 12.24% word = word.replace("%","") if word.isdigit(): try: text_split[i] = num2words(word, lang='es', ordinal=False) + " por ciento" # Convierte de numeros a el numero pero en texto (Ej: 2024 -> dos mil veinticuatro) except NotImplementedError: None if word.count(".") == 1: word_split = word.split(".") word_split[0] = num2words(word_split[0], lang='es', ordinal=False) + " punto" word_split[1] = num2words(word_split[1], lang='es', ordinal=False) + " por ciento" text_split[i] = ' '.join(word_split) i += 1 text_input = ' '.join(text_split) audio_traslated, text_translated = text_to_audio(text_input, lang_input, logs_file) video_subtitled = None video_traslated = None print("FIN PROCESO TEXTO INGRESADO") logs_file.write("FIN PROCESO TEXTO INGRESADO\n") logs_file.close() return text_input, text_translated, audio_traslated, video_subtitled, video_traslated if not lang_input: print("Error - Lenguaje no ingresado") raise gr.Error("Debes ingresar el idioma a traducir") # Muestra la alerta si no se ingresa un idioma a traducir # *************************** SERVICIOS *************************** # t2t: Traducir el texto a texto en el idioma deseado def convert_text_to_text_app(lang_input, text_to_translate, logs_file): if text_to_translate: print("Traduciendo texto " + text_to_translate + " al idioma " + lang_input) logs_file.write("Traduciendo texto " + text_to_translate + " al idioma " + lang_input + "\n") text_translated = text_to_text(text_to_translate, lang_input, logs_file) return text_translated # a2t: Transcribir el audio a texto def convert_audio_to_text_app(lang_input, audio_file, logs_file): if audio_file: print("Convirtiendo audio " + audio_file + " al idioma " + lang_input) logs_file.write("Convirtiendo audio " + audio_file + " al idioma " + lang_input + "\n") text_translated = audio_to_text(audio_file, logs_file) return text_translated # a2a: Transcribir el audio a texto y de texto al audio traducido def convert_audio_to_audio_app(lang_input, audio_file, logs_file): if audio_file: print("Traduciendo audio " + audio_file + " al idioma deseado...") logs_file.write("Traduciendo audio " + audio_file + " al idioma deseado...\n") text_transcribed = audio_to_text(audio_file, logs_file) audio_traslated, text_translated = text_to_audio(text_transcribed, lang_input, logs_file) return text_translated, text_transcribed, audio_traslated # v2t: Convertir video a audio usando 'ffmpeg' con módulo 'subprocess' def convert_video_to_text_app(lang_input,video_file, logs_file, output_audio_ext="wav"): print("Procesando video " + video_file + " para convertirlo a texto...") logs_file.write("Procesando video " + video_file + " para convertirlo a texto...\n") audio_video = video_to_audio(video_file, output_audio_ext, logs_file) text_translated = convert_audio_to_text_app(lang_input,audio_video, logs_file) return text_translated # v2v: Convertir video a video def convert_video_to_video_app(video_file, audio_file_traslated, logs_file, return_video_traslated, output_video_ext=output_video_format): print("Procesando video " + video_file + " para traducirlo...") logs_file.write("Procesando video " + video_file + " para traducirlo...\n") video_traslated = video_to_video(video_file, audio_file_traslated, output_video_ext,logs_file) return_video_traslated[0] = video_traslated #return video_traslated # v2vs: Convertir video a video subtitulado def convert_video_to_video_subtitled_app(video_file, text_translated, logs_file, return_video_subtitled, output_video_ext=output_video_format): print("Procesando video " + video_file + " para subtitularlo...") logs_file.write("Procesando video " + video_file + " para subtitularlo...\n") video_subtitled = video_to_video_subtitled(video_file, text_translated, output_video_ext, logs_file) return_video_subtitled[0] = video_subtitled #return video_subtitled # *************************** INTERFAZ *************************** # Entradas y salidas en la interfaz Gradio lang_input = gr.components.Dropdown(choices=[lang["lang"] for lang in langs], label="Selecciona el idioma al cual deseas traducir:*") #video_input_file = gr.Video(label= "Noticias Caracol", value="https://www.caracoltv.com/senal-vivo") #video_input_file = gr.Video(label= "Noticias Caracol", value="D:/Noticias/noticias_caracol_long.mp4") video_input_file = gr.Video() video_input_file = gr.Video(label= "Noticias Caracol", source="upload") video_input_webcam = gr.Video(label= "Noticias Caracol en vivo", source="webcam", include_audio=1) #audio_input_file = gr.Audio(label="Blue Radio", value="D:/Noticias/caracol_radio.mp3") audio_input_file = gr.Audio(label="Blue Radio", source="upload", type="filepath") audio_input_microphone = gr.Audio(label="Blue Radio en vivo", source="microphone", type="filepath") text_input = gr.components.Textbox(label="Noticia a traducir:") output_text_transcribed = gr.components.Textbox(label="Transcripción") output_text_traslated = gr.components.Textbox(label="Traducción") output_audio = gr.components.Audio(label="Audio traducido", format=output_audio_format) output_video_subtitled = gr.components.Video(label="Noticia subtitulada", format=output_video_format) output_video_traslated = gr.components.Video(label="Noticia traducida", format=output_video_format) """"""""" embed_html = '' with gr.Blocks() as interface: gr.HTML(embed_html) """"""""" # Crea la interfaz Gradio para multimedia_to_multimedia_app interface = gr.Interface( fn=multimedia_to_multimedia_app, inputs=[lang_input, video_input_file, audio_input_file, video_input_webcam, audio_input_microphone, text_input], outputs=[output_text_transcribed, output_text_traslated, output_audio, output_video_subtitled, output_video_traslated], title="TRADUCTOR MULTILENGUA DE NOTICIAS | AYTÉ - CARACOL", description="Ingresa la noticia que deseas traducir:", #theme = gr.themes.Soft() theme=gr.themes.Default(primary_hue="blue") ) #interface.launch() # Lanza la interfaz #interface.launch(share=True, auth=("caracol", "caracol"), server_name=("127.0.0.1"), server_port=(7860), favicon_path=()) interface.launch()