OCR des sous-titres d'une vidéo
Ce tutoriel fonctionne sur une machine virtuelle ubuntu 20.04.
Vous pouvez en installer une en suivant ce tuto : https://otarigato.org/showthread.php?tid=5572
Wikipedia a écrit :OCR = La reconnaissance optique de caractères (ROC), en anglais optical character recognition (OCR), ou océrisation, désigne les procédés informatiques pour la traduction d'images de textes imprimés ou dactylographiés en fichiers de texte.
https://fr.wikipedia.org/wiki/Reconnaiss...t%C3%A8res
Installation de YoloCR
On va utiliser YoloCR :
Sources : https://bitbucket.org/YuriZero/yolocr/src/master/
Archive dépôt : YuriZero-yolocr-4d88afa106af.zip
Ce script permet d'installer tout le nécessaire sur une machine virtuel faisant tourner Ubuntu 20.04.
Vous pourrez alors traiter vos vidéos directement depuis cette machine.
On lance la vm et un terminal.
On met la machine à jour :
Code :
sudo apt update
sudo apt install
On va vouloir récupérer le dépôt.
Pour ça, on doit installer git :
Code :
sudo apt install git
Puis on clone le dépôt :
Code :
git clone https://bitbucket.org/YuriZero/yolocr.git
On va dans le dossier créé :
Code :
cd yolocr
On permet aux fichiers d'extension .sh d'être exécutable s'ils ne le sont pas déjà :
Code :
sudo chmod +x *.sh
On lance le script qui va installer toutes les dépendances et logiciels utiles par la suite :
Code :
./YoloBuntuInstallation.sh
On dit bien qu'on veut installer tout le bordel proposé.
Vous laissez tourner pendant quelques minutes.
Note : Durant l'installation, j'ai pu voir ce genre d'erreur :
Code :
E: Impossible de récupérer http://fr.archive.ubuntu.com/ubuntu/pool/universe/x/xdotool/libxdo3_3.20160805.1-4_amd64.deb Impossible d'initialiser la connexion à fr.archive.ubuntu.com: 80 - connect (101: Le réseau n'est pas accessible)
E: Impossible de récupérer http://fr.archive.ubuntu.com/ubuntu/pool/universe/p/parallel/parallel_20161222-1.1_all.deb Impossible d'initialiser la connexion à fr.archive.ubuntu.com: - connect (101: Le réseau n'est pas accessible)
Pour remédier à cela, j'ai modifié l'url où ubuntu allait chercher les paquets pour voir les mises à jour :
Code :
sudo sed -i 's/fr\.archive/archive/g' /etc/apt/sources.list
Normalement tout est bien installé :)
On va vérifier avec la commande :
Code :
vspipe --version
Vous pouvez obtenir le message d'erreur suivant :
Code :
Failed to initialize VapourSynth environment
Cela vient du chemin python mal renseigné : http://www.vapoursynth.com/doc/installat...ompilation
Vous pouvez vérifier en faisant
Code :
echo "$PYTHONPATH"
Faites :
Code :
PYTHONPATH=/usr/local/lib/python3.8/site-packages vspipe --version
On se souvient donc qu'il faudra renseigner ce chemin pour faire fonctionner le tout plus tard.
On éteint complètement la machine et on en profite pour faire un snapshot de l'état afin de pouvoir repartir sur une base saine au besoin.
Création d'une vidéo à OCR
Vous pouvez avoir des fichiers tout fait pour tester avec les urls suivantes :
Pour créer vous même votre vidéo de test, vous pouvez incruster vous-même les sous-titres à la vidéo brute.
Le projet est disponible à cette adresse : https://durian.blender.org/
Les vidéos sont disponibles au téléchargement ici : https://durian.blender.org/download/ (j'ai utilisé la vidéo "HD 1080p" pour les exemples).
Et les sous-titres ici : https://download.blender.org/durian/subs/ (afin de styliser les sous-titres, je les ai édité avec aegisub au préalable).
Les commandes ffmpeg pour réaliser cela en 2 passes sont les suivantes :
Code :
ffmpeg -y -i Sintel.mkv -vf "ass=Sintel.ass" -c:v libx264 -b:v 400k -c:a libmp3lame -qscale:a 9 -pass 1 -f mp4 /dev/null
ffmpeg -i Sintel.mkv -vf "ass=Sintel.ass" -c:v libx264 -b:v 400k -c:a libmp3lame -qscale:a 9 -pass 2 Sintel_sub-fra.mp4
-b:v 400k (augmenter la valeur de 400 pour augmenter le flux vidéo)
-qscale:a 9 (diminuer la valeur de 9 pour augmenter le flux audio)
En 1 passe avec contrôle sur la qualité globale via crf :
Code :
ffmpeg -i Sintel.mkv -vf "ass=Sintel.ass" -vcodec libx264 -x264-params crf=18 -preset slow -acodec copy SintelHQ_sub-fra.mp4
On essaie d'OCR
Vous avez maintenant votre fichier source à côté des fichiers .vpy dans le dossier "yolocr".
On va suivre ce qui est recommandé dans le README :
https://bitbucket.org/YuriZero/yolocr/src/master/
Anglais : https://bitbucket.org/YuriZero/yolocr/sr...ADME_EN.md
On lance "VSEdit" via Activities > Champ de recherche.
- YoloResize.vpy
Vous ouvrez le script "YoloResize.vpy".
On modifie les valeurs suivantes dans l'éditeur :
Citation :FichierSource=r'Sintel_fra-srt.mp4" (nom de la vidéo dans le dossier yolocr)
DimensionCropBox=[1344,150] (largeur et hauteur du bloc de reconnaissance)
HauteurCropBox=46 (distance du bloc de reconnaissance du bas de la vidéo)
Supersampling=-1 (passez à -1 pour un redimmensionnement auto)
ModeU='sinc' (contrôle la méthode d'Upscale : 'sinc' (2 taps, plus rapide), 'znedi3' (plus lent) ou 'waifu2x' (beaucoup plus lent))
Vous pouvez voir le résultat en pressant F5.
Vous obtiendrez une nouvelle fenêtre afin de naviguer dans la vidéo pour voir le résultat :
Vous commencez par :
1 - Changer pour "Fit to frame" afin d'avoir la taille complète de la zone capturée
2 - Déplacer vous vers un timecode ayant double ligne avec une bonne longueur. Cela vous donnera une idée du maximum à mettre pour la cadre.
Pour le cas présent, visez autour de 2 minutes.
3 - Changez la valeur de HauteurCropBox pour changer la distance vis à vis du bas de la vidéo de la zone capturée.
Refaites F5 pour mettre à jour la visualisation. Les sous-titres ne doivent pas être en contact avec le bord blanc.
4 - Modifiez les valeurs de DimensionCropBox pour modifier la largeur et la hauteur du cadre.
Refaites F5 pour mettre à jour la visualisation. Des dimensions adéquates améliorent la vitesse de traitement et la fiabilité de l'OCR.
5 - Essayez de tourner dans la vidéo pour voir si c'est bon.
On se souvient bien de ces valeurs :
Citation :FichierSource=r'Sintel_fra-srt.mp4"
DimensionCropBox=[1344,150]
HauteurCropBox=30
ModeU='sinc'
- YoloSeuil.vpy
On ouvre un nouveau script :
Menu > File > Open script > YoloSeuil.vpy
On va ensuite ajuster les différentes valeurs dans le script YoloSeuil.vpy
On modifie les valeurs suivantes dans l'éditeur :
Citation :FichierSource=r'Sintel_fra-srt.mp4"
DimensionCropBox=[1300,150]
HauteurCropBox=30
ModeU='sinc'
ModeS='L' ou 'R' ou 'G' ou 'B' (L = utilisation d'un seuillage basé sur du noir/blanc, R, G, B = utilisation d'un seuillage basé sur des valeurs RGB (Red Green Blue))
Seuil=-1 (nous permet de chercher la valeur pour les seuils avec l'éditeur VapourSynth avec F5
Pour trouver les valeurs avec l'éditeur de VapourSynth.
Faites F5 avec les paramètres précédents d'édités. Vous avez alors une fenêtre qui s'ouvre.
1 - Vous activez le "Color panel".
2 - Vous avez alors une nouvelle indication de disponible.
3 - En bougeant la souris au-dessus des zones que vous voulez analyser, vous aurez alors la valeur de gris associé à cet endroit.
1. SeuilI
Dans le cas de l'inline (intérieur des sous-titres), ce niveau doit être réglé au minimum possible tout en laissant les sous-titres complètement visibles.
On règle le niveau de la valeur de ce seuil avec celle déterminée en survolant les zones internes des sous-titres.
Seuil=140
On regarde ce que cela nous donne : CTRL+S puis F5.
Si vous êtes content de la valeur, vous la notez et vous passez au seuillage des contours.
2. SeuilO
Dans de le cas de l'outline (bordure des sous-titres), cherchez le seuil maximum. Le contour des sous-titres doit être entièrement noir.
On règle le niveau de la valeur de ce seuil avec celle déterminée en survolant les contours des sous-titres.
Seuil=90
On regarde ce que cela nous donne : CTRL+S puis F5.
Si vous êtes content de la valeur, vous la notez.
Ces deux étapes demandent d'essayer de de voir. Vous pouvez augmentez le seuilI si cela permet d'améliorer la propreté des lettres.
On ferme la fenêtre d'affichage.
- YoloCR.vpy
On ouvre un nouveau script :
Menu > File > Open script > YoloCR.vpy
On modifie les valeurs suivantes dans l'éditeur pour celles que l'on déterminées précédemment :
Citation :FichierSource=r'Sintel_fra-srt.mp4"
DimensionCropBox=[1300,150]
HauteurCropBox=30
ModeU='sinc'
SeuilI=140
SeuilO=90
On enregistre : CTRL + S.
On filtre la vidéo
On ferme l'éditeur.
On ouvre un terminal dans le dossier yolocr.
On lance la commande :
Code :
vspipe -y YoloCR.vpy - | ffmpeg -i - -c:v mpeg4 -qscale:v 3 -y videofiltre.mp4
Vous laissez tourner tranquillement.
Vous aurez alors deux nouveaux fichiers dans votre dossier :
- SceneChanges.log
- videofiltre.mp4
On OCR
Une fois que cela a tourné, on peut lancer l'ocr sur la vidéo que l'on a obtenu :
Code :
./YoloCR.sh videofiltre.mp4
Vous pourriez être amené à répondre à de la reconnaissance d'italique.
Pas pour moi dans le cas présent.
On obtient les fichiers/dossiers suivants :
- Timecodes.txt (fichier qui contient le time de la vidéo)
- ScreensFiltrés (dossier qui contient les screens des subs sur lesquels l'ocr va travailler)
- TessResult (dossier qui contient les résultats de l'ocr pour le logiciel)
- videofiltre.srt (fichier qui contient les sous-titres de la vidéo avec le time)
En utilisant une vidéo avec basse qualité, les subs sont moins bien définis et on obtient alors un fichier qui demandera pas mal de vérifications à réaliser.
Si vous prenez la meilleure résolution, vous pourrez obtenir de bons résultats.
Les seuils sont à adapter pour chaque vidéos.
Par exemple, avec la vidéo de Sintel d'environ 50 Mo (2 passes, flux vidéo 400k), j'obtiens le fichier suivant :
Sintel_fra-sub.srt
(beaucoup de mauvaises reconnaissances + fautes)
Et avec une vidéo encodée en meilleure qualité (1 passe, crf 18 ), j'obtiens ceci :
SintelHQ_fra-sub.srt
(1 espace manquant et un italique mal placé)
Autre moteur de reconnaissance de caractères
Je copie ici ce qui est mis dans le dépôt de YoloCR :
Citation :Le moteur LSTM de Tesseract produit un OCR de moindre qualité (notamment au niveau de la détection des italiques). Utiliser les traineddata du moteur Legacy à la place : https://github.com/tesseract-ocr/tessdata Ces fichiers peuvent être placés dans le dossier tessdata de YoloCR.
On va charger des fichiers dans tesseract qui soient un peu plus complets afin d'aider à la reconnaissance des caractères.
On utilisera alors le moteur LEGACY pour la reconnaissance et non plus LSTM.
Avec la commande :
Code :
ls -al /home/lambda/yolocr/tessdata
Il y a déjà un "fra.traineddata".
On va le stocker en archive de côté :
Code :
mkdir /home/lambda/yolocr/tessdataOLD
sudo mv /home/lambda/yolocr/tessdata/fra.traineddata /home/lambda/yolocr/tessdataOLD/fra.traineddata
Code :
wget https://github.com/tesseract-ocr/tessdata/blob/master/fra.traineddata
sudo mv fra.traineddata /home/lambda/yolocr/tessdata/
D'après le dépôt sur gitlab, à l'heure actuelle, le script utilise déjà le module LEGACY et non plus LSTM.
Voilà, à vous de tester sur vos fichiers :)