Utilisez sox
de SoX pour analyser un échantillon audio court:
sox -t .wav "|arecord -d 2" -n stat
Avec -t .wav
nous spécifions nous traitons le type wav, "|arecord -d 2"
exécutons le arecord
programme pendant deux secondes, les -n
sorties dans le fichier null et avec stat
nous spécifions nous voulons des statistiques.
La sortie de cette commande, sur mon système avec un discours d’arrière-plan, est la suivante:
Recording WAVE 'stdin' : Unsigned 8 bit, Rate 8000 Hz, Mono
Samples read: 16000
Length (seconds): 2.000000
Scaled by: 2147483647.0
Maximum amplitude: 0.312500
Minimum amplitude: -0.421875
Midline amplitude: -0.054688
Mean norm: 0.046831
Mean amplitude: -0.000044
RMS amplitude: 0.068383
Maximum delta: 0.414063
Minimum delta: 0.000000
Mean delta: 0.021912
RMS delta: 0.036752
Rough frequency: 684
Volume adjustment: 2.370
L’amplitude maximale peut alors être extraite via:
grep -e "RMS.*amplitude" | tr -d ' ' | cut -d ':' -f 2
Nous, grep
pour la ligne que nous voulons, utilisons tr
pour supprimer les caractères de l'espace, puis cut
par le :
personnage et prenons la deuxième partie qui nous donne 0.068383
dans cet exemple. Comme suggéré par les commentaires, RMS est une meilleure mesure de l'énergie que l'amplitude maximale.
Vous pouvez enfin utiliser bc
le résultat pour comparer des valeurs à virgule flottante à partir de la ligne de commande:
if (( $(echo "$value > $threshold" | bc -l) )) ; # ...
Si vous créez une boucle (voir Exemples Bash ) qui appelle la veille pendant 1 minute, teste le volume, puis se répète, vous pouvez la laisser fonctionner en arrière-plan. La dernière étape consiste à l’ajouter aux scripts d’initialisation ou aux fichiers de service (selon votre système d’exploitation / distribution), de sorte que vous n’ayez même pas besoin de le lancer manuellement.