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.