Використовуйте sox
від SoX для аналізу короткого зразка звуку:
sox -t .wav "|arecord -d 2" -n stat
З -t .wav
задамо ми обробляємо тип 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 або службових файлів (залежно від вашої ОС / дистрибутива), щоб навіть не потрібно було запускати його вручну.