Я знайшов якийсь хиткий спосіб, який вирішує цю проблему.
Я помітив, що коли виявляється тиша, сокс, природно, більше нічого не додає до файлу, поки він не почує більше звуку. Тому я вирішив, що можу спробувати скористатися цим фактом.
Перш за все, я запускаю звукозапис Sox у фоновому режимі:
rec /tmp/recording.flac rate 32k silence 1 0.1 3% -1 3.0 3% &
Далі я отримую PID процесу запису за допомогою: p=$!
Потім я даю процесу запису на секунду, щоб закінчити запуск, а потім чекаю, поки файл почне рости.
сон 1
до ["$ var1"! = "$ var2"]; робити
var1 = `du" /tmp/recording.flac "`
сон 1
var2 = `du" /tmp/recording.flac "`
зроблено
Після розриву цього циклу це означає, що звук був виявлений. Тож тепер я створюю ще один цикл, щоб зачекати, поки дані перестануть додаватися до файлу (це станеться, коли Sox знову виявить тишу).
відлуння "Виявлено звук"
до ["$ var1" == "$ var2"]; робити
var1 = `du" /tmp/recording.flac "`
сон 0,5
var2 = `du" /tmp/recording.flac "`
зроблено
Тепер мені просто потрібно кинути rec
:
відлуння "Виявлена тиша"
вбити $ p
І це все. Ось виконаний сценарій:
rec /tmp/recording.flac швидкість 32k тиша 1 0,1 3% -1 3,0 3% &
p = $!
сон 1
до ["$ var1"! = "$ var2"]; робити
var1 = `du" /tmp/recording.flac "`
сон 1
var2 = `du" /tmp/recording.flac "`
зроблено
відлуння "Виявлено звук"
до ["$ var1" == "$ var2"]; робити
var1 = `du" /tmp/recording.flac "`
сон 0,5
var2 = `du" /tmp/recording.flac "`
зроблено
відлуння "Виявлена тиша"
вбити $ p
Зараз я вважаю за краще кращий, стабільніший спосіб зробити це, але це доведеться працювати зараз.