Cachitos 2023. Primera parte

estadística
polémica
2024
textmining
ocr
linux
cachitos
Author

José Luis Cañadas Reche

Published

January 2, 2024

Como todos los años toca hacer el análisis de de los subtítulos de Nochevieja a Cachitos

Este año resulta que la gente de RTVE ha capado el poder bajarse los videos desde rtve usando curl o wget , pero gracias a Javi Fdez he podido bajarme el video tirando de la url del streaming .

Requisitos

  • Un plugin en el navegador que pueda identificar el m3u asociado al archivo mp4 del video de Cachitos que está en rtve play. Yo he usado live Stream Downloader , pero seguro que hay alguno mejor
  • Usar un sistema operativo GNU/Linux, en mi caso Linux Mint 21.2 basada en Ubuntu Jammy
  • ffmpeg sudo apt install ffmpeg . ffmpeg nos va a servir para poder bajar el video
  • mplayer sudo apt install mplayer. mplayer con mplayer vamos a extraer 1 de cada 200 fotogramas del video
  • imagemagick con sudo apt install imagemagick. Con imagemagick vamos a cambiar el tamaño de los fotogramas, recortar el área dónde están los subtítulos, convertir a formato tif e invertir los colores para que el texto se vea mejor.
  • parallel sudo apt install parallel . Con parallel vamos a poder utilizar varios núcleos e hilos del ordenador en paralelo y poder hacer la modificación de los fotogramas y el reconocimiento óptico de caracteres más rápido.
  • tesseract sudo apt install tesseract-ocr y sudo apt install tesseract-ocr-spa . Con tesseract se va a hacer el reconocimiento óptico del texto y guardar en ficheros de texto.
  • Elimina ficheros de texto de menos de 10 bytes, puesto que ahí no hay texto .

Script de bash

El script es extract_subtitles.sh , se ejecutaría con extract_subtitles.sh 2023 .

Este script básicamente hace:

  • Se baja el video del sitio de rtve play
  • Extrae 1 de cada 200 fotogramas con mplayer
  • Reduce el tamaño de las imágenes con mogrify de imagemagick
  • Convierte a tif y recorta el área dónde está el texto con convert y crop de imagemagick
  • Obtiene el negativo de ese tif con convert y negate
  • Obtiene el texto usando tesseract y guarda un archivo de texto por cada subtítulo
#!/bin/bash

root_directory=/home/jose/proyecto_cachitos
mkdir -p $root_directory
cd $root_directory

echo "First arg: $1"
mkdir -p video

cd video

ANNO=$1
echo $ANNO
suffix_video="_cachitos.mp4"
suffix_jpg_dir="_jpg"
suffix_txt_dir="_txt"

video_file=$ANNO$suffix_video
echo $video_file


if [ "$ANNO" == "2023" ] ;
then
    ffmpeg -i "https://rtvehlsvodlote7.rtve.es/mediavodv2/resources/TE_SHIECRO/mp4/3/1/1704096565613.mp4/video.m3u8?hls_no_audio_only=true&hls_client_manifest_version=3&idasset=7047821" -c copy $video_file
fi

if [ "$ANNO" == "2022" ] ;
then
    ffmpeg -i "https://rtvehlsvodlote7.rtve.es/mediavodv2/resources/TE_SHIECRO/mp4/1/5/1672556504451.mp4/video.m3u8?hls_no_audio_only=true&hls_client_manifest_version=3&idasset=6767615" -c copy $video_file
fi 
 

# Pasar a jpg uno de cada 200 fotogramas

mplayer -vf framestep=200 -framedrop -nosound $video_file -speed 100 -vo jpeg:outdir=$ANNO$suffix_jpg_dir 
 
cd $ANNO$suffix_jpg_dir 
 
# Convertir a formato más pequño
find . -name '*.jpg' |  parallel -j 8 mogrify -resize 642x480 {}

# Seleccionar cacho dond están subtitulos
find . -name '*.jpg' |  parallel -j 8 convert {} -crop 460x50+90+285 +repage -compress none -depth 8 {}.subtitulo.tif

# Poner en negativo para que el ocr funcione mejor
find . -name '*.tif' |  parallel -j 8 convert {} -negate -fx '.8*r+.8*g+0*b' -compress none -depth 8 {}

# Pasar el ocr con idioma en español
find . -name '*.tif' |  parallel -j 8 tesseract -l spa {} {}

# mover a directorio texto
mkdir -p $root_directory/$ANNO$suffix_txt_dir

mv *.txt $root_directory/$ANNO$suffix_txt_dir

cd $root_directory/$ANNO$suffix_txt_dir

# Borrar archivos de 10 bytes , subtítulos vacíos
find . -size -10c -exec rm -f {} \;

cd $root_directory

Algún ejemplo

library(tidyverse)

root_directory = "~/proyecto_cachitos/"
anno <- "2023"
library(magick)
(directorio_imagenes <- str_glue("{root_directory}video/{anno}_jpg/"))
#> ~/proyecto_cachitos/video/2023_jpg/

image_read(str_glue("{directorio_imagenes}00001297.jpg"))

image_read(str_glue("{directorio_imagenes}00001297.jpg.subtitulo.tif"))


(directorio_texto <- str_glue("{root_directory}{anno}_txt/"))
#> ~/proyecto_cachitos/2023_txt/

system(str_glue("cat {directorio_texto}00001297.jpg.subtitulo.tif.txt"), intern = TRUE)
#> [1] "Con el tiempo descubrimos que todas las letras de este"
#> [2] "exprofesor de Primaria tenian referencias sexuales."   
#> [3] "\f"

Y poco más, mañana intentaré tener elpost similar al del año pasado dónde veíamos distancias de texto entre rótulos y demás.