Projet: Utiliser Sox pour amplifier le niveau audio de vos correspondant. Ceci par l’exemple.
J’ai pris pour ce test un raspberry pi et un PMR 446mhz.
Voir mon article: https://www.f4htb.fr/2017/04/06/installation-de-mumble-en-mode-client-pour-relai-gateway-standalone/
I.deux flux audio:
1. ce que le raspi recoi via le client mumble et qui va être retransmi par le PMR
2. ce qui est reçu par le PMR et qui va être envoyé sur mumble via le raspi
Le but ici est d’insérer un petit utilitaire entre le client mumble et la carte son dans le sens client mumble => carte son et carte son => client mumble.
Pour cela, il faut créer une carte son intermédiaire appelé alsa loopback et relier ce loopback a la vrais carte son via le logiciel qui va faire les transformations.
Client Mumble => Loopback alsa => arecord, sox, aplay => carte son
Carte son => Loopback alsa => arecord, sox, aplay => carte son
II.créer la carte son virtuelle alsa loopback
sudo nano /etc/modules
Ajouter: snd-aloop
————
# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with « # » are ignored.
#Ajout pour RFR
snd-aloop
sudo nano /lib/modprobe.d/aliases.conf
en dessous de options snd-via82xx-modem index=-2 mettre:
options snd-aloop index=1 id=GWloop pcm_substreams=2 enable=1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# These are the standard aliases and dependencies. # This file does not need to be modified. # prevent unusual drivers from appearing as the first sound device ########### options snd-pcsp index=-2 options snd-usb-audio index=-2 options cx88_alsa index=-2 options snd-atiixp-modem index=-2 options snd-intel8x0m index=-2 options snd-via82xx-modem index=-2 #Ajouter pour RFR options snd-aloop index=1 id=GWloop pcm_substreams=2 enable=1 # work around other kernel issues ############################################ # The EHCI driver should be loaded before the ones for low speed controllers # or some devices may be confused when they are disconnected and reconnected. softdep uhci-hcd pre: ehci-hcd softdep ohci-hcd pre: ehci-hcd |
Redémarer le raspi.
En faisant un aplay -l vous aller voir une nouvelle carte son avec deux devices:
1 2 3 4 5 6 7 8 |
carte 1: GWloop [Loopback], périphérique 0: Loopback PCM [Loopback PCM] Sous-périphériques: 1/2 Sous-périphérique #0: subdevice #0 Sous-périphérique #1: subdevice #1 carte 1: GWloop [Loopback], périphérique 1: Loopback PCM [Loopback PCM] Sous-périphériques: 1/2 Sous-périphérique #0: subdevice #0 Sous-périphérique #1: subdevice #1 |
Lorsque vous envoyez du son dans plughw:CARD=GWloop,DEV=1 ca resort sur plughw:CARD=GWloop,DEV=0 et invesement
Les deux sens sont possible en même temps, ce sont des tubes indépendants.
III.Mumble
Entrée audio:
Sortie Audio:
IV. Les commandes pour jouer avec les loopback et sox
1 |
(arecord -B 1000000 -q -N -f S16_LE -r 48000 -c 1 -D plughw:CARD=GWloop,DEV=1 -t raw | sox -r 48000 -c1 -b 16 -e signed -q -t raw - -t raw - sinc 300-5000 gain -3 equalizer 2k 500 +3 compand 0.02,0.8 -90,-90,-60,-10,-40,-10,-20,-10,-10,-10,-6,-10,-3,-10,0,-10 -10 | aplay -B 1000000 -q -N -f S16_LE -r 48000 -c 1 -D plughw:CARD=DeviceEEPROM,DEV=0 - ) >> /home/pi/outputfile 2>&1 & |
La commande est a découper en trois partie via des | ce que l’on appel des « pipes ».
Ca sert a envoyer la sortie d’une commande dans l’entrée d’une autre. Pour les fans des films d’horreur, c’est comme dans « human centiped » ou « human centipad » pour les fans de south park.
En première partie, arecord permet de récupérer le son de Gwloop,DEV=1, ce qui corespond a l’autre côté du tuyau que l’on a mis dans mumble voir ci-dessus. On lui dit également de bufferiser 1000000 µS pour éviter les micros coupures. S16_LE est le forma 16 bits. -r 48000 est la fréquence d’echantillonage en hz, -c 1 veut dire mono (1 seul canal en réalité), on lui dit -q pour qu’il ne sort pas trop de text qui ne sert a rien.
Deuxième partie, sox est l’utilitaire qui permet le traitement audio, -r 48000 -c1 -b 16 -e signed -q ca définie 48khz… 1 canal… 16 bits… signed pour etre en S de S16_LE. -t raw c’est le format de transition, on aurai pu utiliser mp3 ou wav par exemple.
sinc 300-5000 est un filtre kaiser-windowed band-pass avec des pentes a -120db
gain -3 equalizer 2k 500 +3 On applique du gain sur le haut de la bf pour eviter les cannard. On met un gain de -3 pour éviter le cliping.
Compand 0.02,0.8 -90,-90,-60,-10,-40,-10,-20,-10,-10,-10,-6,-10,-3,-10,0,-10 -10 on fait un compresseur limiteur pour ramener le tout a -10db.
Ceci pour effet de filtrer >300hz pour enlever les bourdonement du ctcss et au dessus de 5000 pour ne pas saturer spectralement l’entrée du boafeng.
Le couple equalizer +3db sur +/- 500hz autour de 2khz pour atténuer les voix de cannard, gain -3 db pour ne pas faire de cliping.
Et enfin on ramène le tout a -10db avec un compresseur limiteur. En premier dans l’ordre, l’attaque et la relache. Chaque couple de deux séparer par des « , » est un début et la limite a laquel le ramener. Par exemple on a -90,-90,-60,-10 cela veux dire que en dessous de -90 on ne touche pas. De -90 à -60 on met a -90, de -60 à -40, on met à -10 etc…
Troisième et dernière partie, on envoie le tout cers la carte son: plughw:CARD=DeviceEEPROM,DEV=0
Vous l’aurez compris ca c’était le sens mumble vers carte son.
Voici la commande pour la carte son vers mumble:
1 |
(arecord -B 1000000 -q -N -f S16_LE -r 48000 -c 1 -D plughw:CARD=DeviceEEPROM,DEV=0 -t raw | sox -r 48000 -c1 -b 16 -e signed -q -t raw - -t raw - sinc 300-5000 gain -3 equalizer 2k 500 +3 compand 0.02,0.8 -90,-90,-60,-10,-40,-10,-20,-10,-10,-10,-6,-10,-3,-10,0,-10 -10 noisered /home/pi/noise.prof 0.5| aplay -B 1000000 -q -N -f S16_LE -r 48000 -c 1 -D plughw:CARD=GWloop,DEV=1 - ) >> /home/pi/outputfile 2>&1 & |
V.script de démarage automatique dans /etc/init.d/mumbleclient:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
#!/bin/sh ### BEGIN INIT INFO # Provides: mumbleclient # Required-Start: vncserver $all # Required-stop: # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Description: ### END INIT INFO # /etc/init.d/mumbleclient VNCUSER='pi' case "$1" in start) (arecord -B 500000 -q -N -f S16_LE -r 48000 -c 1 -D plughw:CARD=GWloop,DEV=1 -t raw | sox -r 48000 -c1 -b 16 -e signed -q -t raw - -t raw - sinc 300-5000 gain -3 equalizer 2k 600 +3 compand 0.02,0.8 -90,-90,-60,-10,-40,-10,-20,-10,-10,-10,-6,-10,-3,-10,0,-10 0 dither | aplay -B 500000 -q -N -f S16_LE -r 48000 -c 1 -D plughw:CARD=DeviceEEPROM,DEV=0 - ) >> /dev/null 2>&1 & (arecord -B 500000 -q -N -f S16_LE -r 48000 -c 1 -D plughw:CARD=DeviceEEPROM,DEV=0 -t raw | sox -r 48000 -c1 -b 16 -e signed -q -t raw - -t raw - sinc 300-5000 gain -3 equalizer 2k 500 +3 compand 0.02,0.8 -90,-90,-60,-30,-40,-10,-6,-6,-6,-6,-6,-6,-3,-6,0,-6 -3 noisered /home/pi/noise.prof 0.5 dither | aplay -B 500000 -q -N -f S16_LE -r 48000 -c 1 -D plughw:CARD=GWloop,DEV=1 - ) >> /dev/null 2>&1 & su $VNCUSER -c 'nice -n -19 mumble "mumble://nom_de_votre_client:mot_de_passe@adresse_IP_du_serveur:port/canal&version=1.2.0" -display :1 >/dev/null 2>&1 &' sleep 5 sudo renice -18 -p $(pidof mumble) sudo chrt -pf 20 $(pidof mumble) sleep 20 IPGW=$(/bin/ip route | awk '/default/ { print $3 }') /bin/ping -i 5 $IPGW & echo "Démarrage de Mumble Server pour l'utilisateur $VNCUSER " ;; stop) pkill mumble pkill sox echo "mumble client arrêté" ;; *) echo "Usage: /etc/init.d/mumbleclient {start|stop}" exit 1 ;; esac exit 0 |