Terminare la registrazione di Sox quando viene rilevato il silenzio


16

Sto scrivendo una sceneggiatura che usa sox per registrarmi mentre parlo. Ora ho bisogno di Sox per aspettare fino a quando non rileva il suono prima che inizi la registrazione, e ho capito. Ma ho anche bisogno di Sox per uscire una volta che c'è stato silenzio per almeno 3 secondi. Come è ora, devo uccidere manualmente Sox una volta terminato di parlare, altrimenti Sox aspetta di nuovo fino a quando non parlo ancora, aggiungendo al file di output (Non è quello che voglio). Ecco il comando per la registrazione che sto usando ora:

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

Ancora una volta, per essere chiari, Sox dovrebbe aspettare fino a quando non comincio a parlare, quindi registrare fino a quando smetto di parlare, quindi il programma Sox dovrebbe chiudersi.

Risposte:


13

Rimuovi il segno negativo dal comando originale:

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

Quando il "conteggio inferiore" è negativo, il comando di silenzio taglierà tutti i silenzi dal centro del file. Quando è positivo, taglia il silenzio dalla fine del file.


1
Questa è una soluzione molto più semplice di quella che mi è venuta in mente, LOL!
Isacco,

3

Ho modificato ulteriormente le idee sopra. Registra per sempre, registra tutto il rumore fino a quando (approssimativamente) si incontra un secondo di silenzio. Poi:

  • Assicura la creazione di due sottodirectory
  • Calcola due spettrografi della registrazione: uno prima della normalizzazione e uno dopo e scrive nelle cartelle con datamp.
  • Scrive quello normalizzato in un file in una cartella con data datamp.
  • Riproduce il file normalizzato indietro, con due file chogg .ogg (indietro attraverso la radio CB a comando vocale)

(Crea un UHF / ripetitore di eco di 2 metri molto maneggevole)

#! / Bin / bash
mentre vero; fare
  rec buffer.ogg silence 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 Rinomina il file buffer in $ DATE
  sox buffer.ogg -n spettrogramma -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 spettrogramma -x 300 -y 200 -z 100 -t $ DATE.norm.ogg -o ./spectro/$DPATH/$DATE.norm.png
  mv normbuffer.ogg ./voice/$DPATH/$DATE.ogg
  gioca pre.ogg ./voice/$DPATH/$DATE.ogg post.ogg 
fatto

2

Ho trovato una specie di modo traballante che risolve questo problema.

Ho notato che quando viene rilevato il silenzio, Sox naturalmente non aggiunge altro al file fino a quando non sente più suono. Quindi ho deciso di provare a trarre vantaggio da questo fatto.

Prima di tutto, avvio il registratore di suoni di Sox in background:

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

Successivamente ottengo il PID del processo di registrazione con: p=$!

Quindi do un secondo al processo di registrazione per terminare l'avvio, quindi aspetto fino a quando il file inizia a crescere.

dormire 1
fino a ["$ var1"! = "$ var2"]; fare
    var1 = `du" /tmp/recording.flac "`
    dormire 1
    var2 = `du" /tmp/recording.flac "`
fatto

Dopo che questo loop si interrompe, significa che il suono è stato rilevato. Quindi ora creo un altro loop per attendere fino a quando i dati non vengono aggiunti al file (ciò accadrà quando sox rileverà di nuovo il silenzio).

echo "Rilevato suono"
fino a ["$ var1" == "$ var2"]; fare
    var1 = `du" /tmp/recording.flac "`
    dormire 0,5
    var2 = `du" /tmp/recording.flac "`
fatto

Ora ho solo bisogno di smettere rec:

echo "Silence Detected"
uccidi $ p

E questo è tutto. Ecco lo script completo:

registr /tmp/recording.flac rate 32k silenzio 1 0,1 3% -1 3,0 3% e
p = $!
dormire 1
fino a ["$ var1"! = "$ var2"]; fare
    var1 = `du" /tmp/recording.flac "`
    dormire 1
    var2 = `du" /tmp/recording.flac "`
fatto
echo "Rilevato suono"
fino a ["$ var1" == "$ var2"]; fare
    var1 = `du" /tmp/recording.flac "`
    dormire 0,5
    var2 = `du" /tmp/recording.flac "`
fatto
echo "Silence Detected"
uccidi $ p

Ora preferirei un modo migliore e più stabile per farlo, ma per ora dovrà funzionare.


1

Questo è in ascolto per sempre, registra solo gli ultimi suoni fino a quando non sente un secondo di silenzio, quindi scrive il file, timestamp, e si riavvia:

#!/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

2
Bash ha dei while trueloop
Michael Mrozek
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.