Frage

Ich bin ein System als Hilfe für die Musiker der Entwicklung der Durchführung der Transkription. Das Ziel ist die automatische Musiktranskription auszuführen (es muss nicht perfekt sein, da die Benutzer Pannen korrigieren / Fehler später) auf einer einziges Instrumente monophone Aufnahme. Hat hier jemand Erfahrung in der automatischen Musiktranskription hat? Oder digitale Signalverarbeitung im Allgemeinen? Hilfe von jemandem stark egal geschätzt, was Ihr Hintergrund.

Bisher habe ich die Verwendung des Fast Fourier für Tonhöhenerkennung Transformation untersucht und eine Reihe von Tests sowohl in MATLAB und meine eigenen Java-Test-Programmen hat es schnell und präzise genug für meine Bedürfnisse erwiesen. Ein weiteres Element der Aufgabe, die in Notenform ist die Anzeige der erzeugten MIDI-Daten müssen in Angriff genommen werden, aber das ist etwas, was ich nicht jetzt besorgt bin.

Kurz gesagt, was ich suche ist eine gute Methode für Note Ersteinsatzbestimmung, das heißt, die Position in dem Signal, bei dem eine neue Note beginnt. So langsam Anläufe können ziemlich schwierig sein, richtig zu erkennen, werde ich zunächst das System mit Klavieraufnahmen werden. Dies ist zum Teil auch aufgrund der Tatsache, dass ich Klavier spielen und in einer besseren Position sein sollte geeignete Aufnahmen zum Testen zu erhalten. Wie oben erwähnt, werden frühe Versionen dieses Systems für einfache monophone Aufnahmen verwendet werden, möglicherweise später zu komplexeren Eingang Fortschritte in den kommenden Wochen je nach Fortschritt.

War es hilfreich?

Lösung

Hier ist eine Grafik, die die Schwelle Ansatz zeigt Ersteinsatzbestimmung zu beachten:

alt text

Dieses Bild zeigt eine typische WAV-Datei mit drei diskreten nacheinander gespielten Noten. Die rote Linie stellt eine gewählte Signalschwelle, und die blauen Linien stellen Positionen Note Start durch einen einfachen Algorithmus zurückgeführt, die einen Start markiert, wenn der Signalpegel den Schwellenwert überschreitet.

Wie das Bild darstellt, eine richtige absolute Schwelle Auswahl schwierig ist. In diesem Fall wird die erste Note fein aufgenommen, wird die zweite Note völlig verfehlt, und die dritte Note (gerade noch) sehr spät gestartet. Im Allgemeinen ist eine niedrige Schwelle bewirkt, dass Sie die Phantom Noten holen, beim Wecken es Sie verursacht Hinweise zu verpassen. Eine Lösung für dieses Problem ist eine relative Schwelle zu verwenden, die einen Start, wenn das Signal erhöht sich um einen bestimmten Prozentsatz über eine gewisse Zeit löst, aber das hat eigene Probleme.

Eine einfachere Lösung ist es, das etwas-counterintuitively genannt Kompression ( nicht MP3-Komprimierung - das ist etwas ganz anderes ) zu verwenden, auf dem Wave-Datei zuerst. Kompression flacht im Wesentlichen der Spikes in Ihren Audio-Daten und dann alles verstärkt, so dass mehr von dem Audio-in der Nähe des Maximalwertes ist. Die Wirkung auf das obige Beispiel würde wie folgt aussehen (was zeigt, warum der Name „Kompression“ erscheint keinen Sinn machen - auf Audiogeräte ist es in der Regel mit „Lautstärke“):

alt text

Nach der Kompression wird der absolute Schwelle Ansatz viel besser funktionieren (obwohl es leicht zu über Kompresse und startet fiktive Note beginnt Aufnehmen, die gleiche Wirkung wie die Schwelle senken). Es gibt eine Menge von Wellen Editoren gibt, die eine gute Arbeit der Kompression zu tun, und es ist besser, damit sie diese Aufgabe erledigen - Sie werden wahrscheinlich eine Menge Arbeit „Aufräumen“ Ihre Wave-Dateien vor dem Erfassen Notiz tun müssen, in sie trotzdem.

Codierungsbedingungen, eine WAV-Datei in den Speicher geladen ist, im wesentlichen nur ein Array von Zwei-Byte-Ganzzahlen, wobei 0 kein Signal und 32.767 -32.768 und stellen die Spitzen. In seiner einfachsten Form würde ein Schwellenerkennungsalgorithmus nur bei der ersten Probe beginnen und durch das Array lesen, bis er einen Wert, der größer ist als der Schwellenwert findet.

short threshold = 10000;
for (int i = 0; i < samples.Length; i++)
{
    if ((short)Math.Abs(samples[i]) > threshold) 
    {
        // here is one note onset point
    }
}

In der Praxis ist dies schrecklich funktioniert, da normale Audio alle Arten von Übergangsspitzen oberhalb einer bestimmten Schwelle hat. Eine Lösung ist, eine laufende Mittelwert der Signalstärke zu verwenden (das heißt keine Startmarke, bis der Durchschnitt des letzten n Abtastwerte über dem Schwellenwert liegt).

short threshold = 10000;
int window_length = 100;
int running_total = 0;
// tally up the first window_length samples
for (int i = 0; i < window_length; i++)
{
    running_total += samples[i];
}
// calculate moving average
for (int i = window_length; i < samples.Length; i++)
{
    // remove oldest sample and add current
    running_total -= samples[i - window_length];
    running_total += samples[i];
    short moving_average = running_total / window_length;
    if (moving_average > threshold)
    {
        // here is one note onset point 
        int onset_point = i - (window_length / 2);
    }
}

All dies erfordert viel Zwicken und das Spiel mit Einstellungen, um es die Startpositionen einer WAV-Datei genau zu finden, und in der Regel, was für eine Datei arbeitet, wird sehr gut auf einem anderen nicht. Dies ist eine sehr schwierige und nicht-perfekt gelöst Problem Domain, die Sie ausgewählt haben, aber ich denke, es ist cool, dass man es anpacken.

Update: Diese Grafik zeigt ein Detail der Notenerkennung ich ausgelassen, nämlich festzustellen, wenn die Note endet:

alt text

Die gelbe Linie stellt die Off-Schwelle. Sobald der Algorithmus eine Notiz Start erkannt hat, nimmt er die Note wird fortgesetzt, bis die laufende Mittelwert der Signalstärke unter diesem Wert fällt (hier durch die lila Linien dargestellt). Dies ist, natürlich, eine weitere Quelle von Schwierigkeiten, wie es der Fall, in dem zwei oder mehr Noten überlappen (Polyphonie).

Wenn Sie den Start erkannt haben und die Punkte jeder Note zu stoppen, können Sie jetzt jede Scheibe von Daten WAV-Datei analysieren, um die Tonhöhen zu bestimmen.

Update 2: Ich habe Ihre aktualisierte Frage lesen. Pitch-Erkennung durch Autokorrelation ist viel einfacher zu implementieren als FFT, wenn Sie Ihre eigenen von Grund auf neu schreiben, aber wenn Sie bereits ausgecheckt und verwendet, um eine vorgefertigte FFT Bibliothek, du bist besser off indem es sicher. Sobald Sie den Start identifiziert haben und Positionen jeder Note stoppen (und enthalten einige Polsterung am Anfang und Ende für den verpassten Attack und Release Teile) können Sie jetzt jede Scheibe von Audiodaten ziehen und übergeben es an einer FFT-Funktion bestimmt die Tonhöhe.

Ein hier wichtiger Punkt ist, nicht ein Stück der komprimierten Audiodaten zu verwenden, sondern ein Stück der ursprünglichen, unveränderten Daten zu verwenden. Der Komprimierungsprozess verzerrt die Audio- und kann eine ungenaue Tonhöhe Lesung erzeugen.

Ein letzter Punkt über Toneinsatzausdrucksformschablonendatenbank mal ist, dass es ein Problem weniger sein kann, als Sie denken. Oft in der Musik ein Instrument mit einem langsamen Angriff (wie ein Soft Synth) eine Note früher als ein scharfer Angriff Instrument (wie ein Klavier) beginnen und beiden Noten klingen, als ob sie zur gleichen Zeit fangen. Wenn Sie Instrumente auf diese Weise spielen, mit dem Algorithmus die gleiche Startzeit für beide Arten von Instrumenten aufzunehmen, die von einer WAV-to-MIDI-Perspektive gut ist.

Letzte Aktualisierung (hoffe ich): Vergessen Sie, was ich sagte über einige Polsterungen Proben aus dem frühen Angriff Teil jeder Note einschließlich - Ich habe vergessen, das ist eigentlich eine schlechte Idee für Tonhöhenerkennung. Die Angriffsabschnitte vieler Instrumente (insbesondere Klavier und andere perkussiven Instrumenten-Typ) enthalten, Transienten, die nicht Vielfache des Grundtons sind und dazu neigen, Tonhöhenerkennung zuzuschrauben. Sie wollen eigentlich jede Scheibe ein wenig nach dem Angriff aus diesem Grunde starten.

Oh, und irgendwie wichtig. der Begriff "Kompression" hier bezieht sich nicht auf MP3-Kompressionsverfahren

Update wieder: hier ist eine einfache Funktion, die nicht-dynamische Kompression tut:

public void StaticCompress(short[] samples, float param)
{
    for (int i = 0; i < samples.Length; i++)
    {
        int sign = (samples[i] < 0) ? -1 : 1;
        float norm = ABS(samples[i] / 32768); // NOT short.MaxValue
        norm = 1.0 - POW(1.0 - norm, param);
        samples[i] = 32768 * norm * sign;
    }
}

Wenn param = 1,0, diese Funktion keinen Einfluss auf dem Audio hat. Größere param Werte (2,0 ist gut, was die normalisierte Differenz zwischen jeder Probe Quadrat wird und der maximalen Spitzenwert) werden mehr Kompression erzeugen und einen lauteren Gesamt (aber crappy) Ton. Werte unter 1,0 wird eine Expansionswirkung erzeugen.

Eine andere wohl offensichtlich Punkt. Sie sollte die Musik in einem kleinen, nicht-echoic Raum aufzuzeichnen, da Echos werden häufig durch diesen Algorithmus als Phantomnotizen aufgenommen

Update: Hier ist eine Version von StaticCompress, die in C # kompilieren und explicity wirft alles. Dies gibt das erwartete Ergebnis:

public void StaticCompress(short[] samples, double param)
{
    for (int i = 0; i < samples.Length; i++)
    {
        Compress(ref samples[i], param);
    }
}

public void Compress(ref short orig, double param)
{
    double sign = 1;
    if (orig < 0)
    {
        sign = -1;
    }
    // 32768 is max abs value of a short. best practice is to pre-
    // normalize data or use peak value in place of 32768
    double norm = Math.Abs((double)orig / 32768.0);
    norm = 1.0 - Math.Pow(1.0 - norm, param);
    orig = (short)(32768.0 * norm * sign); // should round before cast,
        // but won't affect note onset detection
}

Sorry, mein Wissen Punktzahl auf Matlab ist 0. Wenn Sie eine andere Frage gestellt, warum Ihre Matlab-Funktion funktioniert nicht wie erwartet, dass es (nur nicht von mir) erhalten beantwortet würde.

Andere Tipps

Was Sie oft tun wollen heißt WAV-to-MIDI (google "wav-to-midi"). Es wird in diesem Prozess viele Versuche unternommen worden, mit unterschiedlichen Ergebnissen (Anmerkung Beginn ist eine der Schwierigkeiten, Polyphonie viel schwieriger ist, zu beschäftigen). Ich würde empfehlen, mit einer gründlichen Durchsuchung der off-the-Shelf-Lösungen starten, und nur die Arbeit auf eigener Faust starten, wenn es nichts akzeptabel da draußen.

Der andere Teil des Prozesses, die Sie benötigen würden, ist etwas, um den MIDI-Ausgang als traditionelle musikalische Partitur zu machen, aber es gibt zig Milliarden Produkte, die das tun.

Ein andere Antwort ist: Ja, ich habe eine Menge von digitaler Signalverarbeitung durchgeführt (siehe die Software auf meiner Website - es ist ein unendlicher-Voice-Software-Synthesizer in VB und C geschrieben), und ich habe Interesse an Ihnen helfen mit dieses Problem. Der WAV-to-MIDI ist ein Teil nicht wirklich, dass konzeptionell schwierig, es ist nur so dass es zuverlässig in der Praxis funktionieren, die hart sind. Hinweis Beginn setzt nur ein Schwellenwert - Fehler können leicht vorwärts oder rückwärts in der Zeit angepasst werden, um Toneinsatzausdrucksformschablonendatenbank Unterschiede zu kompensieren. Tonhöhenerkennung ist viel einfacher, auf einer Aufnahme zu tun, als es in Echtzeit zu tun ist, und beinhaltet nur die Implementierung eine Autokorrelationsroutine zurück.

Sie sollten sehen MIRToolbox - ist es für Matlab geschrieben und hat Detektor einen Ausbruch eingebaut - es funktioniert ziemlich gut. Der Quellcode ist unter der GPL, so dass Sie den Algorithmus implementieren können, in welcher Sprache für Sie arbeitet. Welche Sprache ist Ihre Produktion Code nicht benutzen will?

Diese Bibliothek ist zentriert um Audio-Kennzeichnung:

aubio

  

aubio ist eine Bibliothek für Audio-Kennzeichnung. Seine Eigenschaften umfassen eine Sounddatei vor jedem seiner Angriffe Segmentieren Tonhöhenerkennung durchgeführt wird, tippen den Beat und Midi-Streams von Live-Audio erzeugen. Der Name aubio kommt von ‚Audio‘ mit einem Tippfehler:. Mehrere Übertragungsfehler sind wahrscheinlich auch in den Ergebnissen gefunden werden

, und ich habe für Ersteinsatzbestimmung und Tonhöhenerkennung mit ihm viel Glück hat. Es ist in C, aber es gibt swig / Python-Wrapper.

Auch hat der Autor der Bibliothek als pdf seine Dissertation auf der Seite, die guten Infos und Hintergründe über die Kennzeichnung hat.

Hard Anläufe sind in der Zeitdomäne leicht erkannt durch eine durchschnittliche Energiemessung.

SUM von 0 bis N (x ^ 2)

Tun Sie dies mit Stücken des gesamten Signals. Sie sollten Spitzen sehen, wenn Anläufe auftreten (die Fenstergröße bis zu Ihnen, mein Vorschlag ist, 50ms oder mehr).

Umfangreiche Papiere auf Onset-Erkennung:

Für Hardcore Engineers:

http://www.nyu.edu/classes/bello/MIR_files /2005_BelloEtAl_IEEE_TSALP.pdf

Einfacher für durchschnittliche Person zu verstehen:

http://bingweb.binghamton.edu/~ahess2/Onset_Detection_Nov302011.pdf

Sie könnten versuchen, das wav-Signal in ein Diagramm der Amplitude über die Zeit zu transformieren. Dann wird ein Weg, um eine konsistente Auftreten zu bestimmen, ist der Schnittpunkt einer Tangente im Wendepunkt der ansteigenden Flanke eines Signals mit der x-Achse zu berechnen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top