Sous-titrage de vidéos

Cette page recense les logiciels et méthodes permettant de visualiser une vidéo sous-titrée, et de sous-titrer une vidéo.

  • Totem : lecteur multimédia permettant de visualiser les sous-titres (menu Visualisation → Sous-titres)
  • VLC : lecteur multimédia permettant de visualiser les sous-titres (menu Vidéo → Piste de sous-titres, ou automatiquement si le fichier de sous-titres a le même nom que le fichier vidéo -extension exceptée-, et se situe dans le même répertoire).
  • mplayer : lecteur multimédia permettant de visualiser les sous-titres
  • xine : lecteur multimédia permettant de visualiser les sous-titres
Logiciel Remarques Affiche le nombre de caractères par ligne (a) Affiche une visualisation des ondes audio (b)
Aegisub spécialisé dans le fansub d'anime. Installable via la logithèque Ubuntu Non Oui
Gaupol subtitle editor Installable via la logithèque Ubuntu Oui Non
Gnome-subtitles Installable via la logithèque Ubuntu (Sauf ubuntu 18.04) Oui Non
Subtitle editor Installable via la logithèque Ubuntu Oui Oui

(a) Pratique pour savoir si la lecture du sous-titre sera trop difficile car le ratio nbre de caractère / temps est trop élevé. L'article de Wikipedia sur le sous-titrage recommande 1s pour 15 caractères.

(b) Pratique pour caler facilement et précisément le début et la fin d'un sous-titre.

* Nécessite d'être en super-utilisateur pour Avidemux

  • Subdownloader : installable via la logithèque Ubuntu
  • Gcap : un logiciel en ligne de commande pour télécharger les sous-titres de YouTube (présent dans les dépôts depuis Ubuntu 11.10)
  • Webeev : le classement des meilleurs sites pour télécharger des sous-titres
  • Subliminal : un script qui permet de télécharger les sous-titres depuis plusieurs sources. Il existe un plugin pour Nautilus/Fichiers.
  • subtitleeditor: logiciel avec interface graphique installable via la logithèque Ubuntu. Supporte 11 formats différents, dont SubRip, MicroDVD et Advanced Sub Station Alpha.
  • srt2ass : script python permettant de convertir en ligne de commande une grande quantité de fichiers SubRip (srt) vers le format Advanced Sub Station Alpha (ass/ssa)
  • FFmpeg : cet outil à tout faire, en ligne de commande, permet également de convertir certains formats de sous-titres: dvbn dvd, ass/ssa, srt, webvtt…

J'ajoute personnellement cette astuce permettant de visualiser 2 sous titres simultanément après avoir très longuement cherché sur internet. Ceci est un script (corrigé) trouvé sur internet ayant comme nom : merge2ass.sh. Le script convertit 2 fichiers sous titre en 1 .ass (équivalent au .ssa). Votre lecteur vidéo doit être en mesure de lire ce fichier sous titre (VLC l'accepte)

La commande est la suivante :

merge2ass.sh [--help] [movie subtitle1 subtitle2] [-pm|--play-movie]
subtitle1 est le sous titre positionné en haut de la vidéo

subtitle2 est le sous titre positionné en bas de la vidéo

merge2ass.sh
#!/bin/bash
# merge2ass.sh - script for merging two text-subtitles into an ass subtitle file
# version 0.9, 8-august-2007
# comments/criticism/praise to jose1711-gmail-com
 
# dependencies: mplayer (if your subtitle files need to be converted to srt), gnu utils
 
# thanks to:
#  - d.watzke for comments
#  - belisarivs for testing
#  - boris dušek <boris (dot) dusek - gmail - com> for testing/ideas
#
# $1 is a movie file
# $2 is a subtitle1
# $3 is a subtitle2
# $4 is optional and could be "-pm" or "--play-movie" for instant watching of the movie
 
# example:
# merge2ass.sh movie.avi english.srt slovak.sub
# mplayer -noautosub -ass movie.avi -sub movie-bilingual.ass -subcp utf8
#
# or just
# merge2ass.sh movie.avi english.srt slovak.sub -pm
#
# or even only
# merge2ass.sh --detect movie.avi -pm
#
# ;-)
#
# release history:
# 0.8a (29. 7. 2007)
#  - initial public release
# 0.8.1a (30. 7. 2007)
#  - check_syntax fixed (d.watzke)
#  - multiline echo -> cat (d.watzke)
#  - removes temp files after conversion
# 0.8.2 (1. 8. 2007)
#  - check whether the input files exist prior to running MPlayer
#  - check for MPlayer binary
#  - help page added
#  - new optional CLI parameters: -pm (plays movie after conversion), --help
# 0.8.2.1 (2. 8. 2007)
#  - timestamp in output more compatible (reported by belisarivs)
# 0.9 (8. 8. 2007)
#  - performs a check for writable output
#  - check for MPlayer's support of ass/ssa if -pm is used
#  - pointers to subtitle files stored as arrays
#  - autorecognition of subtitles based on MPlayer's -sub-fuzziness feature (--detect)
#  - output filename based on movie filename (+bilingual.ass)
#  - bash now mandatory (non-POSIX syntax used)
#  - flag -pm has a long alias (--play-movie)
 
#
# some future thoughts:
#   - more optional flags (do_not_remove_temp_files, play_but_dont_delete_output_afterwards,dont_do
#     the_conversion_just_merging,output_file..)
#   - cleaner sed/awk code
#   - support for other players (xine, totem, kmplayer, vlc..)
#   - subtitle encoding detection based on enca (if present) - boris?
#
# docs:
#   - https://en.wikipedia.org/wiki/SubStation_Alpha
#   - http://www.perlfu.co.uk/projects/asa/ass-specs.doc
#
# THE STORY ENDS HERE
# set -x
 
# normally you do not want to see mplayer's error output
#mplayer_err=/dev/stderr
mplayer_err=/dev/null
 
arg_count="$#"
movie="$1"
sub[1]="$2"
sub[2]="$3"
 
 
show_help(){
cat << EOF
 ----------------------------------------------------------------------------------
|                                                                                  |
|  Merge2ass - a script for merging two text subtitles into ass/ssa subtitle file  |
|                                         author: jose1711 - gmail - com, 2007/08  |
 ----------------------------------------------------------------------------------
 
  Usage: merge2ass.sh [--help] [movie subtitle1 subtitle2] [-pm|--play-movie]
 
         or
 
         merge2ass.sh --detect movie [-pm|--play-movie]
 
--help        show this help page and exit
 
--detect      try to detect subtitles using MPlayer's sub-fuzziness=1 flag
 
movie         movie file (anything that MPlayer recognizes)
subtitle[12]  file(s) containing text subtitles that MPlayer recognizes
 
-pm           play movie immediately and remove the output after finishing
--play-movie
 
EOF
}
 
detect_subtitles(){
        while read -r line; do
                sub[++i]="$line"
        done < <(mplayer -sub-fuzziness 1 -frames 0 "$movie" 2>/dev/null | sed -n "s/^SUB: Added subtitle file ([0-9]*): \(.*\)$/\1/p")
        echo "$i subtitles were detected in total."
        echo "These two will be used:"
        echo "${sub[1]}"
        echo "${sub[2]}"
}
 
convert_subs(){
type mplayer || { echo "MPlayer not installed or binary not in path, please investigate. Exiting.."; exit 1; }
 
echo "Converting the 1st subtitle file (${sub[1]}) to a time-based format..."
# slower but does not require the video file for conversion
# mplayer /dev/zero -rawvideo pal:fps=25 -demuxer rawvideo -vc null -vo null -noframedrop -benchmark -sub "$movie" -dumpsrtsub
mplayer -dumpsrtsub -noautosub -really-quiet -frames 0 -sub "${sub[1]}" "$movie" 2>>"$mplayer_err" && echo "Done"
mv dumpsub.srt "${sub[1]}-temp"
echo "Converting the 2nd subtitle file (${sub[2]}) to a time-based format..."
mplayer -dumpsrtsub -noautosub -really-quiet -frames 0 -sub "${sub[2]}" "$movie" 2>>"$mplayer_err" && echo "Done"
mv dumpsub.srt "${sub[2]}-temp"
}
 
generate_ssa_header(){
cat > "$output" << EOF
[Script Info]
Title:
Original Script:
Original Translation:
Original Editing:
Original Timing:
Original Script Checking:
ScriptType: v4.00
Collisions: Normal
PlayResY: 1024
PlayDepth: 0
Timer: 100,0000
 
[V4 Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, TertiaryColour, BackColour, Bold, Italic, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, AlphaLevel, Encoding
Style: lang1style,Arial,64,65535,65535,65535,-2147483640,-1,0,1,3,0,6,30,30,30,0,0
Style: lang2style,Arial,64,15724527,15724527,15724527,4144959,0,0,1,1,2,2,5,5,30,0,0
 
[Events]
Format: Marked, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
EOF
}
 
generate_ssa_dialogs(){
sed -e "/ --> /s/,/./g" "${sub[1]}-temp" | tr -d "\r" | awk 'BEGIN{ORS="";print " "} / --> /,/^$/ {ORS=" ";print} /^$/{print "\n"}' | sed -e "s/ --> /,/g" -e "s/^ \([^ ]*\) \(.*\)/Dialogue: Marked=0,\1,lang1style,Cher,0000,0000,0000,,\2/" -e "s/,00:/,0:/g" -e "s/\([:,]\)0\([0-9]\)/\1\2/g" -e "s/\([0-9]\)\(.\)\([0-9]\)\([0-9]\)0\(,\)/\1\2\3\4\5/g" >>"$output"
sed -e "/ --> /s/,/./g" "${sub[2]}-temp" | tr -d "\r" | awk 'BEGIN{ORS="";print " "} / --> /,/^$/ {ORS=" ";print} /^$/{print "\n"}' | sed -e "s/ --> /,/g" -e "s/^ \([^ ]*\) \(.*\)/Dialogue: Marked=0,\1,lang2style,Cher,0000,0000,0000,,\2/" -e "s/,00:/,0:/g" -e "s/^ *//g" -e "s/\([:,]\)0\([0-9]\)/\1\2/g" -e "s/\([0-9]\)\(.\)\([0-9]\)\([0-9]\)0\(,\)/\1\2\3\4\5/g" >>"$output"
}
 
remove_temp_files(){
rm "${sub[1]}-temp" "${sub[2]}-temp"
}
 
play_movie(){
        mplayer -ass 2>/dev/null >/dev/null || { echo "Too old MPlayer version, can't understand ASS/SSA subs. Install a newer version."; exit 1; }
        mplayer -really-quiet -fs "$movie" -sub "$output" -ass -subcp utf8 -noautosub
}
 
delete_output(){
        rm "$output"
}
 
eval last_arg='$'${arg_count}
 
if [ $arg_count -eq 0 ]; then
        show_help
        exit 0
fi
 
for param in $*
do
        if [ $param = "--help" ]; then show_help; exit 0; fi
done
 
if [ "$movie" = "--detect" ]; then
        movie="${sub[1]}"
        output="${movie%.*}-bilingual.ass"
        > "$output" #|| { echo "Can't write here! Exiting.." && echo 1; }
        detect_subtitles
fi
 
if [ ! -f "$movie" ]; then echo "Movie file ($movie) does not exist. Going back to shell.."; exit 1; fi
if [ ! -f "${sub[1]}" ]; then echo "Subtitle1 file (${sub[1]}) does not exist. Going back to shell.."; exit 1; fi
if [ ! -f "${sub[2]}" ]; then echo "Subtitle2 file (${sub[2]}) does not exist. Going back to shell.."; exit 1; fi
 
echo "Processing.."
# reset output
output="${movie%.*}-bilingual.ass"
> "$output" #|| { echo "Can't write here! Exiting.." && echo 1; }
 
convert_subs
generate_ssa_header
generate_ssa_dialogs
remove_temp_files
 
if [ "$last_arg" = "-pm" -o "$last_arg" = "--play-movie" ]; then
        play_movie
        delete_output
fi
 
exit 0
 
# set +x

Une solution open-source existe en ligne (également distribuée sous forme de jar exécutable) : site, github

  • sous-titrage.txt
  • Dernière modification: Le 11/09/2022, 12:03
  • par moths-art