Zakończ nagrywanie sox po wykryciu ciszy

16

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ć.

Izaak
źródło

Odpowiedzi:

13

Usuń znak ujemny z pierwotnego polecenia:

rec /tmp/recording.flac rate 32k silence 1 0.1 3% 1 3.0 3%

Kiedy „poniżej zliczenia” jest ujemne, polecenie ciszy wycina wszystkie cisze ze środka pliku. Gdy jest pozytywny, przycina ciszę od końca pliku.

meetar
źródło
1
To jest znacznie prostsze rozwiązanie niż to, które wymyśliłem, LOL!
Izaak,
3

Udoskonaliłem trochę powyższe pomysły. Zapisuje wiecznie, rejestruje cały hałas, aż (z grubsza) sekunda ciszy. Następnie:

  • Zapewnia utworzenie dwóch podkatalogów
  • Oblicza dwa spektrografy nagrania - jeden przed normalizacją, a drugi po i zapisuje do folderów ze znacznikami danych.
  • Zapisuje znormalizowany plik do pliku w folderze ze znacznikiem danych.
  • Odtwarza znormalizowany plik z dwoma plikami ćwierkającymi .ogg (wstecz przez sterowane głosem radio CB)

(Sprawia, że ​​bardzo poręczny wzmacniacz echa UHF / 2 metry)

#! / bin / bash
chociaż prawda; robić
  rec buffer.ogg cisza 1 0,1 5% 1 1,0 5%
  DATA = `data +% Y% m% d% H% M% S`
  DPATH = `data +% Y /% m /% d /`
  mkdir -p ./spectro/$DPATH
  mkdir -p ./voice/$DPATH
  echo Zmiana nazwy pliku bufora na $ DATE
  sox buffer.ogg -n spektrogram -x 300 -y 200 -z 100 -t $ DATE.ogg -o ./spectro/$DPATH/$DATE.png
  sox buffer.ogg normbuffer.ogg gain -n -2
  sox normbuffer.ogg -n spektrogram -x 300 -y 200 -z 100 -t $ DATE.norm.ogg -o ./spectro/$DPATH/$DATE.norm.png
  mv normbuffer.ogg ./voice/$DPATH/$DATE.ogg
  zagraj pre.ogg ./voice/$DPATH/$DATE.ogg post.ogg 
gotowy
Nigel Weeks
źródło
2

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ć.

Izaak
źródło
1

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:

#!/bin/bash
/usr/bin/sox -t alsa default /home/default/working/recording.wav silence 1 0.1 5% 1 1.0 5%
DATE=$(date +%Y%m%d%H%M%S)
mv /home/default/working/recording.wav /home/default/waiting/$DATE.recording.wav
/home/default/startrecord.sh
Jared Terrell
źródło
2
Bash ma while truepętle
Michael Mrozek