library(tidyverse)
= "~/proyecto_cachitos/"
root_directory <- "2023"
anno library(magick)
<- str_glue("{root_directory}video/{anno}_jpg/"))
(directorio_imagenes #> ~/proyecto_cachitos/video/2023_jpg/
image_read(str_glue("{directorio_imagenes}00001297.jpg"))
Cachitos 2023. Primera parte
estadística
polémica
2024
textmining
ocr
linux
cachitos
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 archivomp4
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 videomplayer
sudo apt install mplayer
.mplayer
conmplayer
vamos a extraer 1 de cada 200 fotogramas del videoimagemagick
consudo apt install imagemagick
. Conimagemagick
vamos a cambiar el tamaño de los fotogramas, recortar el área dónde están los subtítulos, convertir a formatotif
e invertir los colores para que el texto se vea mejor.parallel
sudo apt install parallel
. Conparallel
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
ysudo apt install tesseract-ocr-spa
. Contesseract
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
image_read(str_glue("{directorio_imagenes}00001297.jpg.subtitulo.tif"))
<- str_glue("{root_directory}{anno}_txt/"))
(directorio_texto #> ~/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.