Utilizzi creativi di aplay e arecord

aplay e arecord sono rispettivamente un player e un recorder per il sistema audio ALSA, utilizzato su linux…
OK, cosa ci possiamo fare di pratico ?
Beh, tante cose.
Per esempio, possiamo registrare una sorgente audio, selezionata tramite alsamixer.
L’utilizzo è semplice.. partiamo da arecord.
arecord -help ci svela tutte le opzioni disponibili.
arecord lanciato senza nessuna opzione apre il device audio di input e scrive sullo standard out i dati da esso prelevati, ovvero lo stream audio, nel formato di default.

utente-locale@macchina-locale:~$ arecord
Recording WAVE 'stdin' : Unsigned 8 bit, Rate 8000 Hz, Mono
[seguono una sfilza di caratteri]

Se vogliamo che lo stream audio vada su file piuttosto che su standard output, basta scrivere

utente-locale@macchina-locale:~$ arecord -d 10 miofile.wav

arecord produrrà il file “miofile.wav”, della durata di 10 secondi (-d 10).
Diciamo però che a noi non interessa registrare il file con arecord.. vogliamo capire invece cosa potremmo fare con lo stream di dati audio.
aplay, il programma complementare di arecord, serve a riprodurre file audio e, guarda caso, se lanciato senza parametri, legge i dati audio dal suo standard input.
Mettiamoci una cuffia con microfono e cominciamo a sperimentare.
La nostra prima prova sarà quella di ascoltare con aplay lo stream audio catturato da arecord. (occhio all’ effetto Larsen !)

utente-locale@macchina-locale:~$ arecord | aplay
Recording WAVE 'stdin' : Unsigned 8 bit, Rate 8000 Hz, Mono
Playing WAVE 'stdin' : Unsigned 8 bit, Rate 8000 Hz, Mono

Se il mixer è configurato bene, dovremmo ascoltare in cuffia quello che viene catturato dal microfono, con un piccolo ritardo.
Se la qualità non ci soddisfa, possiamo provare ad aumentare la frequenza di campionamento e portare la dimensione dei campioni da 8 a 16 bit.

utente-locale@macchina-locale:~$ arecord -fS16_LE -r44100 -traw -c1 | aplay -fS16_LE -r44100 -traw -c1
Recording raw data 'stdin' : Signed 16 bit Little Endian, Rate 44100 Hz, Mono
Playing raw data 'stdin' : Signed 16 bit Little Endian, Rate 44100 Hz, Mono

In questo modo ho selezionato un canale (-c1), una frequenza di campionamento di 44100 Hertz (-r44100) e la dimensione del singolo campione a 16 bit, nel formato Little Endian (-fS16_LE).
Ora la qualità del nostro “pappagallo elettronico” ci soddisfa.
Con il comando arecord | aplay abbiamo creato una pipe (un tubo) che collega lo standard output del primo programma allo standard input del secondo.
Per cui il secondo programma (aplay) legge i dati dal primo (arecord), ovvero Il segnale audio che esce dal microfono viene prelevato tramite arecord e re-immesso nelle cuffie ( o negli altoparlanti) tramite aplay.
Proviamo a fare un altro esperimento.. inseriamo nella pipe, tra arecord e aplay, un comando che elabora lo stream audio, introducendo effetti, per esempio sox.
Con questo comando applichiamo l’effetto “chorus”

utente-locale@macchina-locale:~$ arecord -fS16_LE -r22050 -traw -c1 | sox -traw -r22050 -w -s -c1 - -traw - chorus 1 .5 100 1 1 1 -t | aplay -fS16_LE -r22050 -traw -c1
Recording raw data 'stdin' : Signed 16 bit Little Endian, Rate 22050 Hz, Mono
Playing raw data 'stdin' : Signed 16 bit Little Endian, Rate 22050 Hz, Mono

con quest’altro il “vibrato”

utente-locale@macchina-locale:~$ arecord -fS16_LE -r22050 -traw -c1 | sox -traw -r22050 -w -s -c1 - -traw - vibro 30 1 | aplay -fS16_LE -r22050 -traw -c1
Recording raw data 'stdin' : Signed 16 bit Little Endian, Rate 22050 Hz, Mono
Playing raw data 'stdin' : Signed 16 bit Little Endian, Rate 22050 Hz, Mono

qui sotto “spostiamo” la frequenza verso l’alto… in pratica Ugo diventa signorina 🙂

utente-locale@macchina-locale:~$ arecord -fS16_LE -r22050 -traw -c1 | sox -traw -r22050 -w -s -c1 - -traw - pitch 800 | aplay -fS16_LE -r22050 -traw -c1
Recording raw data 'stdin' : Signed 16 bit Little Endian, Rate 22050 Hz, Mono
Playing raw data 'stdin' : Signed 16 bit Little Endian, Rate 22050 Hz, Mono

il contrario… spostiamo la frequenza in basso… da “-pitch 800” a “-pitch -800”.

utente-locale@macchina-locale:~$ arecord -fS16_LE -r22050 -traw -c1 | sox -traw -r22050 -w -s -c1 - -traw - pitch -800 | aplay -fS16_LE -r22050 -traw -c1
Recording raw data 'stdin' : Signed 16 bit Little Endian, Rate 22050 Hz, Mono
Playing raw data 'stdin' : Signed 16 bit Little Endian, Rate 22050 Hz, Mono

effetto riverbero

utente-locale@macchina-locale:~$ arecord -fS16_LE -r22050 -traw -c1 | sox -traw -r22050 -w -s -c1 - -traw - reverb 1 1000 333 333 333 333 | aplay -fS16_LE -r22050 -traw -c1
Recording raw data 'stdin' : Signed 16 bit Little Endian, Rate 22050 Hz, Mono
Playing raw data 'stdin' : Signed 16 bit Little Endian, Rate 22050 Hz, Mono

Non è tutto.
Volendo è possibile eseguire arecord su un computer e aplay su un altro, quindi ascoltare quanto catturato da arecord ( un microfono ?) su un altro computer, utilizzando come mezzo trasmissivo la rete.
Come fare?
Semplice, basta usare ssh.
tramite ssh è possibile lanciare comandi su una macchina remota.
Che poi il comando sia “ls -la” oppure “arecord” … a ssh non gliene frega niente!
Quindi semplicemente lanciando

utente-locale@macchina-locale:~$ ssh [utente remoto@]<macchina remota> arecord | aplay

sulla macchina locale “ascolteremo” quanto campionato sulla macchina remota.
Se non ci basta la qualità:

utente-locale@macchina-locale:~$ ssh [utente remoto@]<macchina remota> arecord -fS16_LE -r22050 -traw -c1 | aplay -fS16_LE -r22050 -traw -c1

Se non ci basta la banda, facciamo in modo che in rete viaggi lo stream audio compresso

utente-locale@macchina-locale:~$ ssh [utente remoto@]<macchina remota> "arecord -fS16_LE -r22050 -traw -c1 | sox -traw -r22050 -b 16 -e signed-integer -c1 - -togg -" | sox -togg - -traw -r22050 -e signed-integer -c1 -b 16 - | aplay -fS16_LE -r22050 -traw -c1

In quest’ultima maniera, sulla macchina remota viene campionato l’audio e compresso in formato ogg tramite sox, il risultato viene emesso sullo standard output, (che quindi viaggia in rete, dato che abbiamo lanciato il comando tramite ssh sulla macchina remota), sulla macchina locale viene effettuata l’operazione inversa, cioè la decodifica da formato ogg a formato raw, adatto per essere riprodotto da aplay.