Activa JavaScript para disfrutar de los vídeos de la Mediateca.
Zhenkai y Andrew - Desarrollo - Contenido educativo
Ajuste de pantallaEl ajuste de pantalla se aprecia al ver el vídeo en pantalla completa. Elige la presentación que más te guste:
Buenas, pues yo soy Andrew Kovach y él es Tenka Iso
00:00:00
y vamos a hacer nuestra presentación acerca de nuestro trabajo de fin de grado
00:00:04
Policablot
00:00:07
El contenido que vamos a dar en esta presentación es una pequeña introducción
00:00:09
acerca de nuestro proyecto, cómo funciona todo el proceso de traducción
00:00:15
que es el más importante dentro de nuestro proyecto
00:00:19
que va desde cliente a API a procesador
00:00:21
el procesador es lo que traduce el vídeo
00:00:24
y cómo traducir los vídeos desde un cliente de Android
00:00:26
y cómo traduce el vídeo desde un cliente de web.
00:00:30
Bueno, pues la introducción.
00:00:36
¿En qué consiste?
00:00:38
Pues el proyecto consiste en un servicio de traducción de vídeos hecho con IA
00:00:39
para todas aquellas personas que necesitan traducir sus vídeos de una manera más simple,
00:00:44
no como algunos otros servicios como vid.io,
00:00:50
que lo que tienes que hacer es subir tu vídeo, es un editor de vídeo online más que otra cosa,
00:00:55
pero no es como subir tu vídeo
00:00:59
y editar los subtítulos
00:01:01
sino es más
00:01:05
subir el vídeo y te hace los subtítulos solo
00:01:05
es muy simple, el proceso está hecho para ser simple
00:01:08
y está hecho
00:01:10
para que cualquier persona pueda traducir vídeos
00:01:12
¿y sobre qué usan?
00:01:14
pues Backend está desarrollando
00:01:16
con Byton y como parte de
00:01:18
APIs hemos decidido
00:01:20
con Flash y como parte del proceso
00:01:22
o sea la parte que procesa el vídeo y tal
00:01:24
pues hay tres librerías más importantes
00:01:26
Una sería MoVPY, que consigue hacer ediciones de vídeo y audio, y Wister, que es la IA del OpenAI, que trabaja para convertir el audio a texto, y una API de DPL para hacer traducción, y luego tenemos un cliente de Android y luego otra de un cliente web hecha con React, y como base de datos hemos utilizado MongoDB, y también hemos implementado toda la parte de Docker, AWS y eso.
00:01:28
Luego, ¿con qué objetivos hemos hecho este proyecto?
00:01:59
Pues los dos objetivos principales para cumplir este proyecto fueron el implementar APIs de IA,
00:02:02
ya sea con API DeepL o con Whisper o con cualquier otra,
00:02:08
pero poder implementar una IA que nos sirva para poder traducir los vídeos.
00:02:13
Y luego también la práctica de uso de servicios como de Backend Tracer Service o de Cloud,
00:02:17
como sería Firebase, que es un backend as a service, o de Cloud, que sería AWS con el tema de instancias y todo este tipo de cosas.
00:02:24
Pues, ¿cómo funciona la traducción en corto, así en sencillito?
00:02:32
Pues tenemos los clientes, la API y el procesador, que es el video procesador.
00:02:37
Pues los clientes preguntarán a la API si puede subir un video, si la API dice que sí, pues se subirá el video
00:02:41
y se llamará la API para su traducción.
00:02:46
La API guardará la traducción de un proceso en la base de datos y lanzará al procesor desde otro hilo distinto
00:02:48
y cuando se termine ese hilo de traducir, actualizará la base de datos en función de si la traducción ha sido correcta o no.
00:02:55
Y el procesador empleará todo el procesamiento, simplemente.
00:03:03
Los clientes. Tenemos cuatro etapas principales para el tema de clientes.
00:03:11
pues tenemos el pre-request
00:03:16
que es como yo llamo
00:03:18
el proceso de subir un vídeo que no tenga
00:03:20
subtitulado, que no tiene nada
00:03:22
básicamente, el subir el vídeo
00:03:24
como tal a Firebase, el upload request
00:03:26
y la espera del cliente
00:03:28
pues digamos que yo
00:03:30
Andrew, quiero subir un vídeo
00:03:32
a mi servicio, pues primero voy a tener
00:03:34
que subir el vídeo diciéndole, vale, quiero subir
00:03:36
este vídeo con este título, con este idioma
00:03:38
original y con este idioma objetivo
00:03:40
y la API va a decir
00:03:42
pues vale, ok, pues
00:03:44
el vídeo está apto o no. Si el vídeo es apto, pues me va a devolver una ruta dentro
00:03:46
de Firebase, que es donde el cliente va a tener que guardar el vídeo. Lo subirá en
00:03:50
esa ruta de Firebase y ahora el cliente hará una segunda pregunta, que lo querrá traducir.
00:03:54
Cuando lo vaya a traducir, lo que va a decirle es, quiero traducir este vídeo con este ID
00:04:01
a X idioma que me permita. Pues la app dirá que sí o que no y si es que sí, pues pondrá
00:04:06
todo el trabajo de proceso
00:04:14
del hilo distinto donde traduce el vídeo
00:04:16
y le dirá que el vídeo está en proceso
00:04:18
no le dirá que está correctamente traducido
00:04:21
o que no, solo pondrá que está en proceso
00:04:22
porque el proceso dura mucho tiempo
00:04:24
y el usuario tendrá que
00:04:26
esperar
00:04:28
en la parte de API pues hemos utilizado
00:04:29
Flask
00:04:35
RESTX y para la persistencia Mongo
00:04:36
Mongo porque es el
00:04:38
MongoDB
00:04:41
hemos utilizado porque es hacer una estructura de datos
00:04:42
más fácil
00:04:45
o sea más simple
00:04:45
lo hemos querido meter dentro de
00:04:47
así que uno vaya dentro de otro
00:04:50
así es mucho más fácil buscar los vídeos
00:04:53
las traducciones dentro de un vídeo
00:04:54
y mucho más fácil buscar todos los vídeos
00:04:56
dentro de los usuarios
00:04:58
nos quitamos todos los problemas
00:04:59
que nos daría la normalización
00:05:01
y luego pues hemos usado Flask
00:05:02
y una librería muy importante de Flask
00:05:05
que sería RestX
00:05:06
que Flask es para todo el tema de manejos
00:05:07
de peticiones y todo esto
00:05:10
pero es muy modular
00:05:13
viene con nada, viene vacío, es básicamente express
00:05:14
el equivalente, así que
00:05:17
lo que vamos a implementar es esta línea
00:05:19
de RESTX que nos trae
00:05:21
un montón de temas de recursos
00:05:23
de espacios de nombre
00:05:25
que son por resumir controladores
00:05:26
por así decirlo, y un montón
00:05:29
de cosas para poder organizar bien más
00:05:31
la arquitectura de una API
00:05:32
bueno, pues la API tiene
00:05:34
cuatro fases en el proceso de subir un vídeo
00:05:36
el upload request que viene de antes
00:05:38
la descarga del vídeo, la traducción
00:05:40
y la respuesta, pues el upload request
00:05:43
pues como he dicho antes
00:05:45
el cliente va a decirle
00:05:46
que quiere subir un vídeo
00:05:49
el cliente
00:05:50
y lo que va a hacer la API es buscar ese vídeo
00:05:52
y si ese vídeo existe
00:05:55
busca el vídeo en seco, el que no tiene
00:05:56
subtítulos, se lo descarga
00:05:59
y se lo descarga dentro de una carpeta temporal
00:06:00
dentro de nuestra API tendremos una carpeta
00:06:03
que es tmp y un id muy largo
00:06:05
el idioma original y el idioma
00:06:07
objetivo y dentro de esa carpeta
00:06:09
se descargará
00:06:11
el archivo de vídeo
00:06:12
el que no tiene nada
00:06:14
luego esa ruta de carpeta
00:06:16
y ese archivo se le pasará al procesador
00:06:18
y se le mandará el proceso
00:06:20
se le mandará una respuesta al cliente
00:06:21
para que no tenga timeouts
00:06:24
pues en siguiente
00:06:25
entramos a la parte
00:06:30
pues en resumen también se puede
00:06:32
dividir en cuatro
00:06:35
partes, nos gustan cuatro
00:06:36
bueno, primero se trabaja
00:06:39
de separar el
00:06:41
coger el vídeo que hemos descargado del proceso anterior, separar el vídeo, o sea, sacamos su audio como .wav
00:06:43
y luego convertimos a texto con Whisper y traducirlo y ir guardando en un fichero Json.
00:06:49
Y luego, cuando termina este proceso, convertir a Json a un fichero de subtítulo .srt.
00:06:56
Al final sería fusionar este subtítulo con el vídeo.
00:07:01
Y luego explicamos más detalles de cada parte.
00:07:05
primero
00:07:09
separar el vídeo y audio
00:07:11
lo que hace es dos procesos
00:07:13
una de separar el audio
00:07:16
con Mobi2i
00:07:17
que coge el vídeo
00:07:19
y intenta sacar el audio
00:07:21
y segundo
00:07:25
que va a intentar reducir el ruido
00:07:26
de ese audio
00:07:28
y guardar
00:07:30
en otra llamando
00:07:33
a audio reducido
00:07:34
y después de sacado el audio
00:07:36
llegamos a convertir
00:07:43
el texto y traducir
00:07:45
pues aquí
00:07:48
se trabaja con varias cosas
00:07:49
primero, dividir
00:07:52
el chunks
00:07:53
lo llamo como un trozo de vídeo
00:07:54
para repartir
00:07:58
el trabajo, para luego
00:08:00
el trabajo en paralelo
00:08:01
en forma asíncrona
00:08:02
y luego
00:08:04
con chunks que se ha dividido
00:08:06
pues pasamos a concurrent future que he usado para esta librería para trabajar el paralelo y
00:08:09
aquí te va mostrando, esto es consola de nuestra API que va mostrando que dice que va a ejecutar
00:08:15
por ejemplo tres procesos paralelos y cada proceso pues que es que se va a ir transcribiendo con
00:08:21
Whisper, un proceso de transcribir realmente que tiene dos inteligentes artificiales, una es Whisper
00:08:28
que convierte ese audio a texto y la otra es el buy and not speak diarization, eso es
00:08:35
para anotar el hablante, para anotarlo al speaker y con la lista que hemos sacado con
00:08:43
estas dos, al final sacamos un resultado final y con este resultado final pasamos a traducir
00:08:51
y ir guardando en JSON. Después de haber terminado todos los procesos de IRO, que tiene
00:08:58
un fichero JSON así guardado, eso va a ser un formato de ejemplo que tiene texto, texto
00:09:09
traducido, tiempo de inicio, tiempo de final y quién está hablando. Y luego convertimos
00:09:15
esta JSO a un fichero SRT que va a ser formado así. Y al final cogemos ese fichero SRT y
00:09:21
fusionamos, o sea, juntamos con el vídeo y obtenemos el resultado final de un vídeo
00:09:32
traducido, o sea, con subtítulo traducido añadido. Y bueno, pues ahora vamos a mostrar
00:09:41
¿Cómo se traduce un vídeo? ¿Desde un cliente Android o un cliente web?
00:09:47
Pues desde un cliente Android
00:09:53
Dime
00:09:56
Ah sí, se olvidó añadir que una vez que termine el proceso de traducción
00:09:59
Y se suba todo a Firebase
00:10:04
Bueno, sería el de eso
00:10:05
En parte de audio, se me ha olvidado
00:10:06
Bueno, un hombre famoso, americano
00:10:09
Eso es un audio así, separado, original
00:10:13
no ha reducido el ruido
00:10:18
que tiene como un poco
00:10:19
el ruido de las brillas ahí y tal
00:10:24
aquí es como más
00:10:26
queda más limpio, se ha quitado
00:10:34
el sonido ese de riendo o tal
00:10:36
y ya está
00:10:38
ah sí, y cabe recalcar que una vez que termina
00:10:42
de hacer todo este proceso de traducción
00:10:44
y subirlo a Firebase, este vídeo final
00:10:46
todos los contenidos dentro de esa
00:10:48
carpeta temporal se borran. Se borra absolutamente todo. Así que lo único que se va a quedar
00:10:50
es lo que se haya subido a Firebase y lo que queden las bases de datos. Un poco más.
00:10:57
Ahora, ¿para cómo funciona una traducción en un cliente Android? Aquí pues tenemos
00:11:05
al cliente Android, pues habría que hacer un login. Aquí puede ser utilizado el usuario
00:11:14
de test, test, el típico usuario
00:11:18
y tras token que va generando
00:11:20
y esto es lo que va a generar
00:11:22
y esto es lo que va a generar
00:11:23
por seguridad un JWT
00:11:25
o sea un JSON Web Token
00:11:28
en el que dentro de ese JSON Web Token
00:11:29
tiene encriptado con una
00:11:31
clave que tiene la API
00:11:33
el email
00:11:35
que ha hecho sesión
00:11:37
la fecha de cuando ha hecho sesión
00:11:39
y hasta cuanto dura el token
00:11:41
y hace todas estas comprobaciones
00:11:42
y mientras que hace cada petición
00:11:45
pues va a permitirte
00:11:47
recibir algo
00:11:50
en el cliente o no
00:11:50
o sea, si el token no es válido
00:11:53
directamente no te va a mostrar nada
00:11:55
en este caso no lo he mostrado
00:11:56
pero
00:11:59
en este caso
00:11:59
voy a subir un vídeo, esto lo que hace es
00:12:03
lanzar
00:12:05
lo que va a hacer es
00:12:06
primero se va a ver esta pantalla de aquí
00:12:09
que tiene una serie de cartas con un montón
00:12:10
de vídeos
00:12:12
y se va a mostrar un textito
00:12:14
de si está en proceso
00:12:17
o de si está disponible
00:12:19
o si está en error, pues pone que está en error
00:12:20
si está en error va a tener que ser borrado
00:12:22
se le da el botoncito
00:12:24
que estaba aquí abajo a la derecha
00:12:27
para lanzar una segunda actividad
00:12:29
para poder subir un vídeo
00:12:30
se hace un file picker
00:12:32
para poder elegir un vídeo
00:12:35
y en este caso yo he elegido este
00:12:36
sale así porque el principio del vídeo
00:12:37
es negro
00:12:41
así que lo que va a hacer es coger el primer frame
00:12:42
que tenga el vídeo
00:12:44
con una librería que no me acuerdo el nombre ahora mismo
00:12:45
pero va a coger el primer frame del vídeo
00:12:48
y lo va a poner como una thumbnail para que se pueda ver
00:12:50
que ese vídeo está subiendo, porque no querrías
00:12:52
poner un vídeo para un proceso de media hora
00:12:54
sería horrible
00:12:56
luego le pones un título
00:12:57
le pones un título, que en este caso le he puesto
00:12:59
Kuzgesart
00:13:02
que es el canal de Youtube
00:13:03
el canal de Youtube del vídeo
00:13:05
si lo hago bien
00:13:07
y luego cuando le das al botón
00:13:08
Salen unos drop-down menus que te dan a elegir el idioma original del vídeo,
00:13:11
que tienes que especificarlo porque si no te va a dar mal la traducción
00:13:17
y no se puede autodetectar.
00:13:20
O si se puede, lo que pasa es que triplicaría el tiempo de proceso
00:13:23
y por simplificar el proceso es mejor decir cuál es el idioma original y ya está.
00:13:27
Y luego el idioma objetivo, que en este caso lo he puesto en español.
00:13:32
El idioma original es inglés y el vídeo traducir es español.
00:13:35
una vez que le da a este botón de upload file
00:13:38
va a llamar a request
00:13:40
esto lo he editado porque el proceso en realidad
00:13:42
dura entero media hora, es un proceso
00:13:44
muy largo, pero lo que va a hacer
00:13:46
es
00:13:48
hacer este pre-request
00:13:48
le dirá, vale bien, el vídeo está bien
00:13:52
el cliente lo subirá a Firebase
00:13:53
mostrará este texto una vez que ya está subido
00:13:55
y va a llamar
00:13:58
a este upload
00:14:00
que es para traducir el vídeo como tal
00:14:01
y ya pues el cliente
00:14:03
se está descargando el vídeo
00:14:06
si el cliente está descargando el vídeo
00:14:07
y
00:14:10
por simplificar
00:14:11
pues esto también lo he citado
00:14:14
pues una vez que te vayas
00:14:15
al
00:14:18
ya puedes salir del activity y ya vas a ver
00:14:19
que el vídeo está en proceso
00:14:22
una vez el vídeo está en proceso
00:14:23
pues va
00:14:25
a seguir sacando el resultado
00:14:26
y el proceso está
00:14:28
exacto, la consola va
00:14:30
a mostrar ahora mismo que está
00:14:32
es que no se ve ahora mismo pero está
00:14:34
utilizando uno de Torch
00:14:35
que es el de
00:14:38
poder transcribir el texto
00:14:39
el audio a texto
00:14:41
y para poder
00:14:43
diferenciarlos
00:14:44
la persona que está hablando
00:14:47
este es el proceso que se está sacando aquí
00:14:48
que dura 10 minutos, alrededor de 10-15 minutos
00:14:51
dependiendo de la longitud del vídeo
00:14:53
y a partir de ahí
00:14:54
lo que va a hacer es
00:14:58
generarte un Json gigantesco
00:15:00
con todo lo que contiene el vídeo
00:15:03
y luego de SJSON
00:15:05
se va a traducir
00:15:09
usando la API de DPL
00:15:11
esta parte se da un resultado
00:15:12
que se ha sacado con Whisper
00:15:15
que es una lista que tiene
00:15:16
toda la información
00:15:18
posible información con tiempo
00:15:20
el texto de cada
00:15:22
que han sacado
00:15:23
tenemos que hacer algún proceso
00:15:25
para
00:15:28
coger la cadena bien
00:15:28
cadena texto
00:15:32
o sea como que sale
00:15:34
cada palabra y palabra
00:15:37
tenemos que juntarlo a como cadena de texto
00:15:38
y pasarlo a
00:15:41
cada cadena
00:15:43
y ir pasando al DPL a la traducción
00:15:44
y esto va a sacar
00:15:47
cada cadena, cada cadena
00:15:51
y luego pues esto lo he hecho para poder mostrar más o menos
00:15:52
el proceso
00:15:55
¿qué qué?
00:15:56
15 minutos
00:15:58
pues luego pues
00:15:59
para ver el proceso y demostrar
00:16:03
el contenido de esta carpeta temporal
00:16:04
que lo que ha hecho es crear una instancia de Docker
00:16:06
y en esta instancia de Docker he linkado la carpeta temporal
00:16:08
a la carpeta temporal dentro de la API en Docker
00:16:10
y aquí se puede ver
00:16:12
el proceso
00:16:15
el proceso del vídeo original
00:16:15
luego cómo pasa el extra del audio
00:16:18
luego cómo se reduce el audio
00:16:20
luego cómo lo divide en chunks
00:16:21
luego cómo le saca json
00:16:23
y a partir de ahí
00:16:24
voy traduciendo
00:16:27
hasta que
00:16:29
llega a terminar
00:16:32
eliminar el archivo SRT y ahí estaba escribiendo el vídeo final juntando el SRT que había generado y el vídeo
00:16:34
y los está juntando, que esto también es un proceso que dura mucho, que este proceso en realidad dura muchísimo más
00:16:45
de lo que pone aquí, o sea, dura mucho más de lo que pone aquí. Ahora va a estar en 1% pero va a saltar porque está editado.
00:16:50
y luego pues va a subir
00:16:55
va a subir el vídeo
00:16:58
a esta URI dentro de Firebase
00:17:00
la de RAW vídeos y todo este
00:17:02
y termina la carpeta temporal
00:17:04
y como podéis ver
00:17:08
si hago un ls
00:17:11
intentando ver la carpeta otra vez
00:17:12
no existe la carpeta porque ha sido borrada
00:17:14
y luego cuando recargo
00:17:16
la página, cuando recargo
00:17:18
la aplicación de Android
00:17:19
aquí sale disponible
00:17:22
para poder
00:17:24
verse, se le da aquí
00:17:26
y ahí sale
00:17:28
no se puede ver porque está pequeñito
00:17:32
pero ahí salen los subtítulos
00:17:34
en español
00:17:36
y el proceso es similar
00:17:38
en web
00:17:42
si queréis
00:17:43
os lo mostramos
00:17:45
si da tiempo
00:17:47
es básicamente
00:17:49
es básicamente lo mismo
00:17:51
esa es la calidad
00:17:59
solo por dos
00:18:00
Sería lo mismo, pero solo he cambiado un poco la interfaz, porque he hecho con redact,
00:18:03
javascript y la diseño he hecho con bootstrap.
00:18:10
Aquí primero se piden como lo de un prerequest, que es idioma original y tal.
00:18:13
Eso ya ha llegado al segundo, sería request, subir vídeo y tal.
00:18:25
Eso es un parado de proceso, lo que he contado de usef y de esa.
00:18:29
al final no he conseguido la solución
00:18:34
y creo que en esa versión he comentado
00:18:37
y aquí ya tiene, bueno, aquí se ve mejor
00:18:47
como veis que el vídeo que ya tiene como un subtítulo
00:18:50
y ya está
00:18:55
vale, el tiempo lo habéis, lo habéis, por tiempo de
00:19:05
que queréis, la pista, el vídeo que queréis traducir
00:19:10
¿Los tiempos? ¿Habéis hecho una tabla de tiempos?
00:19:14
Lo hemos intentado.
00:19:17
No hemos hecho una tabla como tal, pero hemos hecho varios de un minuto, dos minutos, cinco minutos.
00:19:19
O sea, de diez minutos.
00:19:25
Sí, la relación es por la cantidad de palabras dentro del vídeo, no es por la duración del vídeo.
00:19:27
Claro, porque podrías tener un vídeo entero de...
00:19:32
Porque eso lo he probado yo también, un vídeo entero de Pedro Sánchez con aplausos.
00:19:34
Sí, porque son diez segundos de vídeo hablando, pero otros 50 segundos de vídeo aplaudiendo.
00:19:38
Y como podréis pensar, pues no tarda nada.
00:19:43
O sea, tardó 10 minutos en traducirlo.
00:19:46
Y luego separáis la parte de audio en formato WAV.
00:19:55
Sí.
00:20:01
Porque eso no podéis convertirlo a MP3.
00:20:02
Sí, se puede convertir a MP3, pero por evitarnos temas de pérdidas de datos
00:20:07
o pérdida de calidad o lo que sea cuando se reduzca el audio,
00:20:11
teníamos miedo, así que utilizamos WAV,
00:20:13
porque es en donde mejor se consigue el audio.
00:20:15
Claro, pero ¿por qué se tarda más?
00:20:20
Se tarda más, pero no era un cambio considerable.
00:20:22
De hecho, en hacer el web tarda en total creo que medio segundo.
00:20:25
O sea, no tarda nada.
00:20:29
¿En hacer el web se tiene que anotar?
00:20:29
No, de hecho no se anota.
00:20:31
De hecho, lanzas la petición, tarda un segundo y ya tienes el audio hecho.
00:20:32
En principio...
00:20:37
Lo que tarda es en hacer las llamadas de APIs,
00:20:37
transcribir el vídeo, traducirlo,
00:20:41
Reinsertar
00:20:43
Pasarlo a subtítulos
00:20:45
Reinsertarlo a vídeo
00:20:47
Esos son los cinco procesos que tardan
00:20:49
Pero el de pasarlo a WAV
00:20:50
Y reducir el audio, tarda cero
00:20:53
No tarda nada
00:20:54
O sea, en principio hemos hecho una versión con MP3 también
00:20:55
Pero la calidad de traducción así
00:20:58
Para decirlo, que no sale muy bien
00:21:00
Y para hacer esa balance
00:21:02
Entre como la calidad
00:21:05
Y la velocidad
00:21:07
Cogemos a WAV, sobre todo
00:21:08
Vale, y luego lo que comentabais
00:21:10
Esto ya es por curiosidad.
00:21:13
¿El contenedor del Docker y eso lo habéis conseguido?
00:21:15
Sí, de hecho.
00:21:18
Esto está hecho con el contenedor del Docker.
00:21:20
Muy bien.
00:21:22
Pues muy bien, nada.
00:21:23
Yo felicitaros.
00:21:24
El proyecto me ha parecido interesante, me parece bien
00:21:26
y además la exposición me parece que la habéis hecho muy bien.
00:21:29
Así que yo felicitaros.
00:21:32
Yo ayer lo dije a Mayo
00:21:39
pero quería hablar con Fernando
00:21:41
que con eso me va bien.
00:21:42
si tienes luego enseñamos un vídeo
00:21:44
con enteros así
00:21:46
lo que es que he visto que tenéis problemas con la codificación
00:21:47
los acentos y todo eso
00:21:51
sí, pero eso es por el tema
00:21:52
de la traducción que DeepL
00:21:54
algunos caracteres no funcionan
00:21:56
de hecho con japonés algunas veces daba problemas
00:21:58
por ejemplo, si te hacía la traducción en japonés
00:22:00
te tiraba el vídeo y daba error
00:22:02
porque simplemente por la codificación en ese retenido
00:22:03
así que por eso nos hemos abstraído de hacer vídeos en chino y en japonés
00:22:05
también es por el tema
00:22:08
si consideramos bien
00:22:11
al final creo que tengo una lista
00:22:14
de idioma y su encoding
00:22:17
pero creo que no he conseguido
00:22:18
un completo
00:22:20
encoding correspondiente
00:22:21
con idioma, si llego a completar
00:22:25
esa tabla, a lo mejor
00:22:27
el resultado sale más bonito
00:22:28
otro problema que también tenía Docker
00:22:31
era que para el tema de los subtítulos
00:22:33
por eso a veces que los caracteres son raros
00:22:34
en MoviePy
00:22:37
para hacer los subtítulos usa Arial
00:22:38
y Arial es de Windows, así que
00:22:40
Arial no te viene una imagen de Ubuntu
00:22:42
clásica, así que si podéis ver
00:22:45
si veis en la memoria
00:22:47
o donde sea, vais a poder en una parte
00:22:49
del Docker, que me descargo las fuentes
00:22:51
de Arial, tengo que hacer unos cambios
00:22:53
en
00:22:55
ImageMagick para que funcione bien el tema
00:22:56
de fuentes, extraigo
00:22:59
todo y pongo todos esos archivos
00:23:01
de fuentes
00:23:03
dentro de los archivos de fuentes de Ubuntu
00:23:05
pero eso lo tenía que hacer porque
00:23:07
MoviePy me lo estaba tirando, me estaba tirando por la fuente
00:23:08
de Arial y por eso
00:23:11
algunos caracteres también no salen
00:23:12
pero sí
00:23:14
lo que estamos guardando en la base de datos
00:23:15
es del usuario
00:23:26
su username, su email
00:23:28
y los vídeos
00:23:31
una
00:23:32
ah sí, claro, esto no lo he mencionado
00:23:34
su contraseña, pero su contraseña
00:23:36
encriptada con un salt
00:23:38
o sea, porque por todo el tema
00:23:40
del salt and pepper
00:23:42
lo hasheamos con salt
00:23:44
y también guardamos el salt
00:23:45
luego dentro de los vídeos
00:23:47
y dentro de los vídeos guardamos
00:23:50
el idioma original y la ruta que tiene
00:23:51
dentro de Firebase
00:23:54
y luego ese vídeo también tendrá sus traducciones
00:23:55
y las traducciones guardamos
00:23:57
la idea de la traducción
00:23:59
la ruta de Firebase y no sé qué más
00:24:01
creo que eso y ya está
00:24:04
con el texto de la traducción
00:24:05
no, lo borramos
00:24:11
intentamos hacer en un principio
00:24:12
el tema de en vez de hacer un vídeo
00:24:15
completo y irlo guardando en Firebase
00:24:17
guardar los SRTs
00:24:19
y luego esos SRTs
00:24:21
incrustarlos en el vídeo
00:24:23
junto al streaming de Firebase
00:24:24
pero
00:24:26
sencillamente no se podía porque en la aplicación de web
00:24:27
sí se puede, pero en la de Android
00:24:31
en ExoPlayer no hay documentación
00:24:32
acerca de cómo poner subtítulos SRT
00:24:35
dentro de ExoPlayer, lo busqué
00:24:36
no lo encontré y teníamos que avanzar
00:24:38
de alguna manera, así que
00:24:41
avanzamos con esta y si daba tiempo
00:24:42
íbamos a usar los SRTs, como no dio tiempo
00:24:44
pues incrustamos
00:24:47
los subtítulos y ya está.
00:24:49
La idea principal, hemos decidido
00:24:50
que ir saliendo en tiempo real
00:24:52
pero es
00:24:56
otra dificultad de hacerlo, pues
00:24:58
hemos decidido procesar un vídeo entero y añadir
00:25:00
un subtítulo y sacamos el vídeo así.
00:25:02
El problema en general fue ExoPlayer,
00:25:05
que es la librería de
00:25:06
mostrar vídeos de Android.
00:25:08
No, yo decía, ya que tenéis
00:25:11
el texto y los vídeos y todo eso,
00:25:12
tenéis ahí un cañón
00:25:17
de bases de datos
00:25:18
con textos de vídeos,
00:25:19
que luego os va a permitir hacer búsquedas
00:25:21
a partir de determinadas expresiones
00:25:26
en qué vídeos aparecen, en qué contextos
00:25:29
Podríamos haberlo intentado
00:25:31
Podríamos haberlo intentado
00:25:33
y de hecho también queríamos implementar un tema de tags
00:25:42
para que cada vídeo tuviese su tag, por ejemplo
00:25:44
y se pudiera organizar de alguna manera
00:25:46
pero no tuvimos tiempo sencillamente
00:25:50
porque ambos estuvimos arreglando
00:25:52
un poco el tema del procesador de vídeo
00:25:54
porque estaban demasiados problemas
00:25:56
estaban problemas de que se hacía fácil
00:25:57
porque esas librerías están dispensadas
00:25:59
para ser usadas con una GPU
00:26:02
como estábamos usando AWS
00:26:04
en Academy
00:26:05
no tenemos uso de GPUs
00:26:09
así que tuvimos que maquinar la idea
00:26:10
o sea maquinarnos para poder utilizar
00:26:12
solo procesador y que no petara
00:26:14
así que tuvimos que optimizar en eso
00:26:15
queríamos haber expandido más pero es que no tuvimos tiempo
00:26:18
creo que llevamos una semana entera
00:26:20
para solamente hacer el docker
00:26:21
exacto, o sea una semana y media quizá
00:26:23
y luego tuve que añadir librerías de C++
00:26:24
dentro del docker
00:26:27
estaría guay
00:26:28
y el
00:26:33
cuando hacéis
00:26:34
cuando partís el audio
00:26:39
para poder trabajar de forma
00:26:41
¿cómo calculáis?
00:26:43
¿cómo se llama?
00:26:46
chunk
00:26:47
eso es
00:26:47
preguntar unas semanas
00:26:50
ha sido como dividimos el tamaño
00:26:53
la pregunta va por si optimizas de alguna manera
00:26:56
eso que habéis dicho
00:27:01
hay trozos o vídeos que
00:27:02
no tienen tanto el personaje hablando
00:27:04
y entonces ese se hace muy rápido
00:27:09
entonces eso de alguna manera
00:27:11
lo contempláis o no
00:27:13
o directamente lo habéis dividido
00:27:14
lo que he hecho es
00:27:16
hay un librería
00:27:18
Ahora no me acuerdo el nombre
00:27:20
Pero se detecta el silencio
00:27:24
O sea, ahí he configurado
00:27:25
Por ejemplo, si se corta
00:27:28
En principio sería como un silencio de 5 segundos
00:27:29
Si detecta un silencio de 5 segundos
00:27:32
Se corta ahí
00:27:34
Y ahí hace un chon
00:27:35
Y si detecta siguiente, hace un chon
00:27:36
Y luego, en vez de 5 minutos
00:27:38
He puesto, en vez de como dinámica
00:27:41
Algumente como 5 minutos
00:27:42
He puesto como, si no detecta un silencio de 5 minutos
00:27:44
Pues baja a 4,5
00:27:46
A 3
00:27:49
a tres y medio hasta que
00:27:50
hacer trozos de vídeo
00:27:51
y si no encuentran ninguna
00:27:54
pues se sale como un aviso diciendo
00:27:56
que no se puede dividir el trozo
00:27:58
se va a producir vídeo entero
00:28:00
Una última cosa
00:28:01
esto es pura curiosidad
00:28:04
¿Habéis probado con canciones?
00:28:05
¿Canciones?
00:28:08
No
00:28:10
Es una buena idea
00:28:10
y posiblemente funcionaría
00:28:13
pero no, no la he probado
00:28:15
Pero también le digo que la librería que he usado para bajar el ruido no es muy inteligente.
00:28:17
Muchas gracias.
00:28:29
- Autor/es:
- Villablanca
- Subido por:
- Mario S.
- Licencia:
- Dominio público
- Visualizaciones:
- 42
- Fecha:
- 22 de junio de 2024 - 9:13
- Visibilidad:
- Público
- Centro:
- IES VILLABLANCA
- Duración:
- 28′ 45″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1280x720 píxeles
- Tamaño:
- 1.86