#1 Le 24/03/2015, à 14:51
- quadra38
[TUTO] Créer ses propres karaokés à partir d'un fichier ogg
Petit tuto pour faire ses karaokés
Il vous faut d'abord quelques logiciels, moi j'utilise :
- Kdenlive pour créer le fond du karaoké au format .mp4
- Aegisub pour retravailler le fichier .ass créé par le script (que je mettrais à la fin du tuto)
- mkvmerge pour mixer le .mp4 avec le fichier .ass et .ogg
- Audacity si vous voulez atténuer les paroles sur le fichier .ogg
- HandbrakeCLI pour exporter en mp4, le mkv créé
- ogginfo qui se trouve dans le paquet vorbis-tools
- la Police Alexander, pour le titre de la chanson (ou une autre mais il faudra modifier le script)
En premier faites vous un fond en vidéo mp4, avec une image (mini 1280x720 pixels) et d'une longueur de 6 minutes au moins. Exportez ça en format HD (1280x720), codec h264, débit vidéo 1000
Il vous suffira ensuite de le couper à la bonne longueur avec Mencoder suivant la durée de votre chanson. si votre chanson fait 4min30, avancer de 90 secondes en coupant le début. Je garde la fin pour mon générique avec la liste des logiciels utilisés qui défile.
mencoder Kar_Tous.mp4 -ovc copy -oac copy -ss 00:01:30 -o MonFichier.mp4
ensuite récupérez les paroles de votre chanson sur un site style paroles.net, copier les (ctrl-a, ctrl-c & ctrl-v) dans un éditeur style Gedit ...
dans un même dossier (dans le dossier karaokes que vous aurez créé dans votre /home), mettez le fichier ogg, le fichier .txt et la vidéo mp4
mettez le même nom aux trois :
NomFichier.ogg
NomFichier.mp4
NomFichier.txt
repérez le début des paroles dans votre chanson en secondes et multipliez par 1000 (si le texte commence à 9 secondes du début cela donnera 9000)
dans une console pointant sur votre dossier (par cd ~/karaokes/dossier), lancer le script
./Txt2Ass.sh NomFichier.txt 9000
Un fichier NomFichier.ass vient d'etre créé
Vous pouvez déjà essayer votre karaoké, sachant évidemment que le script ne peut pas "deviner" la longueur des phrases et qu'il va falloir le retravailler à la main avec Aegisub
mkvmerge -o NomFichier.mkv NomFichier.mp4 NomFichier.ogg -D -A NomFichier.ass
Une vidéo NomFichier.mkv vient d'être créée et un coup de mplayer NomFichier.mkv vous permettra de tester le résultat
Le plus gros reste à faire, lancer Aegisub, charger le fichier .ass et le fichier audio (si ce n'est pas automatique) Redimensionner correctement chaque phrase en fonction du son entendu. Revenez au début et passez en mode "karaoké", recommencez en affinant la durée sur chaque mot ...
sauvez régulièrement car moi j'ai des plantages par moment
Une fois toute cette partie finie (comptez une bonne heure)
tester votre karaoké après avoir transformé tout ça en mkv
mkvmerge -o NomFichier.mkv NomFichier.mp4 NomFichier.ogg -D -A NomFichier.ass
mplayer NomFichier.mkv
Vous pouvez l'exporter en .mp4 pour le mettre sur Youtube sachant qu'il y a un bug que je n'ai pas résolu concernant le coloriage de la deuxième ligne de chaque phrase (à suivre donc)
HandBrakeCLI -i MonFichier.mkv -o MonFichier_kar.mp4 -e x264 -q 20 -B 128 -vb 1000 --x264-preset medium -O --turbo --subtitle "1" --subtitle-burn "1" --srt-codeset utf8
SCRIPT : Txt2Ass.sh
#!/bin/bash
# script Txt2Ass.sh
k=$1
k=`echo $k | sed -s 's/ /_/g'`
TITRE=`basename ${k} .txt`
fichierOut="$TITRE.ass"
# echo $k - $fichierOut
# Nom fichier source
fichierIn=$1
# sauvegarde du séparateur de champ
# oldIFS=$IFS
# nouveau séparateur de champ, le caractère fin de ligne
# IFS=$'\n'
# Debut paroles
Millisecondes=$2
Mille=1000
# code ligne suivante
CodeLS="{\k0}\n{\rTexteRouge}"
# -----------------------------------------------------------------------------
NbLignes=$(wc -l $1 | sed -s 's/[a-Z._-]//g')
NbLettres=$(wc -m $1 | sed -s 's/[a-Z._-]//g')
# -----------------------------------------------------------------------------
# Duree de la chanson au format ogg
Duree=$(ogginfo $TITRE.ogg | grep Playback | cut -d " " -f 3 | sed -s 's/[ms]//g')
Duree="00:0"$Duree
# -
MM=$( date -d ${Duree} +'%M' )
SS=$( date -d ${Duree} +'%S' )
NbS=$( echo "$MM * 60 + $SS" | bc -l)
# -
Duree=$( date -d ${Duree} +'%s')
# On calcule le temps en millisecondes de chaque lettre pour les mots
tps=$(echo "((($NbS - ($2 / $Mille)) / $NbLettres) * $Mille) - 15" | bc -l)
# Duree d'une lettre
TpsLettre=$tps
echo "$NbLignes - $NbLettres - $MM m : $SS s - $NbS s - $tps"
# ----------------------------------------------------------------------------
# Diviseur millième seconde, on enlève 2 secondes sur le début des paroles
Compteur=$(echo "($Millisecondes / $Mille) - 2" | bc -l)
# En tete
Format="Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text"
# ---- Dialogue: 0,0:00:00.00,0:00:04.00,Texte,,0000,0000,0000,,"
PoliceTitre=",Titre"
PoliceTexte=",Texte"
FinLigne=",,0000,0000,0000,,"
DebTexte="Dialogue: 0,"
# ---------------------------------------------------------------------------
if [ $# -eq 2 ]
then
# On efface fichier précédent
rm $fichierOut
# On créé l'entete
echo "[Script Info]" >> $fichierOut
echo "; Fichier généré par script E.B (2015)" >> $fichierOut
echo "Title: Texte Aegisub file" >> $fichierOut
echo "ScriptType: v4.00+" >> $fichierOut
echo "WrapStyle: 2" >> $fichierOut
echo "PlayResX: 1280" >> $fichierOut
echo "PlayResY: 720" >> $fichierOut
echo "ScaledBorderAndShadow: yes" >> $fichierOut
echo "Audio File: $TITRE.ogg" >> $fichierOut
echo "[V4+ Styles]" >> $fichierOut
echo "Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
Style: Default,Arial,20,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,2,2,2,10,10,10,1
Style: Titre,Alexander,50,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,2,2,2,10,10,10,1
Style: Texte,Courier 10 Pitch,40,&H00C0F8F9,&H000000FF,&H00000000,&H00595961,-1,0,0,0,100,100,0,0,1,2,2,2,10,10,10,1
Style: TexteRouge,Courier 10 Pitch,40,&H000000FF,&H000000FF,&H00000000,&H00595961,-1,0,0,0,100,100,0,0,1,2,2,2,10,10,10,1
Style: TitreBleu,Alexander,50,&H00FF0000,&H000000FF,&H00C0F8F9,&H00595961,0,0,0,0,100,100,0,0,1,2,2,2,10,10,10,1" >> $fichierOut
echo "[Events]" >> $fichierOut
echo $Format >> $fichierOut
# et c'est parti
tDebut=$(date -u -d @${Compteur} +'0:%M:%S.%N')
tDebut=$(echo ${tDebut:0:10})
# On ecrit la première ligne vierge
echo $DebTexte"0:00:00.00,0:00:02.00"$PoliceTitre$FinLigne"..." >> $fichierOut
# pareil pour la place réservée au titre
echo $DebTexte"0:00:02.00,"$tDebut$PoliceTitre$FinLigne"Titre de la chanson" >> $fichierOut
# ---------------------------------------------------------------------------
index=0
# ---------------------------------------------------------------------------
while read ligne
do
if [ $index -eq 0 ]
then
# On stocke la première phrase deux secondes avant le début
read ligneSuiv
ligneAct=$ligne
C=$(echo "$Compteur" | bc -l)
tDeb=$(date -u -d @${C} +'0:%M:%S.%N')
tDeb=$(echo ${tDeb:0:10})
Compteur=$(echo "$Compteur + 2" | bc -l)
C=$(echo "$Compteur" | bc -l)
tFin=$(date -u -d @${C} +'0:%M:%S.%N')
tFin=$(echo ${tFin:0:10})
# echo $tDeb - $tFin
echo $DebTexte$tDeb,$tFin$PoliceTexte$FinLigne$CodeLS$ligneAct$CodeLS... >> $fichierOut
else
ligneSuiv=$ligne
fi
index=$(($index+1))
tDebut=$(date -u -d @${Compteur} +'0:%M:%S.%N')
longueur=${#ligneAct}
if [ $longueur -eq 0 ]
then
# echo "ligne vide"
ligneAct="..."
Duree=$(echo "(800 / $Mille)" | bc -l)
Compteur=$(echo "$Compteur + $Duree" | bc -l)
fi
Duree=$(echo "$longueur * ($TpsLettre / $Mille)" | bc -l)
# On tronque la chaine à la bonne longueur
tDebut=$(echo ${tDebut:0:10})
# ---------------------------------------------------------------------------
Compteur=$(echo "$Compteur + $Duree" | bc -l)
tFin=$(date -u -d @${Compteur} +'0:%M:%S.%N')
tFin=$(echo ${tFin:0:10})
# ---------------------------------------------------------------------------
# On traite la chaine de caracteres
Ch=""
for Mots in $ligneAct
do
lg=${#Mots}
K=$(echo "($lg * 15)" | bc -l)
Ch="$Ch{\K$K}$Mots "
done
# On remplace les espaces par le code K80
# ligneAct=$(echo $ligneAct | sed 's/ /{\\K80} /g')
ligneAct=$Ch
# On stocke dans le fichier destination
echo $DebTexte$tDebut,$tFin$PoliceTexte$FinLigne$ligneAct$CodeLS$ligneSuiv >> $fichierOut
ligneAct=$ligneSuiv
done < $fichierIn
# ---------------------------------------------------------------------------
# On aafiche enfin le fichier créé sur la console
cat $fichierOut
# ---------------------------------------------------------------------------
else
echo "--------------------------------------"
echo "usage : $0 Fichier DébutTexte(msec)"
echo "Nécéssite la présence de ogginfo pour lire les tags audios"
echo "--------------------------------------"
fi
Je pense rien avoir oublié, si des puristes de l'informatique veulent optimiser mon script pas de problème
laissez moi par contre celui-ci modifié dans le sujet que j'apprenne :-)
Sur ce bons karaokés à tous ...
Dernière modification par quadra38 (Le 24/03/2015, à 15:31)
" 100 fois sur le metier ... remettez votre ouvrage ... "
Portable Dell Inspiron 6400 - Ubuntu 11.04 & 11.10 +
PC fixe Carte Mère Asus M2N SLI Socket AM2 et Processeur Athlon™ 64 X2 5600+ - Ubuntu 12.04 et 12.10
Hors ligne