Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 24/03/2015, à 15:51

quadra38

[TUTO] Créer ses propres karaokés à partir d'un fichier ogg

Petit tuto pour faire ses karaokés smile

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, à 16: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