Saltar navegación

Activa JavaScript para disfrutar de los vídeos de la Mediateca.

Zhenkai y Andrew - Desarrollo - Contenido educativo

Ajuste de pantalla

El ajuste de pantalla se aprecia al ver el vídeo en pantalla completa. Elige la presentación que más te guste:

Subido el 22 de junio de 2024 por Mario S.

42 visualizaciones

Descargar la transcripción

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
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
por simplificar 00:14:11
pues esto también lo he citado 00:14:14
pues una vez que te vayas 00:14:15
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
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
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

Del mismo autor…

Ver más del mismo autor


EducaMadrid, Plataforma Educativa de la Comunidad de Madrid

Plataforma Educativa EducaMadrid