[PYTHON] Eine Einführung in die Sprachanalyse für Musik-Apps

Dies ist eine Zusammenfassung des Inhalts von Audiosignalverarbeitung für Musikanwendungen, den ich bei Coursera aufgenommen habe. Ich denke, es wird ein Tor sein, wenn Sie einen Schritt weiter gehen möchten, als nur einen Titel zu spielen.

Zweck der Sprachanalyse

Grob gesagt soll die Sprachanalyse klarstellen, "aus welcher Frequenz der Ton besteht, den Sie hören". Dies nennt man Spektralanalyse. Sobald dies aufgedeckt ist, können Sie:

Wie oben erwähnt, ist es bei erfolgreicher Zerlegung (Analyse) möglich, einen Klang zu erzeugen, indem das Gegenteil synthetisiert wird. Mit anderen Worten, Musikanalyse ist ein Prozess der ** Zerlegung-> Analyse-> (Umwandlung / Filterung) -> Rekonstruktion ** als Ganzes (man kann sagen, dass es sich um einen Stahlalchemisten handelt).

Ausdruck der Stimme

Der erste Schritt in der Sprachanalyse beginnt mit dem Ausdruck von Sprache als Funktion.

x[n] = Acos(\omega nT + \phi) = Acos(2\pi fnT + \phi)

Ich denke, es ist in meiner Erinnerung, dass der Graph der Dreiecksfunktion einer Schallwelle ähnelt. Dies wird verwendet, um den Ton als Funktion auszudrücken. Die Winkelgeschwindigkeit von $ \ omega $ ist, wie der Name schon sagt, der Winkel, der sich pro Zeiteinheit (1 Sekunde) bewegt. Die Winkeleinheit ist Bogenmaß (für diejenigen, die Bogenmaß sagen, siehe hier), im Fall von Bogenmaß $ 2 \ pi $ macht eine Runde, dh einen Zyklus. Wenn Sie also $ \ omega $, dessen Einheit das Bogenmaß ist, durch $ 2 \ pi $ dividieren, erhalten Sie $ f $ pro Sekunde, dh Hz.

Der zu beachtende Punkt ist $ n , der Index des endgültigen Klangs ( x [n] $). Dieses $ n $ rückt um $ T $ Sekunden vor, wenn es um 1 vorrückt. $ T $ ist die Umkehrung der Abtastfrequenz, die das Abtastintervall ist. Die Abtastfrequenz stellt die Frequenz dar, mit der Schall erfasst wird, und je höher diese ist, desto höher kann der Schall (Schall mit höherer Frequenz) behandelt werden. Die Abtastfrequenz muss mindestens doppelt so hoch sein wie die Frequenz, die Sie für das Compositing erfassen möchten (Abtasttheorem), und obwohl der vom Menschen hörbare Bereich allgemeiner CDs etwa 20.000 Hz beträgt. 44.100 Hz, was ungefähr dem Doppelten entspricht, wird übernommen.

Die Einführung ist länger geworden, aber die folgende Abbildung zeigt diese Funktion mit den tatsächlichen Parametern. Wenn Sie es als Geräusch hören, entsteht ein Geräusch wie bei einem Hörtest.

sineWave.PNG

CC by MTG(Basicmathematics-Sinewaveplot)

Es ist jedoch schwierig zu handhaben, daher werden wir die Euler-Formel verwenden, um sie in eine Exponentialfunktion umzuwandeln.

\bar{x}[n] = Ae^{j(\omega nT + \phi)} = Acos(\omega nT + \phi) + Asin(\omega nT + \phi)

Die Euler-Formel zeigt die Beziehung zwischen dem komplexen Exponenten und der Dreiecksfunktion $ e ^ {j \ phi} = cos \ phi + jsin \ phi $ (siehe Abbildung unten) und durch Anwendung dieser die Dreiecksfunktion Es ist möglich, die Darstellung in eine Darstellung eines komplexen Exponenten umzuwandeln.

euler.PNG CC by MTG(Basicmathematics-Euler'sformula)

Als Vorteil der Verwendung des komplexen Exponentialausdrucks kann die Amplitude $ A $ leicht als absoluter Wert der komplexen Zahl ausgedrückt werden, und die Anfangsphase $ \ phi $ kann leicht als Abweichungswinkel ausgedrückt werden.

complex_representation.PNG CC by MTG(Basicmathematics-Complexnumbers)

Die bisherige Geschichte kann wie folgt zusammengefasst werden.

Nachdem der Klang ausgedrückt werden kann, werde ich erklären, wie dieser Klang zerlegt und rekonstruiert wird.

Sprachzerlegung / Rekonstruktion

Diskrete Fourier-Transformation (DFT)

Aus der Schlussfolgerung ist es die Fourier-Transformation, die die Stimme zerlegt, und die inverse Fourier-Transformation, die sie rekonstruiert. Da jedoch die vom Computer verarbeitete Zeit wie oben erläutert diskret ist, wird sie als diskrete Fourier-Transformation / inverse Transformation bezeichnet.

Lassen Sie uns zunächst sehen, wie die diskrete Fourier-Transformation (DFT) definiert wird, die die Zerlegung durchführt.

X[k] = \sum^{N-1}_{n=0} x[n] e^{-j2\pi kn/N}

Die Essenz der Fourier-Transformation besteht darin, die Aufteilung $ X [k] $ herauszufinden, wie viel Schall jede Frequenz $ k $ in den erhaltenen $ N $ Samples $ x [n] $ enthalten ist. Hierbei ist jedoch zu beachten, dass $ k $ keine einfache Frequenz ist. Die Obergrenze der Frequenz, die untersucht werden kann, wird durch die Abtastfrequenz $ f_s $ bestimmt. Wenn jedoch nur $ N $ daraus abgetastet wird, wird sie alle $ f_s / N $ (= diskret) geprüft. Dieses $ f_s / N $ ist die Einheit von k, daher ist die Beziehung zwischen $ k $ und der Frequenz $ f_k = f_s k / N $, wie oben beschrieben. Der Punkt ist, dass die Feinheit der zu untersuchenden Frequenz von der Anzahl der Proben abhängt.

Wenn Sie diese beiden Punkte nicht berücksichtigen, werden Sie durch die Einheitenumrechnung verwirrt. Der Teil $ e ^ {-j2 \ pi kn / N} $ in DFT bewirkt, dass alles andere als die gewünschte Frequenz $ k $ von $ x [n] $ ([Die diskrete Fourier-Transformation 2 von 2]] gelöscht wird. (https://github.com/MTG/sms-tools/blob/master/lectures/02-DFT/2T2-DFT-2.odp), [Verallgemeinerungen der Euler-Identität](http://en.wikipedia.org/ Siehe wiki / Euler's_identity)), Sie können nur $ k $ erhalten, indem Sie $ x [n] $ damit multiplizieren. Indem wir dies jedes Mal für $ n $ berechnen und die Summe nehmen, berechnen wir die Summe der $ k $ -Komponenten, die jedes Mal in $ n $ enthalten sind, dh wie viel Frequenz $ k $ im gesamten Sound enthalten ist. Du kannst es schaffen.

Die folgende Abbildung zeigt, was tatsächlich berechnet und aufgezeichnet wurde.

DFT.PNG CC by MTG(TheDiscreteFourierTransform1of2)

Die erste Stufe zeigt den tatsächlichen Klang, die zweite und dritte Stufe zeigen das DFT-Ergebnis, die zweite Stufe ist die Amplitude und die dritte Stufe ist der Anfangsphasendiagramm. In der zweiten Reihe ist die vertikale Achse die Intensität der in ein Digibel umgerechneten Amplitude, und die horizontale Achse ist Hz, was angibt, welche Tonhöhe und wie stark der Schall ist (dies wird als Magnitudenspektrum bezeichnet). ). In der dritten Reihe ist die vertikale Achse die Anfangsphase (Winkelgeschwindigkeit) und die horizontale Achse ist Hz, was angibt, welcher Ton zu welchem Zeitpunkt zu klingen beginnt (dies wird als Phasenspektrum bezeichnet).

Hier werde ich einige verwandte Themen zusammenfassen.

magnitude_symmetry.PNG CC by MTG(TheDiscreteFourierTransform2of2DFTofrealsinusoid)

Da wir die negative Seite nicht brauchen, beschäftigen wir uns normalerweise nur mit 0 oder mehr Teilen (positive Hälfte).

\sum_{n=-N/2}^{N/2-1}|x[n]|^2 = \frac{1}{N}\sum_{k=-N/2}^{N/2-1}|X[k]|^2
db = 20 * log_{10}(abs(X)=magnitude)

phase_unwrap.PNG CC by MTG(FourierTransformproperty2of2Phaseunwrapping)

zero_padding.PNG CC by MTG(FourierTransformproperty2of2Zero-padding)

Das Durchführen einer DFT und das Klären der Größe und Phase ist der Prozess, der der "Schallzerlegung" entspricht.

Rekonstruktion (IDFT: Inverse diskrete Fourier-Transformation)

Die inverse diskrete Fourier-Transformation (IDFT) wird verwendet, um den Originalton unter Verwendung der Größe und Phase zu rekonstruieren, die als Ergebnis der DFT erhalten werden.

x[n] = \frac{1}{N}\sum^{N-1}_{k=0}X[k]e^{j2\pi kn/N}

Dies ist die umgekehrte Operation von DFT und synthetisiert die Stimme neu.

Beschleunigen

Verwenden Sie bei der tatsächlichen Berechnung die Hochgeschwindigkeits-Fourier-Transformation / Inverse-Transformation (FFT / IFFT), die DFT / IDFT beschleunigt. Gehen Sie wie folgt vor, um FFT zu verwenden:

fft.PNG

FFT / IFFT ist in scipy implementiert und kann einfach damit implementiert werden.

Die obige Erklärung lässt sich schneller in den Code einlesen. Lesen Sie daher auch den Code.

MTG/sms-tools/software/models/dftModel.py

Ich denke, Sie können jetzt die Stimme zerlegen und rekonstruieren. So wie es ist, wird der Originalton einfach rekonstruiert, daher möchte ich etwas weiter darauf eingehen, wie die Zerlegungsergebnisse von hier aus analysiert werden, und schließlich die Teile betrachten, die sich auf die Konvertierung und Filterung beziehen.

Analyse der Ergebnisse der Stimmzerlegung

Analyse von Zeitreihenänderungen (STFT: Kurzzeit-Fourier-Transformation)

Ein typisches Lied hat eine Länge von mehreren Minuten, und wenn es auf FFT angewendet wird, werden die Klänge, die zu verschiedenen Zeitpunkten im Lied klingeln, gemischt, und die Größe und Phase werden unübersichtlich und die Eigenschaften werden schwer zu erfassen. Ich werde am Ende. Daher wird das Lied in feste Längen unterteilt, und für jede Teilungseinheit wird eine diskrete Fourier-Transformation durchgeführt. Indem Sie diese anordnen, können Sie die Änderung der Größe / Phase in Zeitreihen erfassen. Diese Methode wird als Kurzzeit-Fourier-Transformation (STFT) bezeichnet.

X_l[k] = \sum^{N/2-1}_{n=-N/2}w[n]x[n+lH]e^{-j2\pi kn/N}

Dies ist ein Bild der Verschiebung des Analysebereichs der Größe N um H (siehe Abbildung unten).

stft_image.PNG CC by MTG(TheShort-TimeFourierTransform(1of2))

$ w $ heißt Fensterfunktion. Der Grund für die Anwendung einer solchen Sache ist, dass angenommen wird, dass der ausgeschnittene Teil der Größe N ein "periodisches Signal" ist. In der Realität ist dies jedoch nicht der Fall, sodass der erste Teil mit einer Funktion angewendet wird, die am Ende gegen 0 konvergiert, damit es so aussieht, als wäre es ein periodisches Signal. Die Funktion hierfür heißt Fensterfunktion.

Sie mögen sich fragen, ob es in Ordnung ist, so etwas anzuwenden, aber im Gegenteil, wenn Sie die Fensterfunktion nicht anwenden, wird die Annahme eines "periodischen Signals" gebrochen. Wenn Sie also die Stimme rekonstruieren, wird Rauschen erzeugt. Es wird so klingen, als wäre es enthalten.

Insbesondere ist die Fensterfunktion wie folgt (das Folgende ist ein einfaches rechteckiges Fenster).

window_function.PNG CC by MTG(TheShort-TimeFourierTransform(1of2)Analysiswindow)

Es nimmt am Peak den Wert 1 an und hat die Form eines einzelnen Peaks, der um ihn herum abfällt. Unter Berücksichtigung der Größe wird dies wie in der obigen Abbildung gezeigt. Der Peak wird als Hauptkeule bezeichnet, und der Peak neben dem Peak wird als Nebenkeule bezeichnet. Da es vorzuziehen ist, dass die Fensterfunktion nur die Zielfrequenz durchlässt, ist die Auswirkung auf andere Klänge (kleine Töne) als die Hauptkeule umso stärker, je schmaler die Hauptkeule ist, je höher die Frequenzauflösung und je niedriger die Nebenkeule außer der Hauptkeule ist. Wird reduziert. Es gibt einen Kompromiss zwischen der Enge des Hauptlappens und des unteren Nebenlappens, und es ist notwendig, sie je nach Situation richtig zu verwenden. Wählen Sie im Allgemeinen die mit niedriger Nebenkeule, wenn sowohl laute als auch leise Töne enthalten sind, und wählen Sie die mit schmaler Hauptkeule, wenn sie in eine bestimmte Lautstärke passt, wobei der Auflösung Vorrang eingeräumt wird. (Ersteres ist oft Blackman / Blackman-Harris und letzteres ist oft Hamming / Hanning).


Referenz
Window function Windowing Understanding FFT Windows Choosing a Windowing Function

Sinusoidal model

Das Sinusmodell besteht darin, sich einen komplexen Klang als eine Reihe einfacher Klänge (Sinus) einer bestimmten Frequenz vorzustellen. Im folgenden Modell wird der Ton zum Zeitpunkt n durch R Töne bestimmter Frequenzen dargestellt.

y[n] = \sum^R_{r=1} A_r[n]cos(2\pi f_r [n]n)

Wenn es auf dieses Modell angewendet werden kann, scheint es möglich zu sein, komplexe Klänge aus einfachen Klängen zu rekonstruieren. Wie finden Sie heraus, aus welcher Frequenz ein Sound besteht? Der Hinweis darauf ist immer noch das Spektrum.

Die Spektralanalyse zeigt, dass Geräusche mit unterschiedlichen Frequenzen als Spitzenwerte erfasst werden, wie unten gezeigt.

image Week 5: Sinusoidal model, Theory lecture 1: Sinusoidal model 1

Daher scheint es, dass die Frequenzen, aus denen der Ton besteht, gut identifiziert werden können, indem die folgenden Schritte befolgt werden.

  1. Erstellen Sie ein Betragsspektrum, damit Peaks gut erkannt werden können
  2. Identifizieren Sie den Ort des Peaks

Gehen Sie zunächst von "1. Erstellen Sie ein Betragsspektrum, damit Spitzen gut erkannt werden können". Der Punkt hierfür ist die Fenstergröße, und es muss so eingestellt werden, dass mehrere Frequenzkomponenten in das Fenster passen.

image Week 5: Sinusoidal model, Theory lecture 1: Sinusoidal model 1

Wie in [oben] gezeigt (http://qiita.com/icoxfog417/items/d376200407e97ce29ee5#%E5%88%86%E8%A7%A3dftdiscrete-fourier-transform), liegt die nachweisbare Frequenz in $ f_s / N $ -Einheiten. Daher sollte dies weniger sein als die Differenz zwischen den beiden Frequenzen, die Sie erkennen möchten (da Sie sonst die beiden Frequenzen nicht zerlegen können). Als allererstes\frac{f_s}{|f_{k+1} - f_k|}Ist abgleitet. Und die Anzahl der Fächer, die in die Hauptkeule der Fensterfunktion passen, ist fest, und das istB_sWird sein. Deshalb,B_s \frac{f_s}{|f_{k+1} - f_k|}Die entsprechende Größe kann mit abgeleitet werden.

Ein Beispiel für eine Mischung der obigen 440/490 ist wie folgt.

image Week 5: Sinusoidal model, Theory lecture 1: Sinusoidal model 1

Nun, ich weiß nicht wirklich, wie hoch die Klangfrequenz ist (440 und 490!). Also werde ich etwa 100 bis 2000 Hz hinzufügen und mich für ein M entscheiden, das über die gesamte Frequenz dazwischen gut funktioniert. (Gefällt mir. Die horizontale Achse ist die Frequenz und die vertikale Achse ist k (M = k * 100 +) 1) Da k = 21 bei jeder Frequenz stabil ist, wird 2101 als M) verwendet.

Harmonic model Sinusoidal plus residual model(Stochastic model)

Konvertierung / Filterung

Filtern

**A3: Fourier Properties Part-4: Suppressing frequency components using Zitiert aus dem DFT-Modell **

Implementation

Umwandlung

Week8 - Sound transformations

Sprachklassifizierung

Week9 - Sound and music description

In die Welt der Sprachanalyseforschung

Week10 - Concluding topics

Recommended Posts

Eine Einführung in die Sprachanalyse für Musik-Apps
Eine Einführung in die statistische Modellierung für die Datenanalyse
Eine Einführung in Mercurial für Nicht-Ingenieure
Erste Schritte mit Python für Nicht-Ingenieure
Eine Einführung in OpenCV für maschinelles Lernen
Eine Einführung in Python für maschinelles Lernen
Eine Einführung in Python für C-Sprachprogrammierer
Eine Einführung in maschinelles Lernen für Bot-Entwickler
Eine Einführung in die objektorientierte Programmierung für Anfänger von Anfängern
Lesehinweis: Einführung in die Datenanalyse mit Python
Einführung in Private TensorFlow
Eine Einführung in das maschinelle Lernen
Eine Einführung in die Python-Programmierung
Einführung in discord.py (3) Verwenden von Stimme
Einführung in die Bayes'sche Optimierung
Einführung in Python For, While
Einführung in die statistische Modellierung für die Datenanalyse GLM-Modellauswahl
Lesen von Notizen (in Python und Stan) zur Einführung in die statistische Modellierung für die Datenanalyse (Midorimoto)
Einführung in die Bildanalyse opencv python
[Python Tutorial] Eine einfache Einführung in Python
Einführung in die statistische Modellierung für die Datenanalyse GLM-Ähnlichkeitsverhältnis-Test und Testasymmetrie
Rekursives neuronales Netzwerk: Eine Einführung in RNN
Einführung in discord.py (1. Tag) -Preparation for discord.py-
Anfänger lesen "Einführung in TensorFlow 2.0 für Experten"
Eine Einführung in selbst erstellte Python-Webanwendungen für einen trägen Webingenieur im dritten Jahr
Eine Einführung in die Objektorientierung - Geben Sie einem Objekt ein Kind.
Einführung in die statistische Modellierung für die Datenanalyse Erweiterung des Anwendungsbereichs von GLM
Eine Einführung in die Datenanalyse mit Python - Um die Anzahl der Videoansichten zu erhöhen -
Was ist ein Algorithmus? Einführung in den Suchalgorithmus] ~ Python ~
Eine Einführung in Cython, ohne tief zu gehen
Verwendung von Datenanalysetools für Anfänger
[Einführung zur Minimierung] Datenanalyse mit SEIR-Modell ♬
[Einführung in die Udemy Python3 + -Anwendung] 43. for else-Anweisung
Einführung in Python "Re" 1 Erstellen einer Ausführungsumgebung
Einführung in die Programmierung (Python) TA Tendenz für Anfänger
[Für Anfänger] Einführung in die Vektorisierung beim maschinellen Lernen
Grundlegendes zur Python for Pepper-Entwicklung. -Einführung in Python Box-
Einführung in Cython ohne tief zu gehen -2-
Einführung in MQTT (Einführung)
Einführung in Scrapy (1)
Einführung in Scrapy (3)
Erste Schritte mit Supervisor
Einführung in Scrapy (2)
[Linux] Einführung in Linux
Einführung in die verteilte Parallelverarbeitung von Python durch Ray
[Einführung in Python] Hochgeschwindigkeits-Einführung in Python für vielbeschäftigte C ++ - Programmierer
Einführung in Word2Vec, die auch Katzen verstehen können
[Einführung in Python] So schreiben Sie sich wiederholende Anweisungen mit for-Anweisungen
[Technisches Buch] Einführung in die Datenanalyse mit Python -1 Kapitel Einführung-
Einführung in das maschinelle Lernen mit Simple Perceptron
Einführung in Flask Teil 1: Versuchen Sie zunächst, es lokal auszuführen und eine ausführbare Datei für die Verteilung zu erstellen