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.