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 ...).
・ 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 |
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.
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. 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.
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")
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. 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). Bewerten Sie das erstellte Modell anschließend mit Testdaten und versuchen Sie, die Genauigkeit zu messen. 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.
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
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. 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.
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.
Recommended Posts