Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#1 26-07-2019 14:14:46

golgot200
Membre
Distrib. : Archlinux 2018-02-03
Noyau : Linux 5.7.11-arch1-1
(G)UI : Mate (Strict Minimum)
Inscription : 05-08-2007

Un genre de Streamtuner (Record)

Bonjour,

ça fait un moment que j'essaie de faire un truc dans le style de Streamtuner avec ça fonction enregistrement qui sépare les morceaux à chaque changement de titre. N'ayant jamais réussi à trouvé comment faire, et à force de bidouiller, je suis arrivé à trouver un truc assez sympa en assemblant tout les trucs tordus que j'ai pu réunir par mes demandes de scripts à droite à gauche sur ce forum.
J'explique le truc et la démarche assez simple pour mettre tout ça bout à bout. Si une personne pouvait se dévouer pour me faire un retour, ça serait cool pour la suite.

Sous Mate "(pour d'autres environnement, il faudrait modifier mate-terminal) :

Voilà, le principe. Vous lancez une commande par un lanceur qu'on aura crée sur son tableau de bord et qui pointera sur un bout de script "Pause_3s_Cut" dans un dossier "Scripts" que l'on aura crée dans son home. Un terminal s'ouvrira avec un sox en attente de détection de son.
Vous ouvrez en parallèle un player sur une radio " ou autres, vous lancez l'écoute. Sox commence à capturer l'audio. ( les niveaux se voient dans le terminal). Vous mettez en pause plus de 3 secondes le player (plus de 3s, c'est important). Vous remarquerez qu'on passe sur une seconde piste en attente de son dans le terminal. C'est normal, on est en pause. Changez de radio ou de musique, les niveaux sonores dans le terminal se remettent à bouger. Vous faites 4 ou 5 fois la manipulation en pensant bien à cette pause de 3 secondes. Si par hasard, la pause se faisait si une même piste, j'ai fait un truc pour couper un éventuel long silence.
Un fois ces quelques pistes capturées, un simple ctrl+c dans le terminal assemblera les 4 ou 5 morceaux, les fondera ensemble, calculera la longueur de ce gros fichier pour faire un fondu en ouverture et fermeture sur celui-ci.

il faudra copier dans son /usr/local/bin deux scripts que j'ai arrangé à ma sauce pour que ça fonctionne bien.
J'utilise  comme programme sox, ffmpeg, bc. On se retrouvera avec un dossier Crossfade dans son bureau avec les mix dedans.
Je me sers aussi que d'alsa.
C'est assez sympa.
Alors si ça vous dit smile

Sources :

https://github.com/jacksonh/sox/blob/ma … ade_cat.sh
https://stackoverflow.com/questions/286 … -using-sox

Dernière modification par golgot200 (07-08-2019 18:38:24)

Hors ligne

#2 07-08-2019 10:11:54

golgot200
Membre
Distrib. : Archlinux 2018-02-03
Noyau : Linux 5.7.11-arch1-1
(G)UI : Mate (Strict Minimum)
Inscription : 05-08-2007

Re : Un genre de Streamtuner (Record)

Bonjour,

apt install xdg-user-dirs bc ffmpeg sox




mettre ces deux scripts dans /usr/local/bin (en les rendant bien exécutables);

MIX.sh



#!/bin/bash

DIR=$(xdg-user-dir DESKTOP)
TMPDIR=/tmp/MIX_MUSIC
CROSSFADE=$DIR/Crossfade

JOUR=$(date +%d-%m-%y)
HEURE=$(date +%H.%M.%S)

if [ ! -d $TMPDIR ]; then
mkdir  $TMPDIR

  fi
 
if [ ! -d $CROSSFADE ]; then
mkdir  $CROSSFADE
 
  fi


for file in *.wav;
do

wav_file="$(file -bi "$file" | awk -F "; " '{print $1}' | awk -F "/" '{print $2}')"
if [ "$wav_file" == x-wav ]; then

sox -S "$file"  "$TMPDIR/CUT_$file" silence -l 1 0.1 1% -1 2.0 1%
## sox-14.4.2-4
#sox -S "$TMPDIR/CUT_$file" -r 44100 -b 16 --norm "$TMPDIR/NORMALIZE_${file%.wav}.wav";
## sox-14.4.2-5
sox -S "$TMPDIR/CUT_$file" -r 44100 -b 16 "$TMPDIR/NORMALIZE_${file%.wav}.wav" norm;
rm "$TMPDIR/CUT_$file"


  fi
done




for file in *.flac;
do
flac_file="$(file -bi "$file" | awk -F "; " '{print $1}' | awk -F "/" '{print $2}')"
if [ "$flac_file" == flac ]; then
sox -S "$file"  "$TMPDIR/CUT_$file" silence -l 1 0.1 1% -1 2.0 1%
## sox-14.4.2-4
#sox -S "$TMPDIR/CUT_$file" -r 44100 -b 16 --norm "$TMPDIR/NORMALIZE_${file%.flac}.wav";
## Normalized audio in sox: no such file
##  https://stackoverflow.com/questions/27716230/normalized-audio-in-sox-no-such-file
## sox-14.4.2-5
sox -S "$TMPDIR/CUT_$file" -r 44100 -b 16  "$TMPDIR/NORMALIZE_${file%.flac}.wav" norm;
rm "$TMPDIR/CUT_$file"


   fi
done


for file in *.mp3;
do
mp3_file="$(file -bi "$file" | awk -F "; " '{print $1}' | awk -F "/" '{print $2}')"
if [ "$mp3_file" == mpeg ]; then
sox -S "$file"  "$TMPDIR/CUT_$file" silence -l 1 0.1 1% -1 2.0 1%
## sox-14.4.2-4
#sox -S "$TMPDIR/CUT_$file" -r 44100 -b 16 --norm "$TMPDIR/NORMALIZE_${file%.mp3}.wav";
## Normalized audio in sox: no such file
##  https://stackoverflow.com/questions/27716230/normalized-audio-in-sox-no-such-file
## sox-14.4.2-5
sox -S "$TMPDIR/CUT_$file" -r 44100 -b 16  "$TMPDIR/NORMALIZE_${file%.mp3}.wav" norm;
rm "$TMPDIR/CUT_$file"


   fi
done


for file in *.m4a;
do
m4a_file="$(file -bi "$file" | awk -F "; " '{print $1}' | awk -F "/" '{print $2}')"
if [ "$m4a_file" == mp4 ]; then
ffmpeg -i "$file" "$TMPDIR/WAV_ENC_${file%.m4a}.wav"
sox -S "$TMPDIR/WAV_ENC_${file%.m4a}.wav" "$TMPDIR/CUT_${file%.m4a}.wav" silence -l 1 0.1 1% -1 2.0 1%
rm "$TMPDIR/WAV_ENC_${file%.m4a}.wav"
## sox-14.4.2-4
#sox -S "$TMPDIR/CUT_${file%.m4a}.wav" -r 44100 -b 16 --norm "$TMPDIR/NORMALIZE_${file%.m4a}.wav";
## sox-14.4.2-5
sox -S "$TMPDIR/CUT_${file%.m4a}.wav" -r 44100 -b 16  "$TMPDIR/NORMALIZE_${file%.m4a}.wav" norm;
rm "$TMPDIR/CUT_${file%.m4a}.wav"

   fi
done










 crossfade_dur=5
i=0

cd $TMPDIR
for f in *.wav
do

    i=$((i+1))

    if [ $i -eq 1 ]
    then
        cp "$f" $TMPDIR/mix.wav
    else
        crossfade_cat.sh $crossfade_dur $TMPDIR/mix.wav $TMPDIR/"$f" auto auto
    fi

done

 mv $TMPDIR/mix.wav "$CROSSFADE/$JOUR à $HEURE[CROSSFADE].wav"
 
 
 
##  POUR FfFMPEG
##  CHOIX :  (s16le ou s24le)
bits=s16le
##  CHOIX :  (44,1Khz-16Bits ,  48Khz-16Bits , 96Khz-24Bits ou 192Khz-24Bits)
INFO=44,1Khz-16Bits
 
 
 
## CALCUL DE LA DURÉE DU FICHIER    
     times=()

 _t=$(ffmpeg -i "$CROSSFADE/$JOUR à $HEURE[CROSSFADE].wav" 2>&1 | awk '/^  Duration/ { split($2, A, ":"); split(A[3], B, "."); print 3600*A[1] + 60*A[2] + B[1] - 5 }')
    times+=("$_t")

echo "${times[@]}" | sed 's/ /+/g' | bc

## FAIRE UN FONDU ENTRÉE / SORTIE SUR LE GROS FICHIER ENCHAINÉ.
 ffmpeg -guess_layout_max 0 -i "$CROSSFADE/$JOUR à $HEURE[CROSSFADE].wav" -acodec pcm_$bits  -af "afade=t=in:ss=0:d=1,afade=t=out:st=$times :d=4" "$CROSSFADE/$JOUR à $HEURE[CROSSFADE+IN_OUT].wav"
 
 # https://hoover.gplrank.info/?p=531
 # ffmpeg -i 1.wav -af afade=t=in:st=60:d=4,afade=t=out:st=125:d=5 2.wav
 rm "$CROSSFADE/$JOUR à $HEURE[CROSSFADE].wav"


## REFAIRE UN SCAN SUR LE GROS FICHIER POUR SUPPRIMER ÉVENTUELLEMENT UN BLANC ENTRE DEUX MORCEAUX.
sox -S "$CROSSFADE/$JOUR à $HEURE[CROSSFADE+IN_OUT].wav" "$CROSSFADE/$JOUR à $HEURE[CROSSFADE+IN_OUT+SILENT_REMOVE].wav" silence -l 1 00:00:00.1 -75d -1 00:00:00.1 -75d
 rm "$CROSSFADE/$JOUR à $HEURE[CROSSFADE+IN_OUT].wav"
 
 
 
 
 
 
 
 
 
# rm "$CROSSFADE/$JOUR à $HEURE[CROSSFADE].wav"
 rm -r $TMPDIR

sleep 5
 



et crossfade_cat.sh


#!/bin/bash
#
# crossfade_cat.sh
#
# Concatenates two files together with a crossfade of $1 seconds.
# Filenames are specified as $2 and $3.
#
# $4 is optional and specifies if a fadeout should be performed on
# first file.
# $5 is optional and specifies if a fadein should be performed on
# second file.
#
# Example: crossfade_cat.sh 10 infile1.wav infile2.wav auto auto
#
# By default, the script attempts to guess if the audio files
# already have a fadein/out on them or if they just have really
# low volumes that won't cause clipping when mixxing.  If this
# is not detected then the script will perform a fade in/out to
# prevent clipping.
#
# The user may specify "yes" or "no" to force the fade in/out
# to occur.  They can also specify "auto" which is the default.
#
# Crossfaded file is created as "mix.wav".
#
# Original script from Kester Clegg.  Mods by Chris Bagwell to show
# more examples of sox features.
#

#SOX=../src/sox
#SOXI=../src/soxi
SOX=/usr/bin/sox
SOXI=/usr/bin/soxi

if [ "$3" == "" ]; then
    echo "Usage: $0 crossfade_seconds first_file second_file [ fadeout ] [ fadein ]"
    echo
    echo "If a fadeout or fadein is not desired then specify \"no\" for that option.  \"yes\" will force a fade and \"auto\" will try to detect if a fade should occur."
    echo
    echo "Example: $0 10 infile1.wav infile2.wav auto auto"
    exit 1
fi

fade_length=$1
first_file=$2
second_file=$3

fade_first="auto"
if [ "$4" != "" ]; then
    fade_first=$4
fi

fade_second="auto"
if [ "$5" != "" ]; then
    fade_second=$5
fi

fade_first_opts=
if [ "$fade_first" != "no" ]; then
    fade_first_opts="fade t 0 0:0:$fade_length 0:0:$fade_length"
fi

fade_second_opts=
if [ "$fade_second" != "no" ]; then
    fade_second_opts="fade t 0:0:$fade_length"
fi

echo "crossfade and concatenate files"
echo
echo  "Finding length of $first_file..."
first_length=`$SOX --info -D "$first_file"`
echo "Length is $first_length seconds"

trim_length=`echo "$first_length - $fade_length" | bc`

# Get crossfade section from first file and optionally do the fade out
echo "Obtaining $fade_length seconds of fade out portion from $first_file..."
$SOX "$first_file" -e signed-integer -b 16 fadeout1.wav trim $trim_length

# When user specifies "auto" try to guess if a fadeout is needed.
# "RMS amplitude" from the stat effect is effectively an average
# value of samples for the whole fade length file.  If it seems
# quiet then assume a fadeout has already been done.  An RMS value
# of 0.1 was just obtained from trial and error.
if [ "$fade_first" == "auto" ]; then
    RMS=`$SOX fadeout1.wav 2>&1 -n stat | grep RMS | grep amplitude | cut -d : -f 2 | cut -f 1`
    should_fade=`echo "$RMS > 0.1" | bc`
    if [ $should_fade == 0 ]; then
        echo "Auto mode decided not to fadeout with RMS of $RMS"
        fade_first_opts=""
    else
        echo "Auto mode will fadeout"
    fi
fi

$SOX fadeout1.wav fadeout2.wav $fade_first_opts

# Get the crossfade section from the second file and optionally do the fade in
echo "Obtaining $fade_length seconds of fade in portion from $second_file..."
$SOX "$second_file" -e signed-integer -b 16 fadein1.wav trim 0 $fade_length

# For auto, do similar thing as for fadeout.
if [ "$fade_second" == "auto" ]; then
    RMS=`$SOX fadein1.wav 2>&1 -n stat | grep RMS | grep amplitude | cut -d : -f 2 | cut -f 1`
    should_fade=`echo "$RMS > 0.1" | bc`
    if [ $should_fade == 0 ]; then
        echo "Auto mode decided not to fadein with RMS of $RMS"
        fade_second_opts=""
    else
        echo "Auto mode will fadein"
    fi
fi

$SOX fadein1.wav fadein2.wav $fade_second_opts

# Mix the crossfade files together at full volume
echo "Crossfading..."
$SOX -m -v 1.0 fadeout2.wav -v 1.0 fadein2.wav crossfade.wav

echo "Trimming off crossfade sections from original files..."

$SOX "$first_file" -e signed-integer -b 16 song1.wav trim 0 $trim_length
$SOX "$second_file" -e signed-integer -b 16 song2.wav trim $fade_length
$SOX song1.wav crossfade.wav song2.wav mix.wav

echo -e "Removing temporary files...\n"
rm fadeout1.wav fadeout2.wav fadein1.wav fadein2.wav crossfade.wav song1.wav song2.wav
mins=`echo "$trim_length / 60" | bc`
secs=`echo "$trim_length % 60" | bc`
echo "The crossfade in mix.wav occurs at around $mins mins $secs secs"
 



Créer un dossier Scripts dans son home et y mettre le script suivant (exécutable aussi):

Pause_3s_Cut


#!/bin/bash

DIR=$(xdg-user-dir DESKTOP)
CROSSFADE=$DIR/Crossfade
TMPDIR=/tmp/VARIOUS_TRACKS




 
if [ ! -d $CROSSFADE ]; then
mkdir  $CROSSFADE
 
  fi
 
if [ ! -d $TMPDIR ]; then
mkdir  $TMPDIR
 
  fi


sox -r 44100 -t alsa default /$TMPDIR/VARIOUS_TRACKS_.wav silence 1 0.1 3% 1 3.0 3% : newfile : restart
find $TMPDIR -size -5k -type f -delete

cd $TMPDIR

MIX.sh *.wav $CROSSFADE
rm -r  "$TMPDIR"
 



Ce créer un lanceur sur son tableau de bord : (Moi, je suis sous Mate, donc j'utilise mate-terminal. A modifier au cas où)


Type: Application
Nom:  Capture Cut Silence
Commande: mate-terminal --geometry 108x12+166+640 -x sh -c "~/Scripts/Pause_3s_Cut;$SHELL"
Commentaire: Coupe si pas de son sur 3 secondes
 



Voilà smile Mode d'emploi post 1

Dernière modification par golgot200 (07-08-2019 10:19:39)

Hors ligne

#3 09-08-2019 16:08:35

golgot200
Membre
Distrib. : Archlinux 2018-02-03
Noyau : Linux 5.7.11-arch1-1
(G)UI : Mate (Strict Minimum)
Inscription : 05-08-2007

Re : Un genre de Streamtuner (Record)

J'ai peut-être oublié quelque chose ?  scratchhead.gif

Majoration Pause_3s_Cut


#!/bin/bash

DIR=$(xdg-user-dir DESKTOP)
CROSSFADE=$DIR/Crossfade
TMPDIR=/tmp/VARIOUS_TRACKS


 

  if [ ! -d "$TMPDIR" ]; then
mkdir  "$TMPDIR"
 
  fi


sox -r 44100 -t alsa default -e signed-integer "$TMPDIR"/VARIOUS_TRACKS_.wav silence 1 0.1 3% 1 3.0 3% : newfile : restart
find "$TMPDIR" -size -5k -type f -delete

COUNT_WAV=$(find "$TMPDIR" -maxdepth 1 -name '*.wav' | wc -l)

if [[ "$COUNT_WAV" -gt "1" ]]
then
mkdir  "$CROSSFADE"
cd "$TMPDIR" || exit

MIX.sh '*.wav' "$CROSSFADE"


  fi


DURATION=$(mediainfo --Output="General;%Duration%" "$TMPDIR"/*.wav)
if [[ "$COUNT_WAV" -eq "1" ]] && [[ "$DURATION" -gt 5000  ]]
then
mkdir  "$CROSSFADE"
cd "$TMPDIR" || exit

MIX.sh '*.wav' "$CROSSFADE"


  fi


rm -r  "$TMPDIR"
 

Dernière modification par golgot200 (29-05-2020 20:25:03)

Hors ligne

Pied de page des forums