Script de décalage des sous-titres dans un fichier srt

#! /bin/bash

IFS=$'\n'
option_F_found=0
option_T_found=0

usage()
{
echo "usage: ./subtitles.sh -f [srt file] -t '[+/- time]'"
echo "ex : ./subtitles.sh -f /home/std/lecuisinierlevoleursafemmeetsonamant.srt -t '- 18.100'"
echo "ex : ./subtitles.sh -f /home/std/lecuisinierlevoleursafemmeetsonamant.srt -t '+ 18.100'"
echo ""
exit 3
}

while getopts f:t: OPTNAME; do
case "$OPTNAME" in
f)
FILE="$OPTARG"
option_F_found=1
;;

t)
TIME="$OPTARG"
option_T_found=1
;;

*)
usage
;;
esac
done

if [ "$option_F_found" -eq "0" ] || [ "$option_T_found" -eq "0" ]; then
usage
fi

FunctionDuration()
{
duration_temp=$(date -d "1983-12-12 $1" "+%s.%3N")
duration_diff=$(echo "scale=3; $duration_temp $TIME" | bc -l)
duration_dest=$(date -d"@$duration_diff" "+%H:%M:%S,%3N")
echo "$duration_dest"
}

for i in $(grep -E "[0-9]{2}:[0-9]{2}\,[0-9]{3}" "$FILE");
do
A=$(echo "$i" | sed 's/\([0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}\,[0-9]\{3\}\) --> \([0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}\,[0-9]\{3\}\)/\1/')
B=$(echo "$i" | sed 's/\([0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}\,[0-9]\{3\}\) --> \([0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}\,[0-9]\{3\}\)/\2/')
VAL1=$(FunctionDuration "$A")
VAL2=$(FunctionDuration "$B")
echo "working on $A --> $B"
sed -i "s/$i/$VAL1 --> $VAL2/" "$FILE"
done

Script de décalage des sous-titres dans un fichier srt

Ripper un DVD

Le seul préalable :

# apt install ffmpeg

Tout d'abord, on concatène les fichiers VOB qui nous intéresse après avoir monter le DVD :

# mount /dev/sr0 /mnt

$ cat /mnt/VIDEO_TS/VTS_01_1.VOB /mnt/VIDEO_TS/VTS_01_2.VOB /mnt/VIDEO_TS/VTS_01_3.VOB /mnt/VIDEO_TS/VTS_01_4.VOB > /home/user/Vidéos/monfilm.VOB

On repère les flux vidéos (généralement le 1), audios et sous-titres :

$ ffmpeg -i monfilm.VOB

Le flux vidéo est généralement le premier, on repère ensuite les flux audio et le flux de sous-titre si besoin. Ici, on suppose que l flux video est 0:1, les flux audios 0:10 (cantonnais) et 0:11 (français). Le flux sous-titre est le 0:3.

On encode ainsi :

$ ffmpeg -i monfilm.VOB -map 0:1 -map 0:10 -map 0:11 -map 0:3 -c:v libx264 -preset slow -crf 16 -c:a copy -c:s copy -metadata:s:a:0 language=yue -metadata:s:a:1 language=fra -metadata:s:s:0 language=fra mon_film.mp4

-map 0:1 donne l'ordre des flux de la future vidéo. Le premier flux sera la vidéo (flux 0:1 du DVD), le deuxième sera l'audio en cantonnais (flux 0:10) puis l'audio en français (0:11) et enfin les sous-titres (0:3).

-c:v libx264 : le codec vidéo sera h264

-c:a copy : on copie le flux audio

-c:s copy : on copie le flux de sous-titres

-preset veryslow : vitesse d'encodage, inversement proportionnelle à la qualité de l'image. Les options sont : ultrafast, superfast, fast, medium, slow, slower, veryslow. Medium est le réglage par défaut.

-crf : définit le niveau de qualité (q). L'échelle va de 0 à 51 (petit nombre = + de temps de calcul)

-metadata:s:a:0 : définit la metadata du flux audio 0 (a:0) avec language =yue (cantonnais), même chose pour le a:1 en français

-metadata:s:s:0 définit la langue des sous-titres (français)

Puis, en dernier, le nom du fichier en sortie.

Une alternative pour encoder en bitrate variable et en deux passes :

ffmpeg -i input.VOB -c:v libx264 -b:v 2000k -pass 1 -an -f null /dev/null && ffmpeg -i input.VOB -c:v libx264 -b:v 2000k -pass 2 -c:a aac-b:a 128k c:s copy output.mp4

En cas d'erreur, remplacer -na par -vsync cfr

La doc complète : https://ffmpeg.org/documentation.html dont le wiki : https://trac.ffmpeg.org/

Une autre doc : https://forum.hardware.fr/hfr/VideoSon/Traitement-Video/encodage-ffmpeg-dummies-sujet_154546_1.htm

Ripper un DVD

Encodage de sous-titres (Handbrake défaillant)

Sur ubuntu :

apt install ffmpeg ogmrip tesseract-ocr tesseract-ocr-fra subtitleeditor

Disposer des infos avec ffmpeg :

ffmpeg -i VTS_01_1.VOB

Récupérer les .idx et .sub pour le titre 1:

mencoder dvd://1 -nosound -ovc frameno -o /dev/null -vobsuboutindex 0 -sid 0 -vobsubout nom_du_fichier

Le sid est la piste à lire, elle sera passée en sid 0 par l'instruction vobsuboutindex.
Script d'ocr (Tesseract.sh) à placer dans le dossier (le paquet tesseract-ocr-fra est nécessaire):

#!/bin/bash

NPROC=$(nproc --all| awk '{ print $1 - 1 }') # Set number of processor
for fichier in *.tif
do
(
echo "$fichier"
tesseract "$fichier" "$fichier" -l fra --psm 6 &>/dev/null
) &
if [[ $(jobs -r -p | wc -l) -gt $NPROC ]]; then
wait -n
fi
done
wait

Création des fichiers tiff et du xml indexé :

subp2tiff --sid=0 -n nom_du_fichier

On lance le script qui va océriser les fichiers:

./Tesseract.sh

C'est long.

On assemble les fichiers txt et l'index xml :

subptools -s -w -t srt -i nom_du_fichier.xml -o nom_du_fichier.srt

Normalement, le tour est joué.

Encodage de sous-titres (Handbrake défaillant)