Используйте sox
из * SoX ** для анализа короткого аудио сэмпла:
sox -t .wav "|arecord -d 2" -n stat
С -t .wav
мы указываем, что обрабатываем тип волны, "|arecord -d 2"
выполняет программу arecord
в течение двух секунд, -n
выводит в нулевой файл и с stat
мы указываем, что нам нужна статистика.
Вывод этой команды, в моей системе с некоторой фоновой речью:
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
Максимальная амплитуда может быть извлечена через нее:
grep -e "RMS.*amplitude" | tr -d ' ' | cut -d ':' -f 2
Мы grep
для нужной нам строки используем tr
для обрезки пробельных символов, а затем cut
его символом :
и берем вторую часть, которая дает нам 0.068383
в данном примере. Как следует из комментариев, RMS является лучшим измерением энергии, чем максимальная амплитуда.
Вы можете, наконец, использовать bc
на результат, чтобы сравнить значения с плавающей точкой из командной строки:
if (( $(echo "$value > $threshold" | bc -l) )) ; # ...
Если вы построите цикл (см. Bash примеры ), который вызывает спящий в течение 1 минуты, проверяет громкость, а затем повторяет, вы можете оставить его запущенным в фоновом режиме. Последний шаг - добавить его в init-скрипты или служебные файлы (в зависимости от вашей операционной системы / дистрибутива), чтобы вам даже не пришлось запускать его вручную.