Historique: pratique de SoX
Aperçu de cette version: 2
note
Cette page présentera pratique de SoX.
attention
Page en cours d'écriture
Table des matières
Premier paragraphe
Un début de tentative de description de quelques possibilités de l'outil en ligne de commandes 'SoX'
(à noter que je l'écris avec un S et un X en capitales car le nom est un condensé de "Sound eXchange")
Il présente, à mes yeux, plusieurs caractéristiques intéressantes :
- il est écrit en C, la lecture du code source est donc assez aisée même si le foisonnement de fonctionnalités peut rendre la tâche complexe.
- Il est multiplateforme, c'est appréciable si vous avez un OS particulier chez vous mais que vos amis ou vos studios favoris en utilisent un autre.
- Il est en ligne de commandes, dans un environnement sombre comme un backline de scène plutôt sombre ou un studio déjà surchargé de scintillements divers
pouvoir travailler sur une console bicolore bien contrastée peut sauver une préparation ou une réparation de dernière minute 😉
- Ses possibilités d'import/export sont variées et plutôt complètes.
pour voir les formats reconnus sur votre installation utilisez la commande
CODEsox -h | sed -n '/
AUDIO FILE FORMATS/p'CODE
Je recommande chaudement à ceux qui aimeraient expérimenter au delà des quelques exemples qui vont suivre de
consulter le manuel (man sox) ou s'il n'est pas installé ou installable de consulter en ligne :
http://sox.sourceforge.net/Docs/Documentation
(Seul petit problème, il n'y a pas, à ma connaissance, d'autre version de la documentation en une autre langue que l'anglais.)
Il va de soi que je ne présenterai ici que des exemples de ce que j'utilise couramment lorsque je n'ai pas la possibilité ou le besoin ou l'envie de
déranger la cavalerie GUI+plugins comme Ardour, Reaper, ou même le relativement frugal Audacity.
NOTE: Une option importante contre le "tir dans le pied" est '--no-clobber', qui vous préviendra en cas d'écrasement possible d'un fichier existant
il est conseillé de l'inclure dans la variable globale 'SOX_OPTS' ou d'utiliser un alias pour l'appel à Sox.
A) Jouer des fichiers audio
Le programme 'sox' est également appelable via le lien symbolique 'play', dans ce cas il sert non plus d'outil de traitement en vue d'un export
mais _"simplement"_ de lecteur, je souligne _"simplement"_ car ce mode de "lecture simple" permet toutefois d'utiliser toutes les fonctions de SoX
ce qui permet entre-autres de préparer et tester divers effets, paramétrages, transformations, pratique 😉
exemple, test de paramétrage d'une compression multibande "générique" :
CODEplay toto.wav compand 0.07,0.3 6:-40,-30,-20,-14,-9,-2,-0 -1 -2 0.15CODE
Comme lecteur "simple" cela peut aussi permettre à un instrumentiste de travailler sur une boucle, petit exemple :
calcul de la durée de deux mesures au tempo du morceau étudié (pour cet exemple Pinball Wizard, version 1969 tempo=123.149)
CODE echo "60/123.149*8" | bc -l
3.89771739924806535168CODE
Le début la section sur laquelle je désire travailler démarre à 32s 04 (premier riff de basse du couplet), je lance donc :
CODEplay 10-Pinball_Wizard.mp3 trim 32.04 3.89 repeat -CODE
à noter que la précision au 100ème de seconde n'est pas garantie puisque la précision réelle maximale sera
calée à la "frame" près ce qui sera donc variable suivant la fréquence d'échantillonnage, pour être plus finement précis
il est possible d'indiquer les quantités temporelles en "échantillon" grâce au suffixe 's' (pour Sample) ce qui
pour l'exemple pris ici (fréquence 44100) s'écrirait :
CODE play 10-Pinball_Wizard.mp3 trim 1412964s 171889s repeat -CODE
Dans un autre ordre d'idées il est possible d'utiliser un générateur d'ondes, par exemple si
vous voulez "punir" vos voisins du dessus qui ont bêtement oublié de vous inviter hier soir à leur jam session :
CODE
play -n -c1 synth sin %-3 sin %-7 sin %-11 sin %-29 fade h 0.1 0.5 0.3 repeat -
CODE
(instructions additionnelles : connecter au système audio 2x400W, monter le volume et sortir discrètement)
😎 Enregistrer des fichiers audio
Un autre lien symbolique vers SoX se nomme 'rec'.
Un exemple intéressant d'utilisation est donné dans le manuel (man rec), j'y ai déjà eu recours avec
plus ou moins de petites /variantes/ mais du fait que le manuel décrivait exactement la fonction que j'attendais
je n'ai rien noté dans mes antisèches ! C'est pourquoi je me contente ici de montrer l'intérêt de lire ce manuel en
en citant juste cet extrait :
CODE
rec -r 44100 -b 16 -e signed-integer -p \
silence 1 0.50 0.1% 1 10:00 0.1% | \
sox -p song.ogg silence 1 0.50 0.1% 1 2.0 0.1% : \
newfile : restart
records a stream of audio such as LP/cassette and splits in to multiple
audio files at points with 2 seconds of silence. Also, it does not start
recording until it detects audio is playing and stops after it sees 10 min-
utes of silence.
CODE
Ce qui permet de numériser le contenu d'une cassette audio (ou DAT, ou une bande ou une K7-8 pistes, etc. 😉
en démarrant automatiquement dès qu'un signal supérieur de 1/1000 au bruit de fond est perçu,
un fichier séparé (ici en format Vorbis Ogg) est créé chaque fois qu'un silence relatif d'au moins 2 secondes
est perçu, le processus s'arrêtera automatiquement après 10 minutes de silence relatif (paramètre '1 10:00 0.1%').
Les fichiers créés auront été nommés 1song.ogg .. 33song.ogg, Il est possible d'étoffer un peu ce comportement
par défaut en changeant simplement le nom de base de la sortie, par exemple à la place de 'song.ogg'
mettre 'concert-bongabonga-20150713-%3n.flac'
Le paramètre '-p' est un indicateur de "file pipe", le flux est transité en mode 'raw', pour les atroces détails ou précisions voir le manuel ;D)
C) Convertir des fichiers audio
Comme indiqué au début SoX reconnaît nativement la plupart des formats qui pourraient être utiles en audio,
pour vérifier ce qui est utilisable sur la machine que vous avez à disposition s'en remettre à la commande :
CODE
sox -h | sed -n '/
Je recommande chaudement à ceux qui aimeraient expérimenter au delà des quelques exemples qui vont suivre de
consulter le manuel (man sox) ou s'il n'est pas installé ou installable de consulter en ligne :
http://sox.sourceforge.net/Docs/Documentation
(Seul petit problème, il n'y a pas, à ma connaissance, d'autre version de la documentation en une autre langue que l'anglais.)
Il va de soi que je ne présenterai ici que des exemples de ce que j'utilise couramment lorsque je n'ai pas la possibilité ou le besoin ou l'envie de
déranger la cavalerie GUI+plugins comme Ardour, Reaper, ou même le relativement frugal Audacity.
NOTE: Une option importante contre le "tir dans le pied" est '--no-clobber', qui vous préviendra en cas d'écrasement possible d'un fichier existant
il est conseillé de l'inclure dans la variable globale 'SOX_OPTS' ou d'utiliser un alias pour l'appel à Sox.
A) Jouer des fichiers audio
Le programme 'sox' est également appelable via le lien symbolique 'play', dans ce cas il sert non plus d'outil de traitement en vue d'un export
mais _"simplement"_ de lecteur, je souligne _"simplement"_ car ce mode de "lecture simple" permet toutefois d'utiliser toutes les fonctions de SoX
ce qui permet entre-autres de préparer et tester divers effets, paramétrages, transformations, pratique 😉
exemple, test de paramétrage d'une compression multibande "générique" :
CODEplay toto.wav compand 0.07,0.3 6:-40,-30,-20,-14,-9,-2,-0 -1 -2 0.15CODE
Comme lecteur "simple" cela peut aussi permettre à un instrumentiste de travailler sur une boucle, petit exemple :
calcul de la durée de deux mesures au tempo du morceau étudié (pour cet exemple Pinball Wizard, version 1969 tempo=123.149)
CODE echo "60/123.149*8" | bc -l
3.89771739924806535168CODE
Le début la section sur laquelle je désire travailler démarre à 32s 04 (premier riff de basse du couplet), je lance donc :
CODEplay 10-Pinball_Wizard.mp3 trim 32.04 3.89 repeat -CODE
à noter que la précision au 100ème de seconde n'est pas garantie puisque la précision réelle maximale sera
calée à la "frame" près ce qui sera donc variable suivant la fréquence d'échantillonnage, pour être plus finement précis
il est possible d'indiquer les quantités temporelles en "échantillon" grâce au suffixe 's' (pour Sample) ce qui
pour l'exemple pris ici (fréquence 44100) s'écrirait :
CODE play 10-Pinball_Wizard.mp3 trim 1412964s 171889s repeat -CODE
Dans un autre ordre d'idées il est possible d'utiliser un générateur d'ondes, par exemple si
vous voulez "punir" vos voisins du dessus qui ont bêtement oublié de vous inviter hier soir à leur jam session :
CODE
play -n -c1 synth sin %-3 sin %-7 sin %-11 sin %-29 fade h 0.1 0.5 0.3 repeat -
CODE
(instructions additionnelles : connecter au système audio 2x400W, monter le volume et sortir discrètement)
😎 Enregistrer des fichiers audio
Un autre lien symbolique vers SoX se nomme 'rec'.
Un exemple intéressant d'utilisation est donné dans le manuel (man rec), j'y ai déjà eu recours avec
plus ou moins de petites /variantes/ mais du fait que le manuel décrivait exactement la fonction que j'attendais
je n'ai rien noté dans mes antisèches ! C'est pourquoi je me contente ici de montrer l'intérêt de lire ce manuel en
en citant juste cet extrait :
CODE
rec -r 44100 -b 16 -e signed-integer -p \
silence 1 0.50 0.1% 1 10:00 0.1% | \
sox -p song.ogg silence 1 0.50 0.1% 1 2.0 0.1% : \
newfile : restart
records a stream of audio such as LP/cassette and splits in to multiple
audio files at points with 2 seconds of silence. Also, it does not start
recording until it detects audio is playing and stops after it sees 10 min-
utes of silence.
CODE
Ce qui permet de numériser le contenu d'une cassette audio (ou DAT, ou une bande ou une K7-8 pistes, etc. 😉
en démarrant automatiquement dès qu'un signal supérieur de 1/1000 au bruit de fond est perçu,
un fichier séparé (ici en format Vorbis Ogg) est créé chaque fois qu'un silence relatif d'au moins 2 secondes
est perçu, le processus s'arrêtera automatiquement après 10 minutes de silence relatif (paramètre '1 10:00 0.1%').
Les fichiers créés auront été nommés 1song.ogg .. 33song.ogg, Il est possible d'étoffer un peu ce comportement
par défaut en changeant simplement le nom de base de la sortie, par exemple à la place de 'song.ogg'
mettre 'concert-bongabonga-20150713-%3n.flac'
Le paramètre '-p' est un indicateur de "file pipe", le flux est transité en mode 'raw', pour les atroces détails ou précisions voir le manuel ;D)
C) Convertir des fichiers audio
Comme indiqué au début SoX reconnaît nativement la plupart des formats qui pourraient être utiles en audio,
pour vérifier ce qui est utilisable sur la machine que vous avez à disposition s'en remettre à la commande :
CODE
sox -h | sed -n '/
AUDIO FILE FORMATS: 8svx aif aifc aiff aiffc al amb au avr caf cdda cdr cvs cvsd cvu dat dvms f32 f4 f64 f8 fap flac fssd gsm gsrt hcom htk ima ircam la lpc lpc10 lu mat mat4 mat5 maud mp2 mp3 nist ogg paf prc pvf raw s1 s16 s2 s24 s3 s32 s4 s8 sb sd2 sds sf sl sln smp snd sndfile sndr sndt sou sox sph sw txw u1 u16 u2 u24 u3 u32 u4 u8 ub ul uw vms voc vorbis vox w64 wav wavpcm wv wve xa xi
CODE
Pour les détails quant à leur variés noms et paramètres possibles, voir :
CODE
man soxformat
CODE
deux exemples courants,
avec passage de critère de qualité via -C :
CODE
sox titi.wav -C8 titi.ogg
CODE
un fichier typiquement stereo haute qualité vers une version mono 8 bits, rééechantillonée 8kHz puis normalisée :
CODE
sox toto.aiff -b8 -c1 mono.wav rate 8k norm
CODE
D) Appliquer des effets ou des transformations sur des fichiers audio
Deux variantes d'exciter via le compresseur multibandes 'compand' que j'utilise souvent pour avoir
rapidement un "rendu" pour le Net :
CODE
sox fichieroriginal.formatconnu -C 8 "fichierNet.SOXEXCITE.ogg" compand 0.07,0.3 6:-40,-30,-20,-14,-9,-2,-0 -1 -2 0.15
CODE
CODE
sox fichieroriginal.formatconnu -C 8 fichierNet.SOXEXCITELOUD.ogg" loudness -2 75 compand 0.07,0.3 6:-40,-30,-20,-14,-9,-2,-0 -1 -2 0.15
CODE
à partir de ces exemples vous pourrez tester vos propres variations ou ajouts de paramètres de compression et 'loudness'
n'oubliez pas qu'il est possible de tester en direct immédiat en appelant SoX via 'play', exemple :
CODE
play fichieroriginal.formatconnu compand 0.07,0.3 6:-40,-30,-20,-14,-9,-2,-0 -1 -2 0.15
CODE
Dans les cas d'empilement orgiaque d'effets, l'utilisation d'un fichier d'instructions via '--effects-file lestrucskejeve' est possible et recommandée 😉
Lire le manuel pour contempler et admirer, parfois avec une certaine crainte devant l'absolu, les ombreux 'effets' disponibles !
(l'effet 'reverse' est utilisé ci-dessous dans la section /E/
E) Traitements par lots
Même si en appel direct SoX permet de traiter plusieurs fichiers simultanément il y a des restrictions, d'une part l'utilisation du 'wildard' ne concerne que les fichiers d'entrée,
d'autre-part suivant l'OS et le 'shell' utilisés peuvent avoir des interprétations spécifiques du 'globbing' qui peuvent être particulièrement /cruelles/ si vous êtes justement sur
un ordinateur d'emprunt (studio, cousin, voisin, etc.)
Il est donc plutôt conseillé pour le traitement par lot de construire rapidement un script ou un "one-liner" correspondant au besoin.
Comme exemple simple de la facilité de traitement par lots voilà une petite version "CLI" de l'opération "Traitement par lot avec Audacity" https://linuxmao.org/tiki-index.php?page=Audacity%20-%20traitement%20par%20lot
Je précise que ce "Proof of Concept" n'est pas là pour dénigrer la version Audacity
mais juste en tant qu'information générale, pouvant éventuellement servir dans un
environnement privé d'un affichage Xorg (ou autre) suffisant pour autre chose qu'une console.
(j'admets que de nos jours ça peut se faire rare 😉
D'autre-part le script ci-dessous ne traite que le cas décrit dans la page qu'il commente,
pour d'autres opérations (exemple compressions, trandformations) il faudra évidemment modifier les
lignes de paramétrage des appels à SoX.
Note, le traitement est réalisé en 32 bits, l'import et l'export choisis ici étant en 16 bits il
y a effectivement un "dithering" impliqué, il est bien sûr possible d'exporter vers tout autre
format acceptable par SoX :
CODE
sox -h | sed -n '/
AUDIO FILE FORMATS/p'
AUDIO FILE FORMATS: 8svx aif aifc aiff aiffc al amb au avr caf cdda cdr cvs cvsd cvu dat dvms f32 f4 f64 f8 fap flac fssd gsm gsrt hcom htk ima ircam la lpc lpc10 lu mat mat4 mat5 maud mp2 mp3 nist ogg paf prc pvf raw s1 s16 s2 s24 s3 s32 s4 s8 sb sd2 sds sf sl sln smp snd sndfile sndr sndt sou sox sph sw txw u1 u16 u2 u24 u3 u32 u4 u8 ub ul uw vms voc vorbis vox w64 wav wavpcm wv wve xa xi
CODE
Le script :
CODE
mkdir ./cleaned
echo "patience..."
while read toto;
do
sox ${toto} -r 44100 -e signed -p silence 1 0.01t 0.065% reverse 2>/dev/null |\
sox -p -b 16 ./cleaned/${toto//*\//} silence 1 0.25t 0.065% 2>/dev/null
printf "."
done
CODE
Exemple d'utilisation :
CODE
:/tmp>: ls WAV/*wav > wavlist
:/tmp>: cat wavlist
WAV/BoomPtahShak_HotMonksParade_r1_session_2016-05-11_1855.wav
WAV/BoomPtahShak_HotMonksParade_r1_session_2016-10-12_1738.wav
WAV/session.wav
:tmp>: ./_PoC-cleanse_and_reverse.sh wavlist
patience...
...
Fini !
:tmp>: soxi {WAV,cleaned}/*wav | awk '/
AUDIO FILE FORMATS: 8svx aif aifc aiff aiffc al amb au avr caf cdda cdr cvs cvsd cvu dat dvms f32 f4 f64 f8 fap flac fssd gsm gsrt hcom htk ima ircam la lpc lpc10 lu mat mat4 mat5 maud mp2 mp3 nist ogg paf prc pvf raw s1 s16 s2 s24 s3 s32 s4 s8 sb sd2 sds sf sl sln smp snd sndfile sndr sndt sou sox sph sw txw u1 u16 u2 u24 u3 u32 u4 u8 ub ul uw vms voc vorbis vox w64 wav wavpcm wv wve xa xi
CODE
Le script :
CODE
- !/bin/bash
- sortie en erreur si un signal d erreur systeme ou interrupt (i-e:CtrlC)
- le parametre du script doit etre un fichier non vide
| exit 2 |
| ### abandon si quelque erreur |
| set -e |
| ### si le repertoire "cleaned" n'existe pas on le cree, si le nom est deja utilise le script abandonnera en erreur |
| ### (cela pourrait etre pris en compte en etoffant un peu ce script mais ce n'est pas l'objet de ce PoC) |
| -d ./cleaned |
echo "patience..."
- chaque ligne du fichier parametre est considere comme un "nom" de fichier accessible
- (cela pourrait etre affine en etoffant un peu ce script mais ce n'est pas l'objet de ce PoC)
while read toto;
do
sox ${toto} -r 44100 -e signed -p silence 1 0.01t 0.065% reverse 2>/dev/null |\
sox -p -b 16 ./cleaned/${toto//*\//} silence 1 0.25t 0.065% 2>/dev/null
printf "."
done
CODE
Exemple d'utilisation :
CODE
:/tmp>: ls WAV/*wav > wavlist
:/tmp>: cat wavlist
WAV/BoomPtahShak_HotMonksParade_r1_session_2016-05-11_1855.wav
WAV/BoomPtahShak_HotMonksParade_r1_session_2016-10-12_1738.wav
WAV/session.wav
:tmp>: ./_PoC-cleanse_and_reverse.sh wavlist
patience...
...
Fini !
:tmp>: soxi {WAV,cleaned}/*wav | awk '/
Input File : 'WAV/BoomPtahShak_HotMonksParade_r1_session_2016-05-11_1855.wav'
Duration : 00:05:40.00 = 14994000 samples = 25500 CDDA sectors
Input File : 'WAV/BoomPtahShak_HotMonksParade_r1_session_2016-10-12_1738.wav'
Duration : 00:05:41.00 = 16368000 samples ~ 25575 CDDA sectors
Input File : 'WAV/session.wav'
Duration : 00:05:24.01 = 14288783 samples = 24300.7 CDDA sectors
Input File : 'cleaned/BoomPtahShak_HotMonksParade_r1_session_2016-05-11_1855.wav'
Duration : 00:05:29.52 = 14531934 samples = 24714.2 CDDA sectors
Input File : 'cleaned/BoomPtahShak_HotMonksParade_r1_session_2016-10-12_1738.wav'
Duration : 00:05:29.17 = 14516227 samples = 24687.5 CDDA sectors
Input File : 'cleaned/session.wav'
Duration : 00:05:22.03 = 14201520 samples = 24152.2 CDDA sectors
CODE