Piszę skrypt, który używa sox do nagrywania mojej rozmowy. Teraz potrzebuję soxa, aby poczekał, aż wykryje dźwięk, zanim zacznie nagrywać, i muszę to rozgryźć. Ale potrzebuję również sox, aby wyjść, gdy zapadnie cisza przez co najmniej 3 sekundy. Tak jak jest teraz, muszę ręcznie zabić sox, kiedy skończę mówić, w przeciwnym razie sox po prostu zaczeka, aż powiem więcej, dołączając do pliku wyjściowego (nie tego chcę). Oto polecenie nagrywania, którego używam teraz:
rec /tmp/recording.flac rate 32k silence 1 0.1 3% -1 3.0 3%
Ponownie, dla jasności, Sox powinien poczekać, aż zacznę mówić, a następnie nagrywać, aż przestanę mówić, a następnie program sox powinien zakończyć.
Udoskonaliłem trochę powyższe pomysły. Zapisuje wiecznie, rejestruje cały hałas, aż (z grubsza) sekunda ciszy. Następnie:
(Sprawia, że bardzo poręczny wzmacniacz echa UHF / 2 metry)
źródło
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:
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ć.
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ę).
Teraz muszę tylko rzucić
rec
:I to wszystko. Oto gotowy skrypt:
Teraz wolałbym lepszy, bardziej stabilny sposób na zrobienie tego, ale na razie to będzie musiało działać.
źródło
To nasłuchuje na zawsze, nagrywa tylko ostatnie dźwięki, dopóki nie usłyszy jednej sekundy ciszy, a następnie zapisuje plik, znaczniki czasu i uruchamia się ponownie:
źródło
while true
pętle