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