[PYTHON] BGM wird automatisch entsprechend dem Inhalt der Konversation ausgewählt

1. 1. Einführung

Fordern Sie den zweiten von Sony und Ledge geplanten zweiten AI-Entwicklungswettbewerb "Neural Network Console Challenge" erneut heraus. Durch die Analyse der Audiodaten (BGM) und der Bibliographie (Songbeschreibung) von Audiostock arbeiten wir an einer kostenlosen Aufgabe "Erstellen Sie einen Player, der BGM automatisch gemäß dem Inhalt der täglichen Konversation auswählt" **. Stellen Sie sich ein System vor, in dem intelligente Lautsprecher wie Google Home automatisch Hintergrundmusik entsprechend dem Gesprächsinhalt der Person im Raum abspielen (obwohl die Hürde für den praktischen Gebrauch unter dem Gesichtspunkt der Privatsphäre hoch zu sein scheint ...).

2. Experimentelle Umgebung & Daten

・ Google Colaboratory (Python3) ・ Neuronale Netzwerkkonsole (Windows-Version)

Arbeitsnr. Datenname Einzeilige Erklärung Etikett
42554 audiostock_42554.wav Es ist das beste Lied für die Eröffnung. Öffnung
42555 audiostock_42555.wav Es ist ein herrisches Lied Bosanova
42556 audiostock_42556.wav Herzerwärmend Easy Listening Comical komisch,süß,warm,Herzerwärmend,einfach zuhören
42557 audiostock_42557.wav Es ist ein seltsames Lied Seltsamer Beat

3. 3. BGM automatische Klassifizierung

Erstellen Sie mithilfe von BGM-Sprachdaten (WAV) ein Modell für die automatische Klassifizierung mithilfe von NNC. Aus zeitlichen Gründen haben wir ein Modell erstellt, das diesmal in drei Klassen eingeteilt werden kann.

3-1. Anmerkungen und Trainingsdaten

Um zu untersuchen, welche Art von Klasse wünschenswert ist, untersuchen Sie zuerst die in der obigen "einzeiligen Erklärung" enthaltenen Wörter mit "KHcoder", mit dem Textdaten statistisch analysiert werden können. Die Top-Ergebnisse sind wie folgt. image.png Von diesen scheint es, dass Sie klassifizieren können, während Sie tatsächlich die Hintergrundmusik hören (das Tempo, der Ton usw. sind unterschiedlich) Verwendung von Songs, die "Rock", "Pop" und "Ballade" als Trainingsdaten enthalten. Wir haben 1468 Trainingsdaten und 105 Bewertungsdaten erstellt. Außerdem wurden Tonquellen (Jingles) wie Soundeffekte von der Erstellung ausgeschlossen, da die Länge des Songs kurz ist.

3-2. In Mel-Frequenz-Keptram-Koeffizienten umrechnen

Wir werden die WAV-Daten von BGM in den Mel-Frequenz-Keptram-Koeffizienten konvertieren und in einen 40-dimensionalen Vektor ablegen (ich werde die Details weglassen, aber diese Seite / 34161f2facb80edd999f) wurde ausführlich beschrieben). Der Durchschnitt wurde für jede Steigung auf der vertikalen Achse genommen und zu einem Array (1,40) gemacht, das als Trainingsdaten verwendet wurde.

Wav_to_Mel.py


import pandas as pd
import numpy as np
import librosa

y, sr = librosa.load(file_name)
#Merkmalsextraktion in 40 Dimensionen
mfcc = librosa.feature.mfcc(y=y, sr=sr, n_mfcc=40)
#Berechnen Sie den Durchschnitt auf der vertikalen Achse und geben Sie ihn aus
S_A = np.mean(mfcc, axis = 1)
np.savetxt(output_filename, S_A.reshape(1, -1), delimiter=',', fmt="%s")

3-3. Erstellen Sie ein Klassifizierungsmodell mit NNC

Ich habe ein Modell trainiert, das Vektoren mit NNC klassifiziert. Es scheint, dass die Lösungsmethode mit CNN üblich ist, aber nach dem Ausprobieren verschiedener Netzwerke und Aktivierungsfunktionen sind die folgenden Einstellungen am genauesten. Wenn ich Zeit habe, möchte ich das Experiment wiederholen. Der Vorteil von NNC ist übrigens, dass es sehr einfach ist, da die GUI auf Versuch und Irrtum wie das Ändern der Funktion vorbereitet ist. Sie können intuitiv verstehen, um welche Art von Netzwerk es sich handelt, und ich denke, es ist eine der Attraktionen im Vergleich zu Google Colab. image.png Da ich niedrigdimensionale Vektoren trainiert habe, war diesmal der Verarbeitungsaufwand mit der CPU (Windows-Version) ausreichend, aber die Lernergebnisse mit der Cloud-Version, die mit fast denselben Einstellungen gelernt wurde, werden vorerst veröffentlicht. Nachdem 30 Epochen trainiert worden waren, war die Lernkurve wie folgt (Beste Validierung war die 9. Epoche). image.png Bewerten Sie das erstellte Modell anschließend mit Testdaten und versuchen Sie, die Genauigkeit zu messen. image.png image.png Obwohl es sich um ein Drei-Klassen-Problem handelt, scheint die Genauigkeit einige Merkmale von 0,8 zu haben. Die durchschnittliche Präzisionsrate liegt bei etwa 80% oder mehr und scheint ein wertvolles Modell für die Auswahl eines geeigneten BGM zu sein.

4. Analysieren Sie das tägliche Gespräch

Wählen Sie unter Verwendung des von Bert trainierten Modells aus der einzeiligen Erklärung eine Hintergrundmusik aus, die dem Konversationsinhalt nahe kommt. Berechnet den Konversationsvektor (Textvektor) und wählt die Hintergrundmusik mit der nächstgelegenen einzeiligen Beschreibung in Kosinusähnlichkeit aus. Suchen Sie zuerst auf Textbasis nach einer geeigneten Hintergrundmusik und dann 3. Wir werden Songs basierend auf der Klassifizierung basierend auf der in erstellten Hintergrundmusik auswählen. Ich konnte mir keine Implementierung von BERT in NNC vorstellen, also habe ich es mit Google Colab und Transformatoren verarbeitet, die über Kenntnisse verfügen (NNC hat persönlich viele Bildfelder, daher werde ich mich das nächste Mal um die natürliche Sprache kümmern. Ich bin zufrieden mit meiner Arbeit.

Conversation_to_BGM.py


import pandas as pd
import numpy as np
import torch
import transformers

from transformers import BertJapaneseTokenizer
from tqdm import tqdm
tqdm.pandas()

class BertSequenceVectorizer:
    def __init__(self):
        self.device = 'cuda' if torch.cuda.is_available() else 'cpu'
        self.model_name = 'cl-tohoku/bert-base-japanese-whole-word-masking'
        self.tokenizer = BertJapaneseTokenizer.from_pretrained(self.model_name)
        self.bert_model = transformers.BertModel.from_pretrained(self.model_name)
        self.bert_model = self.bert_model.to(self.device)
        self.max_len = 128
            
    def vectorize(self, sentence : str) -> np.array:
        inp = self.tokenizer.encode(sentence)
        len_inp = len(inp)

        if len_inp >= self.max_len:
            inputs = inp[:self.max_len]
            masks = [1] * self.max_len
        else:
            inputs = inp + [0] * (self.max_len - len_inp)
            masks = [1] * len_inp + [0] * (self.max_len - len_inp)

        inputs_tensor = torch.tensor([inputs], dtype=torch.long).to(self.device)
        masks_tensor = torch.tensor([masks], dtype=torch.long).to(self.device)
        
        seq_out, pooled_out = self.bert_model(inputs_tensor, masks_tensor)

        if torch.cuda.is_available():    
            return seq_out[0][0].cpu().detach().numpy()
        else:
            return seq_out[0][0].detach().numpy()

if __name__ == '__main__':
    #Lesen der Originaldaten
    df_org = pd.read_csv('./drive/NNC/BGM-Datenliste.csv')
    #Konzentrieren Sie sich nur auf die Songs in den Trainingsdaten
    df_org = df_org.dropna(subset=["Einzeilige Erklärung"])
    df_org = df_org[~df_org['Einzeilige Erklärung'].str.contains("Klimpern")]
    df_org = df_org[~df_org['Etikett'].str.contains("Klimpern")]
    df_org = df_org.head(5000)
    word = ["Sperren", "Pop", "Ballard"]
    df = df_org.iloc[0:0]
    for w in word:
      df_detect = df_org[df_org["Einzeilige Erklärung"].str.contains(w)]
      df = pd.concat([df, df_detect])
    df = df.reset_index(drop=True)
    BSV = BertSequenceVectorizer()
    #Berechnen Sie den Merkmalsvektor aus der Bibliographie
    df['text_feature'] = df['Einzeilige Erklärung'].progress_apply(lambda x: BSV.vectorize(x))
    #Suchen Sie nach ähnlichen Vektoren (BGM) aus dem Eingabetext
    nn = NearestNeighbors(metric='cosine')
    nn.fit(df["text_feature"].values.tolist())
    vec = BSV.vectorize("Guten Morgen. Heute ist schönes Wetter. Ja. Es sieht den ganzen Tag sonnig aus.")
    ##Berechnen Sie die Kosinusähnlichkeit
    dists, result = nn.kneighbors([vec], n_neighbors=1)
    print(df["Datenname"][r], df["Einzeilige Erklärung"][r])

###Ausgabeergebnis
audiostock_45838.wav
Name:Datenname, dtype: object 188    
Beschäftigt, aber lustiger Pop/Sperren
Name:Einzeilige Erklärung, dtype: object

5. Experiment

Versuchen wir nun, welche Art von Lied ausgewählt wird, indem wir den erwarteten Konversationssatz eingeben. Die endgültige Hintergrundmusik bestand aus 300 Songs, die nicht zum Lernen und Bewerten verwendet wurden und die Wörter "Rock", "Pop" und "Ballade" nicht in die einzeilige Erklärung aufgenommen haben. Das ganze Bild ist wie in der Abbildung gezeigt. image.png Damit die Songs endgültig ausgewählt werden können, haben wir uns entschlossen, die Songs mit der höchsten Vorhersagewahrscheinlichkeit in der Reihenfolge aus der von NNC ausgegebenen Datei "output_result.csv" abzuspielen (NNC kann zum Zeitpunkt des Lernens und der endgültigen Evaluierung unterschiedliche Daten für die Evaluierung festlegen. ). Lassen Sie uns in verschiedenen Fällen Songs auswählen.

** Fall 1) ** ** ◆ Gespräch: ** Guten Morgen. Heute ist schönes Wetter. Ja. Es sieht den ganzen Tag sonnig aus. ** ◆ Eine Zeile mit hoher Ähnlichkeit Beschreibung: ** Beschäftigter aber lustiger Pop / Rock (audiostock_45838.wav) → Label "Rock"

Ob es ein Morgenlied ist oder nicht, ich konnte ein Lied auswählen, das energisch zu sein scheint, wie "kraftvoll" und "lebhaft"! Es scheint eine Tendenz zu geben, Songs im Metal-Stil, die E-Gitarren verwenden, auszuwählen.

*** Fall 2) *** ** ◆ Gespräch: ** Wir planen am Wochenende in Yamanashi zu campen. Sie können zum ersten Mal seit einiger Zeit eine ruhige Zeit am See verbringen. Es wird kühler, also sei vorsichtig. ** ◆ Eine Zeile mit hoher Ähnlichkeit Beschreibung: ** Pop (audiostock_45997.wav), der an einem fernen Tag plötzlich die Liebe der Eltern vermisst → Label "Pop" ** ◆ Ergebnis der Songauswahl: ** ・ Audiostock_45254 Reine japanische Musik mit einem urigen Rücken, der in Geistergeschichten gefriert ・ Audiostock_44771 Hintergrundmusik von Horror Document Touch ・ Audiostock_46760 Reiseinformationen Nostalgisch, melancholisch, einsame Dämmerung ・ Audiostock_46657 Auffrischen des gewünschten Laufwerks Licht vorwärts ・ Audiostock_44331 Herzerwärmende Musik der tropischen Karibik

Der 1. und 2. Song sind offensichtlich schlechte Auswahlergebnisse (Ghost Story ...), aber der 4. und 5. Song sind Pop-BGMs, die perfekt für unterwegs sind. Auch die Erklärung des dritten Songs hat eine traurige Atmosphäre, aber es war eine Hintergrundmusik mit "Pop" im Tag, und als ich sie tatsächlich hörte, war es nicht so dunkel. Daraus ergibt sich die Tendenz, automatisch Songs im Pop-Stil auszuwählen.

*** Fall 3) *** ** ◆ Gespräch: ** Ich habe dieses Drama gehört, eine bewegende Sache, hast du es gesehen? .. Eine traurige und traurige Geschichte. Der letzte weinte. ** ◆ Eine Zeile mit hoher Ähnlichkeit Beschreibung: ** Erwärmende Ballade, jugendliche Gefühle (audiostock_43810.wav) → Label "Ballade" ** ◆ Ergebnis der Songauswahl: ** ・ Audiostock_46013 Eine frische, mysteriöse und geräumige Umgebung ・ Audiostock_44891 Entspannungsumgebung von Nachtsternen ・ Audiostock_44575 Ein sanfter Ambi-Sound, der die Welt der Märchen erweitert ・ Audiostock_45599 Eine mysteriöse Umgebung mit einer kühlen Morgenatmosphäre ・ Audiostock_45452 Ein anmutiger Klassiker mit künstlerischer Eleganz im Garten

Ich war in der Lage, leise Hintergrundmusik wie mysteriöse und lockere balladenartige Songs und Klassiker erfolgreich zu extrahieren.

Alle drei Kategorien wurden automatisch nur basierend auf den BGM-Funktionen ausgewählt, aber es scheint, dass wir Songs extrahieren konnten, die fast wie beabsichtigt waren! Betrachtet man die BGMs, die nicht ausgewählt wurden (die Wahrscheinlichkeit einer Vorhersage war gering), "Variety Program Title BGM" (audiostock_43840), "Euro-House-Stil mit lateinischem Geschmack" (audiostock_42921), "Multinational African Mystery Travelogue Fashionable" (Audiostock_46146) usw., und es wurde bestätigt, dass das Modell eine Unterscheidung von ungeeigneter Hintergrundmusik aufweist.

6. Zusammenfassung und Überlegung

Für die Aufgabe, einen Player zu erstellen, der BGM automatisch entsprechend dem Inhalt der täglichen Konversation auswählt

Das konnte ich realisieren. Dieses Mal konnte ich nur ein Modell mit insgesamt etwa 1600 Songs und kleinen Trainingsdaten erstellen. Durch weitere Prüfung der Anmerkungen und der Anzahl der Daten kann jedoch eine weitere Verbesserung der Genauigkeit erwartet und drei oder mehr Klassifizierungsklassen erstellt werden. Sollte tun. Es scheint mehr Raum für Forschung zu geben, wie die Eigenschaften von BGM berechnet werden können. Der Servicevorschlag basierte auf der Annahme intelligenter Lautsprecher, ist jedoch nicht darauf beschränkt, sondern kann als vielversprechender Vorschlag verwendet werden, z. B. das Posten von Songs aus Tags und Texten auf SNS und das automatische Auswählen von BGM aus Untertiteldaten durch Videobearbeitung. Es scheint so als.

7. Verweise

Recommended Posts

BGM wird automatisch entsprechend dem Inhalt der Konversation ausgewählt
Punkt entsprechend dem Bild
Ändern Sie den Einstellungswert von settings.py entsprechend der Entwicklungsumgebung
Versuchen Sie, die Geschwindigkeit von Zeitraffervideos automatisch anzupassen (Teil 2).
Ändern Sie die Lautstärke von Pepper entsprechend der Umgebung (Ton).
Ergänzung zur Erklärung von vscode
[Golang-Fehlerbehandlung] Der beste Weg, die Verarbeitung nach der Art des Fehlers aufzuteilen
Ich habe versucht, die Bewegungen von Wiire-Playern automatisch mit Software zu extrahieren
Ich habe versucht, das RSS des Top-Songs des iTunes Store automatisch abzurufen
Die Geschichte des Versuchs, den Client wieder zu verbinden
10 Methoden zur Verbesserung der Genauigkeit von BERT
So überprüfen Sie die Version von Django
Die Geschichte, MeCab in Ubuntu 16.04 zu setzen
Die Geschichte von pep8 wechselt zu pycodestyle
Test der Differenz zwischen den Durchschnittswerten der Zähldaten gemäß der Poisson-Verteilung
Ich habe ein Tool zum automatischen Sichern der Metadaten der Salesforce-Organisation erstellt
Ich habe versucht, die Literatur des neuen Corona-Virus mit Python automatisch an LINE zu senden
So berechnen Sie die Volatilität einer Marke
So finden Sie den Bereich des Boronoi-Diagramms
Python-Konstanten wie None (laut Referenz)
Die Hand von "Millijan" durch Kombinationsoptimierung finden
Einstellung zur Ausgabe des Protokolls zur Ausführung von cron
Die Ungenauigkeit von Tensorflow war auf log (0) zurückzuführen.
Ich habe versucht, die Trapezform des Bildes zu korrigieren
Von der Einführung von Pyethapp bis zur Vertragsabwicklung
Versuchen Sie, die Bewegung des Sonnensystems zu simulieren
Die Geschichte vom Umzug von Pipenv zur Poesie
Ich habe versucht, die Texte von Hinatazaka 46 zu vektorisieren!
Ein Skript, das Stresstests entsprechend der Anzahl der CPU-Kerne durchführen kann