Znalazłem pewien chwiejny sposób, który rozwiązuje ten problem.
Zauważyłem, że po wykryciu ciszy, sox naturalnie nie doda nic więcej do pliku, dopóki nie usłyszy więcej dźwięku. Postanowiłem więc wykorzystać ten fakt.
Przede wszystkim uruchamiam rejestrator dźwięku SOX w tle:
rec /tmp/recording.flac rate 32k silence 1 0.1 3% -1 3.0 3% &
Następnie otrzymuję PID procesu nagrywania za pomocą: p=$!
Potem daję proces nagrywania sekundę na zakończenie uruchamiania, a następnie czekam, aż plik zacznie się powiększać.
spać 1
do [„$ var1”! = „$ var2”]; robić
var1 = `du" /tmp/recording.flac "`
spać 1
var2 = `du" /tmp/recording.flac "`
gotowy
Po przerwaniu tej pętli oznacza to, że dźwięk został wykryty. Teraz tworzę kolejną pętlę, aby poczekać, aż dane przestaną być dołączane do pliku (stanie się to, gdy sox ponownie wykryje ciszę).
echo „Wykryto dźwięk”
do [„$ var1” == „$ var2”]; robić
var1 = `du" /tmp/recording.flac "`
spać 0,5
var2 = `du" /tmp/recording.flac "`
gotowy
Teraz muszę tylko rzucić rec
:
echo „Wykryto ciszę”
zabij $ p
I to wszystko. Oto gotowy skrypt:
rec /tmp/recording.flac rate 32k cisza 1 0,1 3% -1 3,0 3% &
p = $!
spać 1
do [„$ var1”! = „$ var2”]; robić
var1 = `du" /tmp/recording.flac "`
spać 1
var2 = `du" /tmp/recording.flac "`
gotowy
echo „Wykryto dźwięk”
do [„$ var1” == „$ var2”]; robić
var1 = `du" /tmp/recording.flac "`
spać 0,5
var2 = `du" /tmp/recording.flac "`
gotowy
echo „Wykryto ciszę”
zabij $ p
Teraz wolałbym lepszy, bardziej stabilny sposób na zrobienie tego, ale na razie to będzie musiało działać.