Вот эскиз того, как улучшить решение J? Ugenl: rgen: это просто двойная буферизация, поэтому, анализируя один файл, вы уже начали записывать следующий. Я предполагаю, что этот трюк уменьшит разрывы до порядка 100 миллисекунд, но вам придется провести несколько экспериментов, чтобы выяснить это.
Полностью не проверено!
#!/bin/bash
record_interval=5
noise_threshold=3
storage_folder=~/recordings
exec 2>/dev/null # no default error output
function maybe_save { # out.wav date
max_level="$(sox "$1" -n stats -s 16 2>&1|
awk '/^Max\ level/ {print int($3)}')"
if [ $max_level -gt $noise_threshold ]; then
mv "$1" ${storage_folder}/recording-"$2"
else
rm "$1"
fi
}
i=0
while true; do
this=out$i.wav
rec $this &
pid=$?
if [ $i -gt 9 ]; then i=0; else i=$(expr $i + 1); fi
archive=$(date +%FT%T).wav;
sleep $record_interval
kill -TERM $pid
maybe_save $this $archive &
done
Ключ в том, что в тот момент, когда вы завершаете процесс записи, вы запускаете анализ в фоновом режиме, а затем совершаете еще одно путешествие по циклу, чтобы записать следующий фрагмент.
На самом деле вы должны сначала запустить следующий процесс записи, затем анализ, но это
сделает поток управления немного страшнее. Сначала я измерю, чтобы увидеть, какие скипы вы получаете.