Fin de l'enregistrement sox une fois le silence détecté

16

J'écris un script qui utilise sox pour m'enregistrer en train de parler. Maintenant, j'ai besoin de sox pour attendre qu'il détecte le son avant de commencer l'enregistrement, et je l'ai compris. Mais j'ai aussi besoin de sox pour sortir une fois qu'il y a eu un silence pendant au moins 3 secondes. Comme c'est le cas maintenant, je dois tuer manuellement sox une fois que j'ai fini de parler, sinon sox attend juste à nouveau que je parle un peu plus, en ajoutant au fichier de sortie (ce n'est pas ce que je veux). Voici la commande d'enregistrement que j'utilise maintenant:

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

Encore une fois, juste pour être clair, Sox devrait attendre que je commence à parler, puis enregistrer jusqu'à ce que j'arrête de parler, puis le programme sox devrait quitter.

Isaac
la source

Réponses:

13

Supprimez le signe négatif de votre commande d'origine:

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

Lorsque le "nombre inférieur" est négatif, la commande silence supprime tous les silences à partir du milieu du fichier. Lorsqu'il est positif, il coupe le silence à la fin du fichier.

meetar
la source
1
C'est une solution beaucoup plus simple que celle que j'ai trouvée, LOL!
Isaac
3

J'ai encore modifié les idées ci-dessus. Il enregistre pour toujours, enregistre tout le bruit jusqu'à ce que (grossièrement) une seconde de silence soit rencontrée. Alors:

  • S'assure que deux sous-répertoires sont créés
  • Calcule deux spectrographes de l'enregistrement - un avant la normalisation et un après, et écrit dans des dossiers horodatés.
  • Écrit le fichier normalisé dans un fichier dans un dossier horodaté.
  • Lit le fichier normalisé, avec deux fichiers .ogg gazouillis (retour via la radio CB à commande vocale)

(Fait pour un petit répéteur d'écho UHF / 2 mètres très pratique)

#! / bin / bash
bien que vrai; faire
  rec buffer.ogg silence 1 0,1 5% 1 1,0 5%
  DATE = «date +% Y% m% d% H% M% S»
  DPATH = `date +% Y /% m /% d /`
  mkdir -p ./spectro/$DPATH
  mkdir -p ./voice/$DPATH
  echo Renommage du fichier tampon en $ DATE
  sox buffer.ogg -n spectrogram -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 spectrogramme -x 300 -y 200 -z 100 -t $ DATE.norm.ogg -o ./spectro/$DPATH/$DATE.norm.png
  mv normbuffer.ogg ./voice/$DPATH/$DATE.ogg
  jouer à pre.ogg ./voice/$DPATH/$DATE.ogg post.ogg 
terminé
Nigel Weeks
la source
2

J'ai trouvé une sorte de méthode fragile qui résout en quelque sorte ce problème.

J'ai remarqué que lorsqu'un silence est détecté, sox n'ajoutera naturellement rien de plus au fichier jusqu'à ce qu'il entende plus de son. J'ai donc décidé que je pouvais essayer de profiter de ce fait.

Tout d'abord, je démarre l'enregistreur de son de sox en arrière-plan:

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

Ensuite, j'obtiens le PID du processus d'enregistrement avec: p=$!

Ensuite, je donne au processus d'enregistrement une seconde pour terminer le démarrage, puis j'attends que le fichier commence à se développer.

dormir 1
jusqu'à ["$ var1"! = "$ var2"]; faire
    var1 = `du" /tmp/recording.flac "`
    dormir 1
    var2 = `du" /tmp/recording.flac "`
terminé

Après la rupture de cette boucle, cela signifie que le son a été détecté. Alors maintenant, je crée une autre boucle pour attendre que les données cessent d'être ajoutées au fichier (cela se produira une fois que sox détectera à nouveau le silence).

écho "Sound Detected"
jusqu'à ["$ var1" == "$ var2"]; faire
    var1 = `du" /tmp/recording.flac "`
    dormir 0,5
    var2 = `du" /tmp/recording.flac "`
terminé

Maintenant, je dois juste quitter rec:

écho "Silence Detected"
tuer $ p

Et c'est tout. Voici le script terminé:

rec /tmp/recording.flac taux 32k silence 1 0,1 3% -1 3,0 3% &
p = $!
dormir 1
jusqu'à ["$ var1"! = "$ var2"]; faire
    var1 = `du" /tmp/recording.flac "`
    dormir 1
    var2 = `du" /tmp/recording.flac "`
terminé
écho "Sound Detected"
jusqu'à ["$ var1" == "$ var2"]; faire
    var1 = `du" /tmp/recording.flac "`
    dormir 0,5
    var2 = `du" /tmp/recording.flac "`
terminé
écho "Silence Detected"
tuer $ p

Maintenant, je préférerais une façon meilleure et plus stable de le faire, mais cela devra fonctionner pour l'instant.

Isaac
la source
1

Celui-ci écoute pour toujours, enregistre uniquement les derniers sons jusqu'à ce qu'il entende une seconde de silence, puis écrit le fichier, l'estampille et redémarre:

#!/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
la source
2
Bash a des while trueboucles
Michael Mrozek