Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Stille im Musikfile suchen (nicht Anfang/Ende) (https://www.delphipraxis.net/197433-stille-im-musikfile-suchen-nicht-anfang-ende.html)

markusagb 6. Aug 2018 23:49

Stille im Musikfile suchen (nicht Anfang/Ende)
 
Hallo zusammen,
da dieses Forum bzw. die Mitglieder schon mehrmals behilflich waren würde ich gerne nochmals darauf zurückkommen.

Ich habe nun 1 Woche vergeblich versucht, Stille in einem Audiofile zu finden (mit Bass). Im Forum gibt es ein Beispiel für "Silence am Anfang und Ende" zu definieren. Das funktioniert auch sehr gut. Allerdings verstehe ich den Code nicht bzw. kann ihn nicht adaptieren. Ich möchte z.B. 10 Sek ins File rein gehen und dann das File scannen nach einem Mute bzw. sehr leisen Sequenz. Das benötige ich um ein anderes File drauf zu legen (Nachrichten-Trenner). Ich setze also die Position des Files auf 10 Sek, soweit sogut. Aber dann komme ich auch schon nicht mehr weiter denn der Code den ich habe sucht ja nach Anfang und Ende...

Hier der Code:

Code:
count := 0;
  chan := BASS_StreamCreateFile(False, PChar(FileName), 0, 0, BASS_STREAM_DECODE {$IFDEF UNICODE}or BASS_UNICODE{$ENDIF});

  // Start-Point
  while Bass_ChannelIsActive(chan) <> 0 do
  begin
    b := BASS_ChannelGetData(chan, @buf, 20000);
    b := b div 2;
    a := 0;
    while (a < b) and (Abs(buf[a]) <= threshold) do
      a := a + 1;
    count := count + (a * 2);
    if (a < b) then
    begin
      while (a <> 0) and (Abs(buf[a]) > (threshold div 4)) do
      begin
        a := a - 1;
        count := count - 2;
      end;
      Break;
    end;
  end;
  StartPoint := count;


   // End-Point
  pos := BASS_ChannelGetLength(chan, BASS_POS_BYTE);
  while (pos > count) do
  begin
    if pos < 100000 then
      pos := 0
    else
      pos := pos - 100000;
    BASS_ChannelSetPosition(chan, pos, BASS_POS_BYTE);
    b := BASS_ChannelGetData(chan, @buf, 100000);
    b := b div 2;
    a := b;
    while (a > 0) and (Abs(buf[a - 1]) <= (threshold div 2)) do
      a := a - 1;
    if a > 0 then
    begin
      count := pos - (a * 2);
      Break;
    end;
  end;
  EndPoint := Count;
Kann mir jemand einen Tipp geben wie ich den Code modifizieren kann, das er mir die Stelle die den threshold unterschreitet ausgibt und die Länge des Unterschreitens?

Ich sag jetzt schon mal danke!

Markus

* Anmerkung, eventuell ist da ein Fehler drin, es heißt in Zeile 14 "while (a <> 0) and (Abs(buf[a]) > (threshold div 4)) do", eventuell müsste es heissen "(threshold div 2)"?

KodeZwerg 7. Aug 2018 06:44

AW: Stille im Musikfile suchen (nicht Anfang/Ende)
 
Also mit
Delphi-Quellcode:
BASS_ChannelSetPosition(chan, pos, BASS_POS_BYTE);
steuerst Du "ab wo..." und mit
Delphi-Quellcode:
BASS_ChannelGetData(chan, @buf, 100000);
steuerst Du "wieviel...." Falls Dir das weiterhilft.

markusagb 7. Aug 2018 07:43

AW: Stille im Musikfile suchen (nicht Anfang/Ende)
 
Danke Dir.
Ja das ist mir klar, leider sucht er ja ab wann der Threshold überschritten wird, wenn ichs umdrehe "<kleiner Threshold" dann funktioniert es nicht ...
Rechnet er am Ende zurück?

KodeZwerg 7. Aug 2018 08:43

AW: Stille im Musikfile suchen (nicht Anfang/Ende)
 
Hallo nochmal, lade mal bitte ein Beispiel Audio hoch und fertige dafür eine Erklärung an was am Ende mit der Beispiel-Datei passieren soll.

Weil irgendwie erinnert mich all das was Du bereits geschrieben hast an etwas was mir als Sequenzer bekannt ist.
Man hat eine Liste die mit Audio-Daten gefüllt wird, der Pool.
Man hat eine Graphische Darstellung, der Mixer.
Im Mixer wirft man was aus Pool rein und es wird einem als Spectrum-Scan dargestellt.
Im Mixer wirft man eine weitere Datei rein und zieht die an eine geeignete Position, idR da wo Pause ist, dank Spectrum sieht man ja gleich wo was laut leise ist.
Das wiederholt/justiert man so lange bis man zufrieden ist.
Am Ende wird im Mixer alles so abgespielt/aufgezeichnet wie man es Positioniert hat.

freejay 7. Aug 2018 12:59

AW: Stille im Musikfile suchen (nicht Anfang/Ende)
 
Das ist leider ein bisschen komplizierter als beim Suchen an Anfang oder Ende, denn um Stille (ich würde es eher "leise Stellen") innerhalb einer Datei zu finden, muss man nicht nur einen Threshold suchen, sondern auch nach einer bestimmten Länge, in der dieser Threshold nicht überschritten werden darf.

Denn sonst würde der Algorithmus ja bei fast jedem Nulldurchgang "Stille" vermuten.

Töne sind ja bekanntlich Wellen und daher gibt es in einem Musikfile vermutlich zigtausende Stellen, an denen der Threshold unterschritten wird.

Ich kann Dir hier aus Zeitgründen leider keinen passenden Code liefern, aber in Pseudo:

- Lesen bis Wert unter Schwelle
- Mindestanzahl von Werten weiterlesen
- dabei abbrechen, wenn Wert überschritten
- Lässt sich die ganze Mindestanzahl an Samples lesen hast Du einen "Stille"-Bereich gefunden.
- Wenn nicht mit erstem Punkt weiter machen

p80286 7. Aug 2018 13:11

AW: Stille im Musikfile suchen (nicht Anfang/Ende)
 
Zitat:

Zitat von freejay (Beitrag 1409999)
Denn sonst würde der Algorithmus ja bei fast jedem Nulldurchgang "Stille" vermuten.

Das Problem hast Du bei BASS nicht.
Da gibt es eine Funktion die den Level über einen bestimmten Zeitraum darstellen kann. Wenn ich mich nicht irre, max 2 sec.

Ich komme im Augenblick nicht an mein Delphi heran, aber in der Doku sollte man fündig werden.

Gruß
K-H

markusagb 7. Aug 2018 18:57

AW: Stille im Musikfile suchen (nicht Anfang/Ende)
 
Hallo zusammen,
ja das wäre der Weg - im Endeffekt habe ich ja schon einen Code den es nur umzuschreiben gilt.
Ich habe mich wund probiert wie man damit eine Silence Strecke im Audio findet, aber ich bekomms nicht hin... :-(
Wünsche Euch einen schönen Abend!!
Markus

markusagb 8. Aug 2018 14:11

AW: Stille im Musikfile suchen (nicht Anfang/Ende)
 
Ich habe mich da mal reingefuchst, aber anscheinend ist meine Idee nicht so prickelnd:

Ein paar Sec ins File reingehen, nach der ersten Silence suchen und Länge abfragen... leider funktionierts nicht...

Code:
 

   ....
  count := 100000;
  silence := 0;

  BASS_ChannelSetPosition(chan, count, BASS_POS_BYTE);
  while Bass_ChannelIsActive(chan) <> 0 do
  begin
    b := BASS_ChannelGetData(chan, @buf, 20000);
    b := b div 2;
    a := 0;
    while (a < b) and (Abs(buf[a]) >= threshold) do
      a := a + 1;
    count := count + (a * 2);

    c := count;
    if (c < b) then
    begin
      while (c <> 0) and (Abs(buf[c]) < (threshold div 2)) do // div4 geändert
      begin
        c := c + 1;
        silence := silence + 2;
      end;
      Break;
    end;

  end;
   FirstSilence := count;
   LengthSilence:= silence;

freimatz 8. Aug 2018 14:57

AW: Stille im Musikfile suchen (nicht Anfang/Ende)
 
Hm in deinem Code sehe ich nichts von dem da:
Zitat:

Zitat von p80286 (Beitrag 1410003)
Da gibt es eine Funktion die den Level über einen bestimmten Zeitraum darstellen kann. Wenn ich mich nicht irre, max 2 sec.
Ich komme im Augenblick nicht an mein Delphi heran, aber in der Doku sollte man fündig werden.


markusagb 8. Aug 2018 15:46

AW: Stille im Musikfile suchen (nicht Anfang/Ende)
 
Dazu müsste ich das File abspielen wenn ich das richtig lese - das würde zu lange dauern (2:30 Min)...

Rollo62 9. Aug 2018 07:37

AW: Stille im Musikfile suchen (nicht Anfang/Ende)
 
Ich würde das nicht mit festem Pegel versuchen, sondern mit Standardabweichung des Pegels,
oder einer Kombination aus Beidem.

KodeZwerg 9. Aug 2018 07:46

AW: Stille im Musikfile suchen (nicht Anfang/Ende)
 
Deswegen fragte ich ja nach einem Audio-Sample um besser zu verstehen worauf er im Endeffekt hinaus will.
Auch wenn man das Level abfängt braucht man die Datei nicht anhören. Also nicht 1:1. Nur wie soll man so etwas interpretieren?

Ohne Beispiel Deinerseits kann ich Dir nicht helfen.

Rollo62 9. Aug 2018 07:52

AW: Stille im Musikfile suchen (nicht Anfang/Ende)
 
Richtig, das wäre hilfreich.
Wichtig ist ja auch wie kurz die Stille sein kann, 10 Sek. ?
Oder geht es um Sprachpausen, die sind dann schon kritischer.

KodeZwerg 9. Aug 2018 08:16

AW: Stille im Musikfile suchen (nicht Anfang/Ende)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Bilder sagen ja mehr als tausend Worte, also hier eine mini-Beschreibung was für Möglichkeiten es mit Bass gäbe.
Anhang 49678


In der Mitte siehst Du eine Live-Auswertung der FFTs.
Rechts siehst Du die Lautstärke per Level Live-Auswertung.
Ganz unten siehst Du die komplette Audio Datei als Spectrum Dargestellt.

Eine "entdecke stille" funktion könnte sich aus eine dieser Methoden entwickeln, FFTs ist das präziseste Mittel da man auch Frequenzen ein/ausschließen kann.
Über das Level sollte man generelle Lautheit erfahren.
Als Spectrum kann man die Bildlücken nutzen....

markusagb 9. Aug 2018 17:43

AW: Stille im Musikfile suchen (nicht Anfang/Ende)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Danke Euch!!

Anbei ein Screenshot vom File, die Pause (ist immer gemutet, also nix drin) beträgt immer 0,7 Sek. Also wenn man nach 0,5 Sek. Silence sucht dann dürfte man da auf der sicheren Seite sein...

Datei im Anhang

Ps. Da Sprachpausen immer ein offenes Mikro beinhalten liegt der Threshold durch das Rauschen bzw. Nebengeräusche im Studio bei den Sprachpausen immer über 500, zwischen den einzelnen Meldungen ist die Pause gemutet und immer faktisch <10.

KodeZwerg 9. Aug 2018 21:43

AW: Stille im Musikfile suchen (nicht Anfang/Ende)
 
Ein Screenshot von dem Audio hilft null da man es selbst auswerten muss fürs Frequenz-Feintuning.
Mein Browser zeigt mir keine Audio Datei im Anhang an, ich bin damit mal wieder raus.
Ich habe keine Ahnung woraus Dein Rauschen besteht, in welchen Bereich was gefiltert werden muss um am Ende > 5 Sekunden zu erhalten.
Ich habe keine Ahnung was dann mit dem Audio passieren soll, soll einen neue Datei erstellt werden, soll gleich was neues rangebaumelt werden, soll Dir lediglich der Start-Ende Offset von Pausen genannt werden.....

Im Grunde weiß ich nichts außer das Du nach Lücken suchst in so geheimen Files das mein Rechner sie nicht kennt.

Ich hoffe jemand mit einer Powerglaskugel XXL kann das alles erraten und Dir weiterhelfen!

markusagb 9. Aug 2018 22:14

AW: Stille im Musikfile suchen (nicht Anfang/Ende)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Grüß Dich KodeZwerg,
entschuldige bitte, hier sind die Dateien.

1) Nachrichten File mit den gemuteten Pausen zwischen den Meldungen
2) Trenner (der zwischen die Meldungen gesetzt werden soll, auf die Pausen)

Was muss ich umsetzen:
Das Nachrichten Audio-File soll nach Pausen durchsucht werden, die unter einem bestimmten Threshold liegen. Die Pausen "zwischen" den einzelnen Meldungen sind gemutet (ca. 0,7 Sek), Sprechpausen "in" der jeweiligen Meldung nicht.
Wenn die Zeiten für die Pausen feststehen soll in jede Pause ein Trenner draufgelegt werden, die original Nachrichten Datei soll dabei nicht zerschnitten werden. Alles habe ich programmiert, lediglich die Suche nach den Pausen kriege ich nicht hin :-(

Der Screenshot in meinem vorhergehenden Post zeigt wo die Trenner stehen sollen ...

Danke für Deine Hilfe!!!


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:24 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz