Stille-Erkennung - Silence Detection


#1

Hi,
ich suche ein Tool, das in der Lage ist, mir im Batchbetrieb massenweise meine MP3s nach Sequenzen von Stille zu durchsuchen und die betreffenden Files mit Stille in eine Liste zu schreiben.

Alle Tools, die ich kenne, verarbeiten die Stilleerkennung in Zusammenhang mit einem beabsichtigen Splitvorgang, listen in ihrem Ergebnisfenster die gefundenen Stellen auf oder splitten sogar automatisch. Normalerweise arbeite ich mit MP3DIRECTCUT, was für mich die Stille zuverlässig erkennt, leider aber splitten will.

Was ich jedoch möchte ist nur eine Auflistung der Files, in denen das Tool fündig wurde. Zur Beschleunigung sollte es idealerweise nach einem Fund in einer Datei diese auch nicht weiter durchsuchen. Es geht mir nicht um die Fundstellen selbst oder die Anzahl der Fundstellen, lediglich eine Aussortierung der Files mit Fundstellen von Stille.

Kennt jemand so etwas?


#2

Rein aus Neugierde:
Wie definierst Du "Stille"?
Einen Unterbruch in einem Song, bei dem man absolut nichts hört? Nicht mal ein feines Summen?
Wie lange muss der Unterbruch sein, damit Du ihn als "Stille" erkennst?
500ms? 3 Sekunden?

Und darf ich fragen, was Du anschliessend mit diesen aufgelisteten Songs machst?


#3

"Ziemlich" still, vermutlich ganz still.
Ich habe Aufnahmen von Streams, bei denen ein gewisser Anteil fehlerhaft ist, d.h. der Stream wurde für kurze Zeit unterbrochen. Möglicherweise könnte man also auch binär nach einer Bytefolge suchen. Keine Ahnung, wie sich sowas in einem MP3-File zeigt.
Die Stilleerkennung in MP3DIRECTCUT mit den Extremeinstellungen für Lautstärke (-90,5 db) und Länge (0,3 Sekunden) erkennt sie sehr zuverlässig. Auch lassen sich die Stellen rein optisch beim Ansehen der Kurven schon erkennen.

Aussortieren. Ersatz besorgen.


#4

Wenn du schon EAC benutzt: das scheint laut dieser Seite eine Funktion für automatische Cue-Sheet-Erstellung zu haben:
http://wiki.hydrogenaudio.org/index.php?ti...xact_Audio_Copy
Und dann müsste man doch nur noch gucken, ob in dem Cue-Sheet Track 02 vorkommt, denn dann ist mindestens 1 Lücke vorhanden. Und der Dateiname steht auch schon drin ...
Da ich sonst EAC nicht nehme ... kann ich dir kein weiteres Rezept liefern.


#5

Ich weiss nicht wie gut Deine Programmierkenntnisse sind. Bin nur im Winamp-Forum über Code gestolpert, welcher anscheinend Stille erkennt (und dann eine Aktion ausführt). Vielleicht kannst Du den Code für Deine Zwecke verwenden?

Nachtrag:
Ich stiess beim googeln noch auf folgendes Tool: http://mp3splt.sourceforge.net/mp3splt_page/home.php
Wenn ich das manual richtig interpretiere, solltest mit den Optionen
-s

Silence mode, to split with silence detection

und
nt=INTEGER

Positive integer number of tracks to be split when using -s option. By default all tracks are split. 

vielleicht Dein gewünschtes Ziel erreichen. Versuch mal nt=0 (also NICHT splitten) und guck ob das funktionieren würde. Logfiles helfen Dir vermutlich auch weiter.


#6

Auf den Thread war ich bei meinen Recherchen auch gestoßen. Meine Programmierkenntnisse sind allerdings äußerst bescheiden ud eigentlich überhaupt nicht vorhanden.

Das habe ich sogar installiert, allerdings in der GTK-Version.
Ich habe es jetzt mal in der Kommandozeilenversion in Augenschein genommen.

Grundsätzlich klappt die Stilleerkennnung mit den Parametern recht gut.
Leider hilft es nicht wirklich weiter:
"nt=0" klappt so nicht. Es wird trotzdem gesplittet.
Dafür gibt es allerdings den Parameter "-P" (Pretend to split), bei dem nur die Stille erkannt, aber nicht gesplittet wird. Allerdings wird dann auch kein Logfile geschrieben. :rolleyes: Im Übrigen wird auch das Logfile immer überschrieben und nicht fortgeführt. Wildcards für die Files (*.mp3) sind nicht erlaubt.
Man könnte zwar die Bildschirmmeldungen mit "->" in ein Logfile schreiben, aber elegant ist das alles nicht so richtig.

@ohrenkino
EAC hat diese Funktion für Wave-Files.

Trotz fehlender endgültiger Erfolgsmeldung danke ich Euch schon mal für Eure Mühe und das Mitdenken.

Die beste und eleganteste Lösung nach meiner Vorstellung wäre:
Komanndozeilentool, das Stille erkennt, sobald es sie gefunden hat einen Errorcode zurückgibt und zum nächsten File springt. Den Errorcode könnte man dann abfragen und eine Aktion startenb.


#7

Hilft die Option -i

    Count silence mode. Print the number of silence splitpoints found with silence detection. Use -p for arguments.vielleicht weiter? 

Wenn dieser Rückgabewert <> 0 ist (stell ich mir in der Theorie vor) sollte man erkennen können, welche Stücke Stille enthalten und welche nicht.

Wie sieht das in der Praxis aus?


#8
QUOTE (LyricsLover @ May 14 2012, 20:04) <{POST_SNAPBACK}>
Hilft die Option -i
    Count silence mode. Print the number of silence splitpoints found with silence detection. Use -p for arguments.vielleicht weiter? 

Wenn dieser Rückgabewert <> 0 ist (stell ich mir in der Theorie vor) sollte man erkennen können, welche Stücke Stille enthalten und welche nicht.

Wie sieht das in der Praxis aus?


Ob und wie dieser Wert in einer Batch-Datei abfragbar ist, muss ich mal an einem ruhigen Tag in Muße erforschen. Mein Batch-Wissen war nie sehr detailliert und ist außerdem etwas verschüttet.
Ansonsten wird die Zahl halt nur angezeigt.

Ich habe mal probiert, inwieweit man das Schreiben eines Cue-Files zweckentfremden kann, indem ich einfach Cue-files mit den Song-Filenamen erzeuge. Leider schreibt das Programm in jedem Fall ein Cue-File, also auch dann, wenn es gar nichts zum Splitten vorfindet, halt nur mit Kopfdaten.

Der einzig praktikable Workaround scheint zu sein, dass man tatsächlich die Files splitten lässt. Dann hat man ja die Namen der entsprechenden MP3s durch das Vorhandensein der Splitfiles. Mit dem Parameter "NT=2" kann man dann die Splitfiles auf 2 begrenzen, weniger geht nicht. Da es sich ja nicht um Unmassen von Fehlerdateien handelt, kann man mit dem höheren Speicherbedarf im Gegensatz zu Textfiles oder einer Log-Datei leben.

Für geringere Mengen an zu durchsuchenden MP3s, kann man es in die Tools-Option von MP3TAG einbauen. Für die Massenabwicklung müsste ich mir erst noch eine Batchdatei mit rekursiver Abwicklung der Ordnerstrukturen bauen, denn über Tools wird halt pro untersuchte Datei ein Konsolenfenster geöffnet und das macht sich bei größeren Mengen doch nicht so gut. :rolleyes:

Nochmals vielen Dank für die Hilfe bis hierher.


#9

Einen kleinen Hinweis dazu:
Wenn Du in Mp3tag beim erfassen von neuen Tools die Checkbox "für alle ausgewählten Dateien" richtig verwendest, kannst Du auch "nur" den aktuellen Pfad an eine Batch-Datei übergeben und damit die Steuerung innerhalb des (externen) Batch übernehmen. Mach ich aus dem genau gleichen Grund wie von Dir erwähnt: Sieht schöner aus.
Die Verarbeitung dauert dann aber meistens auch länger, als bei paralleler Abarbeitung von zB. 12 offenen Cmdline-Fenstern. :wink:


#10

Ich habe gestern auch ein paar Experimente gemacht, prinzipiell mit demselben Ergebnis.

mp3splt.exe -E "CueDateipfad" -P -s -p nt=2 "MusikDateipfad"

Das mp3splt Programm untersucht immer die gegebene Musikdatei von vorn bis hinten und schreibt am Ende der Untersuchung eine Cuedatei, falls erwünscht.
Dabei kann man steuern, wieviel Teildateien in die Cuedatei eingetragen werden sollen.
Wenn also in der Cuedatei mindestens ein TRACK Eintrag vorhanden ist, dann ist Stille erkannt worden.

Wenn man nur darauf aus ist, maximal einmal Stille zu erkennen, dann arbeitet mp3split nicht effektiv, weil es immer die Eingabedatei komplett durchsucht, das kann dauern.

Brauchbar wäre es, wenn in mp3split eine Option eingebaut würde, die dafür sorgt, dass die Pausensuche beendet wird nach einer vorgegebenen Anzahl von Pausen.
Bei der einfachen Stilleerkennung, ohne Split, reicht es dann aus, die erste Pause zu finden (nt=2).

Im Zusammenspiel mit Mp3tag könnte man sich folgende Schritte vorstellen:

  1. Erzeugen einer Kommando-Stapeldatei mit Mp3tag Exportskript auf der Basis der selektierten Dateien.
  2. Ausführen der Kommando-Stapeldatei.
  3. Warten.
  4. Importieren der einzelnen CueDateien jeweils in die betreffende Musikdateien in ein temporäres Tag-Feld z. B. STILLE.
  5. Untersuchen des Tag-Feldes STILLE, ob das Wort "TRACK" darin vorkommt.
    Wenn ja, dann, dann den Inhalt von STILLE mit einer "1" ersetzen, wenn nicht, dann den Inhalt von STILLE mit einer "0" ersetzen, oder das Tag-Feld entfernen.
    Alles weitere ergibt sich von selbst.

DD.20120515.1146.CEST


#11

Ich wollte grade schon eine neue Diskussion erstellen aber dann bin in dem Thread fündig geworden.

In meiner MP3-Sammlung habe ich auch vereinzelt Songs die "defekt" sind. Allerdings nicht formal sondern diese haben - aus welchen Gründen auch immer - ab irgendeiner Zeit nichts mehr. Die gängigen Tools wie mp3utility und ähnliche die defekte Frames usw. suchen finden da nichts da die Frames an sich ok sind.

Meine Idee nun: Soundprogramme können ja sowas wie Frequenzkurven über die Laufzeit eines Liedes anzeigen. Bei solchen Leerstellen haben diese Kurven idR. keinen oder nur einen sehr geringen Ausschlag.

Würde es nun eine Möglichkeit geben per Batchlauf aus jeder MP3-Datei so eine Kurve in Form von Zeit/Wert-Paaren zu erstellen so könnte ich diese Profile anschließend auswerten und so potentielle Fehler finden.

Also wenn irgendwie sowas rauskäme (Taktung fast beliebig, egal ob 1/100 sec, 1/10 sec oder auch 1/1 sec):

Zeit Wert
0,000 0
0,100 12,2
0,200 13,3
0,300 20,0
...

Dann könnte ich per Skript alle suchen bei denen eine bestimmte Zahl an 0ern (oder nahe 0) in Folge auftritt.

Irgendeine Idee wie ich so ein Lautstärke- oder Frequenzprofil erstellen kann?

Bei der Split-Methode fehlt mir irgendwie die Möglichkeit die "Intensität" (Schwellwert was Stille heisst) bzw. die Dauer einzustellen.

Ich würde da mit einem großen Wert anfangen (was weiß ich, vielleicht 30 Sekunden und absolute Stille) und mich dann in der Zeit bzw. dem Schwellwert langsam runtertasten.

So zumindest meine Vorstellung...


#12

... und was hast du gefunden?
mp3splt.exe könnte vielleicht helfen, dafür musst du die Parameter Einstellungen studieren und ausprobieren.

DD.20120613.1713.CEST


#13

Achso. Sorry. War vielleicht falsch formuliert. Ich habe jemand mit dem gleichen Problem gefunden und einen anderen Lösungsansatz den ich aber für nicht praktikabel hielt aber inzwischen habe ich mir die Parameter angeschaut und das sieht sehr vielversprechend aus:

-s
    Silence mode, to split with silence detection.

...

For -s, -a and -r

th=FLOAT
    Threshold level (dB) to be considered silence. It is a float number between -96 and 0. Default is -48 dB, which is a value found by tests and should be good in most cases. 




Only -s

min=FLOAT
    Positive float of the minimum number of seconds to be considered a valid splitpoint. All silences shorter than min are discarded. Default is 0.

Das sieht sehr gut aus!


#14

Will mich nur kurz mit einbringen.
Um meine MC's zu digitalisieren habe ich mir das Progi "Cool Edit" angeschafft,
dort lässt sich die Stille sehr gut finden, reinzoomen - markieren - löschen,
sogar meine Vinyl-Sammlung ( ebenfalls digitalisiert ) ist von kleinsten Knacksern (Amplitude Vollansschlag) hiermit bereinigt worden.
Anfang und Ende der Stillen lassen sich hervorheben.


Hoffe konnte ein wenig helfen.



#15

Ich habe inzwischen gemerkt, dass mein Thema ohne dass ich es bemerkt habe, fortgeführt wurde.
Daher nochmals kurz eine Anmerkung von mir:
Ich habe festgestellt, dass für meine Bedürfnisse die Stilleerkennung in MP3DirectCut am besten und zuverlässigsten funktioniert, weil sie die Streamunterbrechungen und nur diese am besten findet.
Ich mache es inzwischen mit einer externen rekursiven Batch in der Regel in mehr oder weniger großen Häppchen. Ich benutze den Commandline-Parameter "pausesplit". Das Programm splittet halt die betroffenen Dateien in einen angegebenen Ordner. Anhand der gesplitteten Dateien kann ich halt feststellen, welche MP3s Stille aufweisen.

Das ist sicherlich eine Zweckentfremdungslösung aber damit kann ich in der Praxis leben.
Nachteil ist, dass nicht alle Parameter per Commandline steuerbar sind und die Batch auf die Einstellungen der Splitfunktion des GUI angewiesen ist. Auch kann man während eines Durchlaufs nicht mehr sinnvoll am PC weiterarbeiten, da die ständig die GUI aufgerufen wird und sich den Fokus klaut.


#16

poster, jetzt muss ich doch 'mal nachfragen:
wie definierst du "Streamunterbrechung" und worin liegt der Unterschied zu "Stille" bzw. "Pause"?

Wie ich herausgefunden habe und es in post #10 bereits gesagt habe ... kann man mit mp3splt.exe eine Datei auf Pausen untersuchen, ohne die Datei zu teilen, was in meinem Test eine enorme Zeiteinsparung erbrachte.

DD.20120711.1256.CEST


#17

Es handelt sich offenbar um völlige Stille. Der Stream wurde kurzzeitig unterbrochen. In MP3DirectCut sind diese Unterbrechungen - wenn man die Option "Bitrate bei VBR grafisch anzeigen" aktiviert hat - auch sehr schön bei bloßer Betrachtung der Frequenzkurve erkennen.
(unterer kurzer grüner Strich)
Frequenzkurve

Ist schon klar, allerdings sehe ich eine wirksamere Zeitersparnis eher in der Nachbearbeitung (Überprüfen des beanstandeten Files usw.). MP3DirectCut liefert mir erheblich weniger Fehldiagnosen als MP3splt.exe und insgesamt komme ich damit in der Gesamtbetrachtung schneller voran.


#18

Wenn man wüsste, ob der grüne Bitratenstrich wirklich 0 bit/s anzeigt. Ich glaube es ja nicht, denn die Stille hat ja eine Dauer. Vielleicht ist das nur eine Stelle im Stream mit sehr leisem Rauschen. Wenn der Stream unterbrochen wäre, dann ließe er sich ja nicht abspielen, oder?

Na gut, der Vorteil von "mp3DirectCut.exe" gegenüber "mp3splt.exe" ist ja die Visualisierung.
Ein Nachteil ist die ungenaue Einstellungsmöglichkeit für die Werte bei der Pausensuche.
Zum Beispiel ist es mir nicht gelungen, genau -48.0 dB und > 3.0 sec einzustellen.

Um die Güte der Pausenerkennung der beiden Tools zu messen, dafür müsste man eine Testreihe starten, die wahrscheinlich sehr viel Zeit kostet.

DD.20120711.1536.CEST


#19

Die Aufzeichnung ist ja wohl o.k., sodass man annehmen muss, dass irgendwie eine Lücke im Stream war. Ob der Sender nur "nichts" gesendet hat oder irgendwas anderes stockte, weiß ich nicht.

Für meinen Spezialzweck habe ich Lautstärke auf Minuimum (-90,3 dB) und Länge auf 0,3 stehen und er findet alle Lücken. Dieser Lautstärkewert spricht für wirkliche digitale Stille oder sehr sehr leises digitales Rauschen.