Les Tubes pour le traitement audio

Gazette Linux n°073 — Décembre 2001

Sébastien Marbrier

Adaptation française 

Prénom Nom du relecteur

Relecture de la version française 

Article paru dans le n°073 de la Gazette Linux de décembre 2001.

Cet article est publié selon les termes de la Open Publication License. La Linux Gazette n'est ni produite, ni sponsorisée, ni avalisée par notre hébergeur principal, SSC, Inc.


Table des matières

Convertisseur d'Échantillon Sonore
Lire plus ou moins vite
Édition simple
Sortie Son pour le Bureau
Musique comme source de morceau
Filtres d'effets

Depuis des décennies les utilisateurs expérimentés d'Unix ont utilisé de nombreux outils de traitement de texte pour rendre leurs tâches d'édition de documents plus aisée. Les utilitaires en ligne de commande tels que sed, awk, cut, paste et join bien qu'utiles séparément, ne donnent leur pleine mesure que lorsqu'ils sont combinés au travers de tubes.

Depuis peu, Linux est utilisé pour faire bien plus que du traitement de texte ASCII. La popularité grandissante de nombreux formats multimédias, sous la forme d'images et de données audio a stimulé le développement d'outils pour traiter ce type de fichier. Nombre de ces outils ont des interfaces graphiques et ne peuvent fonctionner sans interaction avec l'utilisateur. Il y a, cependant, un nombre grandissant d'outils qui peuvent fonctionner par lots sans leur interface. Certains sont même conçus pour être utilisés depuis l'interpréteur de commandes ou dans des scripts.

C'est cette catégorie d'outils qui traitée dans cet article. Les fonctions complexes de manipulation de média peuvent souvent être effectuée en combinant ensemble des outils simples avec des techniques habituellement appliquées aux filtres de traitement de texte.

Convertisseur d'Échantillon Sonore

Il existe de nombreux formats de fichier son et la conversion est une opération fréquente. L'outil de conversion sox remplit son rôle en étant invoqué à la ligne de commande :

            sox sample.wav sample.aiff 
    

La commande ci-dessus convertira un fichier WAV au format AIFF. On peut également modifier la fréquence d’échantillonnage, le nombre de bits par échantillons (8 ou 16), et le nombre de voies :

        sox morceau.aiff -r 8000 -b -c 1 bas.aiff 
    

Le fichier bas.aiff aura 8000 échantillons d'un octet par seconde avec une seule voie.

        sox morceau.aiff -r 44100 -w -c 2 haut.aiff 
    

Le fichier haut.aiff aura 44100 échantillons de 16 bits par seconde en stéréo.

Lorsque sox ne peut pas deviner le format de destination il est nécessaire de l'indiquer explicitement :

        sox morceau.wav -t aiff morceau.000
    

l'option -t raw indique un format spécial sans entête qui ne contient que des données brutes:

      sox morceau.wav -t raw -r 11025 -sw -c 2 morceau.000
    

Comme le fichier n'a pas d'en-tête indiquant la fréquence d’échantillonnage, le nombre de bits par échantillon, le nombre de voies, etc, c'est une bonne idée de les indiquer explicitement dans la ligne de commande. C'est nécessaire quand on convertit depuis le format brut :

      sox -t raw -r 11025 -sw -c 2 morceau.000 morceau.aiff
    

Il n'est pas nécessaire d'utiliser l'option "-t raw" si l'extension du fichier est .raw , cependant cette option est indispensable quand les morceaux bruts proviennent de l'entrée standard ou bien sont envoyées à la sortie standard. Pour cela, il faut utiliser "-" à la place du nom de fichier : "

        sox -t raw -r 11025 -sw -c 2 - morceau.aif < morceau.raw
        sox morceau.aiff -t raw -r 11025 -sw -c 2 - > morceau.raw
    

Pourquoi voudrions-nous faire cela ? Ce style d'utilisation permet à sox d'être utilisé dans un tuyau de commande.

Lire plus ou moins vite

Habituellement sox ajuste la fréquence d’échantillonnage sans altérer la hauteur ou le tempo du son grâce à l'interpolation. En faisant passer la sortie d'une instance de sox vers une autre en utilisant des fréquences d’échantillonnage différentes, nous pouvons contourner l'interpolation et effectivement ralentir un morceau sonore :

        sox morceau.aiff -t raw -r 44100 -sw -c 2 -|
        sox -t raw -r 32000 -sw -c 2 - lent.aif
    

ou l'accélérer :

        sox morceau.aiff -t raw -r 44100 -sw -c 2 -|
        sox -t raw -r 44100 -sw -c 2 - rapide.aiff
    

Édition simple

Supposons que l'on veuille produire un morceau avec les deux premières secondes d'un autre fichier son. Nous pouvons le faire avec sox dans un tuyau de commande tel que 

        sox morceau.aiff -t raw -r 44100 -sw -c 2 - | head -c 352800 |
        sox -t raw -r 44100 -sw -c 2 - deuxsecs.aiff
    

Le fichier d'entrée morceau.aiff est converti à la fréquence d’échantillonnage de 44,1 kHz, chaque échantillon étant sur deux octets avec deux voies. Ainsi les deux secondes de son sont représentées dans 44100x2x2x2 = 352800 octets de données qui sont extraites au moyen de head -c 352800. Elles sont ensuite reconverties au format AIFF et enregistrées dans deuxsecs.aiff

De même, pour extraire la dernière seconde d'un morceau :

        sox morceau.aiff -t raw -r 44100 -sw -c 2 - | tail -c 176400 |
        sox -t raw -r 44100 -sw -c 2 - dernièresec.aiff
    

Et la troisième seconde

        sox morceau.aiff -t raw -r 44100 -sw -c 2 - | tail -c +352801 |
        head -c 176400 |sox -t raw -r 44100 -sw -c 2 - dernièresec.aiff
    

Vous noterez qu'avec les morceaux sur 16 bits, l'argument « tail -c +N » doit être impair, autrement les morceaux bruts ne seront plus alignés.

On peut extraire des parties de différents échantillons et les recoller ensemble dans un fichier grâce à des lignes de commandes imbriquées :

        (sox morceau-1.aiff -t raw -r 44100 -sw -c 2 -  | head -c 176400
        sox morceau-2.aiff -t raw -r 44100 -sw -c 2 -  | head -c 176400 ) |
        sox -t raw -r 44100 -sw -c 2 - nouveaumorceau.aiff
    

Nous invoquons ici, un interpréteur de commande enfant qui extrait les échantillons bruts vers la sortie standard depuis deux fichiers source. Un tube vers un processus sox qui s'exécute dans l'interpréteur de commande père qui créé le fichier final.

Sortie Son pour le Bureau

Les sons peuvent être envoyés au périphérique OSS (open sound system) /dev/dsp avec l'option « -t ossdsp »

        sox morceau.aiff -t ossdsp /dev/dsp
    

Le logiciel sox inclut habituellement un script indépendant de la plate-forme play qui invoque sox avec les options adéquates. La commande précédente aurait pu être invoquée simplement avec :

        play morceau.aiff
    

Les morceaux audio joués de cette façon, monopolisent la sortie matérielle. Une autre application utilisant le son doit attendre jusqu'à ce que le périphérique audio soit libéré avant de tenter de jouer d'autres morceaux. Les environnements de bureaux tels que GNOME et KDE fournissent des fonctionnalités pour jouer plusieurs sons simultanément. Ils peuvent provenir de différentes applications à n'importe quel instant et sans devoir attendre, et sans que chaque application audio ne sache comment travailler avec chacun des différents bureaux. Sox ne dispose pas de cette capacité. Toutefois, après quelques recherches sur les services audio proposés par GNOME et KDE, on peut deviner comment surmonter cette limitation.

Assez peu de logiciels permettent le partage de périphérique audio. une stratégie répandue consiste à utiliser un serveur de son en arrière-plan auquel les applications doivent envoyer leurs morceaux. Le serveur prend alors le contrôle du système sonore et y envoie les données. Lorsque plusieurs clients envoient leurs morceaux en même temps, le serveur les mélange pour obtenir un flux unique au périphérique de sortie.

Enlightened Sound Daemon (ESD) utilise cette méthode. Le serveur, esd, tourne souvent en tâche de fond des bureaux GNOME. L'ensemble logiciel ESD s'appelle esound sur la plupart des distributions et inclut quelques applications client simples, telles que 

  • esdplay — joue des sons enregistrés dans l'un des formats de fichiers les plus répandus (WAV, AU ou AIFFV)

  • esdcat — soumet des morceaux bruts au serveur. Cet outil convient naturellement pour terminer un tuyau de filtres sons.

Cette commande jouera la première seconde d'un morceau via ESD :

        sox morceau.aiff -t raw -r 44100 -sw -c 2 - | head -c 176400 | esdcat
    

Il est possible de jouer des morceaux dans un format non reconnu par ESD mais qui le sont par sox :

        sox morceau.cdr -t raw -r 44100 -sw -c 2 - | esdcat | esdcat
    

Dans certains cas, les morceaux paraissent meilleurs quand ils sont joués de cette façon. Certaines versions de ESD introduisent une distorsion significative et du bruit lorsque qu'un son a été enregistré avec une faible fréquence d’échantillonnage.

Analog RealTime Synthesizer (ARtS) est similaire à ESD mais il est souvent utilisé avec KDE. Le serveur en arrière-plan est artsd avec les programmes clients correspondant, artsplay et artscat. Pour jouer un son :

        sox morceau.cdr -t raw -r 44100 -sw -c 2 - | tail -c 352800 | artscat
    

ESD et ARtS sont tous deux indépendants des environnements de bureaux. Avec quelques efforts, il est possible en théorie d'utiliser ESD avec KDE et ARtS avec GNOME. Chacun peut même être utilisé dans une session console. Il est ainsi possible de mélanger des sons, encodés dans une pléthore de formats, avec ou sans l'interface graphique du bureau.

Musique comme source de morceau

Après avoir étudié ce qui sort du tuyau audio, nous devrions examiner ce qui peut être placé à l'entrée. Il arrive de temps en temps que l'on souhaite manipuler des morceaux extraits de fichiers sons au format MP3, MIDI ou des fichiers module au format MOD, XM, S3M, etc). Des outils en ligne de commande existent pour chacun de ses formats pour envoyer des morceaux bruts sur la sortie standard.

Pour les fichiers sons MP3, on peut utiliser « maplay -s »

        maplay -s musique.mp3 | artscat
    

Le fichier musique.mp3 doit être encodé à 44,1kHZ, en stéréo pour être lu correctement par artscat ou esdcat, dans le cas contraire, il faut leur indiquer :

        maplay -s mono22khz.mp3 | esdcat -r 22050 -m 
        maplay -s mono22khz.mp3 | esdcat -r 22050 -c 1
    

On peut utiliser à la place « mpg123 -s ». Des arguments supplémentaires garantissent que la sortie sera au bon taux et au bon nombre de voies  :

        mpg123 -s -r 44100 --stereo mono22khz.mp3 | esdcat -r 22050 -m 
    

Les utilisateurs de Ogg Vorbis peuvent utiliser la commande suivante ;

      ogg123 -d raw -f - musique.ogg |artscat
    

La mise en tuyau n'est pas vraiment nécessaire ici puisque ogg123 a des pilotes de sortie ESD et ARtS intégrés. Néanmoins, il est toujours utile d'avoir accès à un flux de données sonores brutes que l'on peut alimenter par un tuyau.

Les fichiers sonores peuvent aussi être obtenu au format MIDI. Si (comme moi) vous avez une ancienne carte son avec un séquenceur matériel médiocre, vous pouvez estimer que timidity peut faire des merveilles. Normalement ce logiciel converti les fichiers MIDI en morceaux audio pour une sortie directe sur la sortie son. Les options en ligne de commande soigneusement choisies permettent de rediriger cette sortie :

      timidity -Or1sld -o - -s 44100 musique.mid |artscat
    

L'option « -o - » envoi les données sonores sur la sortie sonore. « -Or1sl » garanti que les morceaux sont au format 16 bit signés, et « -s 44100 » règle correctement la fréquence d'échantillonnage

Si vous êtes un passionné de la scène démo vous pourriez vouloir jouer quelques modules musique sur votre bureau. Par chance, mikmod peut jouer la plupart des formats module les plus courants. Le programme peut également envoyer directement la sortie directement au périphérique sonore ou via ESD. L'actuelle version stable de libmikmod, la 3.1.9 ne semble pas encore capable de gérer ARtS. On peut y remédier au moyen d'un tube :

      mikmod -d stdout -q -f 44100 musique.mod | artscat
    

Le -q est nécessaire pour désactiver l'interface textuelle qui utilise également la sortie standard. Si vous voulez toujours accéder à cette interface vous devriez essayer :

      mikmod -d pipe,pipe=artscat -f 44100 musique.mod
    

Seules les plus récentes versions de mikmod peuvent créer leurs propres tuyaux de sortie.

Filtres d'effets

Reprenons sox, qui aime bien les tubes. En plus des ses capacités de conversion de formats, il y a une petite librairie de filtres d'effets. Voici quelques exemples :

  • Ajouter de l'écho

    play morceau.aiff echo 1 0.5 150 0.6
  • Ajouter des vibrations

    play morceau.aiff vibro 20 0.9
  • Ajouter une forte distorsion

    play morceau.aiff flanger 0.7 0.7 4 0.8 2play morceau.aiff phaser 0.6 0.6 4 0.6 2
  • Filtre passe-bande —— comme sur une mauvaise ligne téléphonique :

    play morceau.aiff band 3000 700

    ou écouter à travers une épaisse couverture :

    play morceau.aiff band 0 700
  • Créer un chœur de sons à partir d'un seul morceau 

    play morceau.aiff chorus 0.7 0.7 20 1 5 2 -s
  • Trouver des messages cachés? Pour jouer à l'envers :

    play morceau.aiff reverse

Avertissement : selon la taille du morceau, une grande quantité de mémoire et/ou d'espace disque peut être consommé

Mettons tout ensemble

Les composants principaux d'un tube de commande audio ont étés abordés à présent. Voyons comment ils peuvent être combinés pour réaliser quelques fonctions non triviales :

  • Jouer un module son sur le bureau KDE avec un effet de chœur :

    mikmod -d stdout -q -f 44100 musique.xm | sox -r raw -r 44100 -sw -c 2 - -t raw - chorus 0.7 0.7 80 0.5 2 1 -s | artscat
  • Jouer une chanson au format Ogg Vorbis amputée des quatre premières secondes :

    ogg123 -d raw -f - musique.ogg | tail -c +705601 | artscat
  • Convertir un fichier MIDI au format Ogg Vorbis en ajoutant un léger écho :

    timidity -Or1s1 -o - -s 44100 musique.mid | sox -t raw -r 44100 -sw -c 2 - -t raw - echo 1 0.6 80 0.6 | oggenc -o musique.ogg --raw -

    Le tube doit être terminé par l'encodeur Ogg Vorbis oggenc, ici configuré pour accepter les données brutes depuis l'entrée standard.

  • Convertir un fichier MP3 32kHz mono en fichier Ogg Vorbis stéréo, en abaissant le volume lors du processus :

    maplay -s mono32.mp3 | sox -v 0.5 -t raw -r 32000 -sw -c 1 - -t raw -r 44100 -c 2 - split | oggenc -o musique.ogg --raw -
  • Concaténer tous les fichier AIFF du répertoire courant dans un fichier WAV unique :

    for x in *.aiff do sox $x -v 0.5 -t raw -r 8000 -bu -c 1 -done | sox -t raw -r 8000 -bu -c 1 - tous.wav

Ces exemples ne font qu'effleurer ce qu'il peut être fait avec la technique des tuyaux. Il ne s'agit pas de s'opposer aux applications interactives dotées d'interfaces graphiques élaborées. Elles permettent souvent de réaliser des tâches bien plus compliquées tout en épargnant à l'utilisateur de mémoriser des pages d'arguments. Cependant, il y aura toujours des cas où les tubes de commande seront plus adaptés. Convertir un grand nombres de morceaux musicaux nécessite de faire appel à des scripts. Les programmes interactifs ne peuvent être invoquées dans des tâches at ou cron.

Les tubes audio permettent également d'économiser l'espace disque. On n'a pas besoin d'enregistrer des douzaines de copies du même morceau avec les différentes modifications appliquées. Au lieu de cela, créer une douzaine de scripts, avec chacun un tube d'effet différent. Ils peuvent être invoqués pour la version modifiée appropriée du morceau. Le son modifié est généré à la demande.

Je vous encourage à faire des expérimentations avec les outils décrits dans cet article. Essayer de les combiner ensemble dans des séquences de plus en plus élaborées. Le plus important, n'oubliez de vous amuser.

Adrian J Chung

Quand il n'enseigne pas l'informatique en premier cycle à l'Université des Indes Orientales à Trinidad, Adrian écrit des scripts système pour gérer un réseau d'ordinateurs Linux, et conduit des expériences interfaçant divers environnement scriptés avec logiciels de rendus graphiques maison et des librairies de visualisation de données.

Adaptation française de la Gazette Linux

L'adaptation française de ce document a été réalisée dans le cadre du Projet de traduction de la Gazette Linux.

Vous pourrez lire d'autres articles traduits et en apprendre plus sur ce projet en visitant notre site : http://www.traduc.org/Gazette_Linux.

Si vous souhaitez apporter votre contribution, n'hésitez pas à nous rejoindre, nous serons heureux de vous accueillir.