¿No te ha pasado que prendes la tele, están dando un partido de fútbol y van 2-0? Tienes que esperar hasta el entretiempo o al fin del partido para ver los goles… Por eso pensamos, si en Zapping se puede retroceder, ¿Por qué no darle a los usuarios la opción de retroceder directamente al momento del gol?
Esta misma lógica se podría aplicar también a momentos relevantes de otras transmisiones en vivo, como presentaciones de artistas en un festival o la entrega de los diferentes premios de un evento tipo Oscar’s o Grammy’s. Si bien para los primeros es posible hacer una cobertura manual y marcar estos puntos clave, los partidos de fútbol tienen una alta frecuencia y simultaneidad, lo que los hace perfectos para ser automatizados: Se ahorra gran carga de trabajo y se obtienen muchos momentos que enriquecen la experiencia del usuario en Zapping.
Como otras ideas dentro de Zapping, los primeros prototipos se desarrollaron como proyectos cortos de día viernes. En este caso, dos proyectos precedieron la herramienta que finalmente llegó a producción.
Identificación de goles por audio:
Sin duda un indicador bastante claro y repetido en los goles es el grito de gol del comentarista. Si bien cada uno tiene su estilo, hay un sonido alto y sostenido que puede ser detectado analizando el audio del video. Este primer proyecto se abocó a encontrar este indicador, los resultados fueron rápidos y prometedores. Calculando un valor promedio del nivel de oscilación del volumen en cada segmento de video (aproximadamente 6 segundos), pudimos obtener candidatos para indicar las posiciones de los goles. Un buen inicio, pero existían algunos problemas… Se requería analizar todo el programa (en base a lo indicado por EPG) lo que es muy demandante en el proceso y aún aparecían falsos positivos.
Identificación de goles por cambio de marcador:
Otro indicador claro que permitiría detectar dónde hay un gol, es el marcador oficial de la transmisión. Este segundo proyecto se orientó a leer el marcador en pantalla, utilizando motores de reconocimiento óptico de caracteres. Así logramos registrar los cambios en los casilleros de los goles. Si bien este enfoque es muy preciso y se lograron buenos resultados, es sumamente costoso para mantenerlo en ejecución durante todo el partido y se hace complejo identificar la posición de los marcadores utilizados en el formato de las distintas ligas que se transmiten en Zapping.
En esta etapa utilizamos la librería Tesseract, en Javascript, ya que teníamos buenas referencias y era rápido de implementar en NodeJS, pero no nos dio la impresión de poder ser utilizada en producción por el alto uso de recursos y por la falta de precisión en la lectura de datos sobre la pantalla completa.
Considerando el potencial observado en los primeros proyectos, se tomó la decisión de dedicarle más tiempo al concepto y elaborar una versión que pudiera quedar en producción. Al proyecto le llamamos Jumbotron, en honor a los marcadores gigantes usados en la NBA y otros deportes en Estados Unidos. Para empezar este camino, fue fundamental contar con un proveedor de información que nos pudiera notificar con cierta precisión las incidencias de los partidos. Cuando Gracenote, nuestro proveedor de EPG nos presentó su solución de sports-data, lo implementamos y las piezas empezaron a completar el puzzle.
Conectados con la data de live sports (la misma que alimenta el modo deportes, del cual hablaremos en otro artículo) ya sabíamos en qué minuto del partido ocurrió cada gol, pero aún no existía el indicador en el video que nos permitiera retroceder de forma automática a ese minuto. El problema se había convertido en parear los segmentos de video con el tiempo del partido. Recordando los proyectos previos, pensamos que podíamos trabajar en el reconocimiento del tiempo en el marcador, lo que se puede hacer de manera relativamente eficiente si encontramos la tecnología correcta. Probando distintas librerías determinamos que el Vision Framework de Apple era la alternativa más eficiente en tiempos de ejecución y uso de recursos, especialmente si lo corríamos en un procesador M1. Fuimos capaces de obtener lecturas del tiempo en el marcador en una imagen a pantalla completa en menos de 100 ms y con un consumo de CPU, RAM y energético mínimo, cuando en otros casos superábamos los 1500 ms.
Así, cuando inicia el partido de acuerdo a la información del EPG, se comienza a leer la pantalla buscando textos con el formato “00:00”, una vez que este valor se encuentra y cumple ciertas condiciones, se tiene el inicio del partido y se deja de analizar la pantalla completa y se pasa a analizar solamente la zona donde ya sabemos que está el texto. Esto hace que el proceso sea más rápido y eficiente.
Al afinar el algoritmo, se lograron generar los momentos que permiten retroceder al minuto indicado en forma automática y lo pusimos en producción. Todo bien hasta acá, excepto por un detalle…
Si bien el sistema automático ya estaba marcando los goles y uno podía recorrer un partido y ver rápidamente las jugadas, los momentos no quedaban totalmente precisos, dado que la información que nos llega desde Gracenote muchas veces notifica solo el minuto y no el segundo exacto, haciendo que el usuario tenga que ver hasta 60 segundos para encontrar el gol, lo que en un partido de fútbol puede significar ver 2 o 3 jugadas que no nos interesan antes de ver el gol.
Aquí entonces viene la reincorporación del otro proyecto inicial que había quedado archivado, el análisis de audio. El principal problema era el costo para analizar todo el partido, pero eso ahora ya no era necesario porque teníamos el momento del gol y podemos extraer un segmento de video de 2 minutos, lo que nos permite un análisis más detallado para ajustar la data obtenida del proveedor.
Al graficar el nivel de audio se observan zonas planas correspondientes a un sonido sostenido. Considerando el origen del gráfico, es razonable asumir que corresponde al grito de gol del comentarista. Pero surge un nuevo problema, a veces hay más de una zona plana, como en el caso del gráfico Barcelona vs Flamengo. Entonces podemos agregar un elemento extra al análisis para seguir reduciendo posibles errores: Los cambios de escena. Usando librerías de FFMPEG pudimos detectar estos cambios de escenas y nos dimos cuenta de que siempre después de un gol cambia la toma de la cancha completa al jugador celebrando (o al entrenador, la banca o la hinchada).
Si vemos en un gráfico las zonas planas del audio, más los cambios de escena, nos daremos cuenta de que es bastante claro el instante en que comienza el grito de gol: en el inicio más cercano de una ventana a un cambio de escena. De esta forma, dando un margen de 12 segundos al segmento de video que contiene el inicio del grito de gol, tenemos identificado el inicio de la jugada y por ende el momento buscado.
Hoy lanzamos a producción esta versión, donde finalmente unimos la data en vivo con el análisis de audio y los cambios de escenas. Lo que nos permite afinar la puntería de detección de goles.
Aún quedan algunas dificultades que se pueden mejorar en un futuro, como errores más gruesos que puedan venir de nuestro proveedor de estadísticas o cuando el comentarista no grita el gol (como los goles que le hacen a Chile en las eliminatorias), pero por ahora estamos confiados que tenemos una buena solución y que enriquece la experiencia.
Estamos procesando en vivo más de 500 partidos al mes, a veces más de 5 en simultáneo, para que nuestros zappiners puedan usar el control remoto de su TV y retroceder a los goles que se perdieron. ¿Ya lo probaron? Nos interesa escuchar su opinión!