Beenden Sie die Sox-Aufzeichnung, sobald Stille erkannt wird

16

Ich schreibe ein Skript, das Sox verwendet, um mich aufzuzeichnen. Jetzt brauche ich sox, um zu warten, bis es Geräusche erkennt, bevor es mit der Aufnahme beginnt, und ich habe das herausgefunden. Aber ich muss auch SOX Ausgang einmal Stille war für mindestens 3 Sekunden. So wie es jetzt ist, muss ich Sox manuell töten, wenn ich fertig bin, sonst wartet Sox einfach wieder, bis ich etwas mehr spreche und an die Ausgabedatei anhänge (das ist nicht das, was ich will). Hier ist der Befehl für die Aufnahme, den ich gerade verwende:

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

Nochmals, nur um klar zu sein, sollte Sox warten, bis ich anfange zu sprechen, und dann aufnehmen, bis ich aufhöre zu sprechen, dann sollte das Sox-Programm beendet werden.

Isaac
quelle

Antworten:

13

Entfernen Sie das negative Vorzeichen von Ihrem ursprünglichen Befehl:

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

Wenn die "Anzahl unter" negativ ist, werden mit dem Befehl "Stille" alle Pausen ab der Mitte der Datei abgeschnitten. Wenn es positiv ist, wird die Stille am Ende der Datei abgeschnitten.

meetar
quelle
1
Das ist eine viel einfachere Lösung als die, die ich mir ausgedacht habe, LOL!
Isaac
2

Ich fand eine Art wackeligen Weg, der dieses Problem löst.

Mir ist aufgefallen, dass sox beim Erkennen von Stille erst dann mehr an die Datei anfügt, wenn es mehr Töne hört. Also beschloss ich, diese Tatsache auszunutzen.

Zunächst starte ich im Hintergrund den Soundrekorder von sox:

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

Als nächstes erhalte ich die PID des Aufnahmeprozesses mit: p=$!

Dann gebe ich dem Aufnahmeprozess eine Sekunde Zeit, um den Startvorgang abzuschließen, und warte dann, bis die Datei zu wachsen beginnt.

schlaf 1
bis ["$ var1"! = "$ var2"]; tun
    var1 = `du" /tmp/recording.flac "`
    schlaf 1
    var2 = `du" /tmp/recording.flac "`
erledigt

Wenn diese Schleife unterbrochen wird, wurde der Ton erkannt. Jetzt erstelle ich eine weitere Schleife, um zu warten, bis keine Daten mehr an die Datei angehängt werden (dies geschieht, sobald sox wieder Stille erkennt).

Echo "Sound Detected"
bis ["$ var1" == "$ var2"]; tun
    var1 = `du" /tmp/recording.flac "`
    schlaf 0,5
    var2 = `du" /tmp/recording.flac "`
erledigt

Jetzt muss ich nur noch aufhören rec:

Echo "Stille erkannt"
töte $ p

Und das ist es. Hier ist das fertige Skript:

rec /tmp/recording.flac rate 32k Stille 1 0,1 3% -1 3,0 3% &
p = $!
schlaf 1
bis ["$ var1"! = "$ var2"]; tun
    var1 = `du" /tmp/recording.flac "`
    schlaf 1
    var2 = `du" /tmp/recording.flac "`
erledigt
Echo "Sound Detected"
bis ["$ var1" == "$ var2"]; tun
    var1 = `du" /tmp/recording.flac "`
    schlaf 0,5
    var2 = `du" /tmp/recording.flac "`
erledigt
Echo "Stille erkannt"
töte $ p

Jetzt würde ich einen besseren, stabileren Weg vorziehen, aber das muss erst einmal funktionieren.

Isaac
quelle
2

Ich habe die oben genannten Ideen noch weiter verfeinert. Es zeichnet für immer auf, zeichnet alle Geräusche auf, bis (ungefähr) eine Sekunde Stille eintritt. Dann:

  • Stellt sicher, dass zwei Unterverzeichnisse erstellt werden
  • Berechnet zwei Spektrographen der Aufzeichnung - einen vor und einen nach der Normalisierung und schreibt in Ordner mit Datumsstempel.
  • Schreibt das normalisierte in eine Datei in einen Ordner mit Datumsstempel.
  • Spielt die normalisierte Datei mit zwei Chirp-OGG-Dateien ab (zurück über sprachgesteuertes CB-Radio)

(Für einen sehr handlichen kleinen UHF / 2-Meter-Echo-Repeater)

#! / bin / bash
während wahr; tun
  rec buffer.ogg Schweigen 1 0,1 5% 1 1,0 5%
  DATUM = `Datum +% Y% m% d% H% M% S`
  DPATH = `Datum +% Y /% m /% d /`
  mkdir -p ./spectro/$DPATH
  mkdir -p ./voice/$DPATH
  echo Pufferdatei in $ DATE umbenennen
  sox buffer.ogg -n Spektrogramm -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 Spektrogramm -x 300 -y 200 -z 100 -t $ DATE.norm.ogg -o ./spectro/$DPATH/$DATE.norm.png
  mv normbuffer.ogg ./voice/$DPATH/$DATE.ogg
  spiele pre.ogg ./voice/$DPATH/$DATE.ogg post.ogg 
erledigt
Nigel-Wochen
quelle
0

Dies hört für immer zu, zeichnet nur die letzten Töne auf, bis es eine Sekunde Stille hört, schreibt dann die Datei, versieht sie mit einem Zeitstempel und startet neu:

#!/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
quelle
2
Bash hat while trueSchleifen
Michael Mrozek