Kürzlich fand die
ID R & D Voice Antispoofing Challenge statt , deren Hauptaufgabe es war, einen Algorithmus zu entwickeln, der eine menschliche Stimme von einer synthetisierten Aufzeichnung (Parodie) unterscheiden kann. Ich bin ML Researcher bei Dasha AI und arbeite viel an der Spracherkennung. Deshalb habe ich mich für die Teilnahme entschieden. Zusammen mit dem Team haben wir den ersten Platz belegt. Im Folgenden werde ich über neue coole Ansätze für die Klangverarbeitung sowie über die Schwierigkeiten und Kuriositäten sprechen, mit denen wir konfrontiert waren.
98 Personen nahmen an dem Wettbewerb teil - es gibt so wenige Personen, weil dies ein Wettbewerb für die Tonverarbeitung ist, auf einer russischen Plattform und sogar in einem Hafen. Ich war in einem Team mit Dmitry Danevsky, dem Kaggle-Meister, den wir getroffen haben und dem wir zugestimmt haben, teilzunehmen, während wir über Ansätze in einem anderen Wettbewerb diskutiert haben.
Herausforderung
Wir erhielten 5 GB Audiodateien, die in Parodien / menschliche Klassen unterteilt waren, und wir mussten die Wahrscheinlichkeit der Klasse vorhersagen, sie in ein Dock packen und an den Server senden. Die Lösung sollte in 30 Minuten funktionieren und weniger als 100 MB wiegen. Nach offiziellen Angaben musste zwischen der Stimme einer Person und einer automatisch erzeugten Stimme unterschieden werden - obwohl ich persönlich der Meinung war, dass die Parodie auch Fälle umfasste, in denen der Ton durch Halten des Lautsprechers an das Mikrofon erzeugt wurde (wie es Angreifer durch Stehlen einer Aufzeichnung der Stimme einer anderen Person zur Identifizierung tun).
Die Metrik war
EER :

Wir haben den
ersten Code genommen, der auf das Netzwerk gestoßen ist, weil der
Code der Organisatoren überladen zu sein schien.
Wettbewerb
Die Organisatoren stellten die Basislinie und gleichzeitig das Haupträtsel des Wettbewerbs. Es war so einfach wie ein Stock: Wir nehmen Audiodateien, zählen
Kreidespektrogramme , trainieren MobileNetV2 und befinden uns auf dem 12. Platz oder darunter. Aus diesem Grund hätten viele gedacht, dass ein Dutzend Personen an dem Wettbewerb teilgenommen hätten, aber dem war nicht so. Während der gesamten ersten Phase des Wettbewerbs konnte unser Team diese Grundlinie nicht brechen. Der im Idealfall identische Code verschlechterte das Ergebnis erheblich, und Verbesserungen (z. B. das Ersetzen durch stärkere Raster und
OOF- Vorhersagen) halfen, brachten es jedoch nicht näher an die Basislinie.
Und dann geschah das Unerwartete: Etwa eine Woche vor dem Ende des Wettbewerbs stellte sich heraus, dass die Implementierung der Zählung der Messdaten der Organisatoren einen Fehler enthielt und von der Reihenfolge der Vorhersagen abhing. Etwa zur gleichen Zeit stellte sich heraus, dass die Organisatoren in den Hafencontainern das Internet nicht ausschalteten, so dass viele das Testmuster heruntergeladen hatten. Dann wurde der Wettbewerb für 4 Tage eingefroren, die Metrik korrigiert, die Daten aktualisiert, das Internet abgeschaltet und für weitere 2 Wochen neu gestartet. Nach dem Nachzählen waren wir mit einem unserer ersten Beiträge auf dem siebten Platz. Dies war eine starke Motivation für die weitere Teilnahme am Wettbewerb.
Apropos Modell
Wir verwendeten ein resnetartiges Faltungsgitter, das über Kreidespektrogrammen trainiert wurde.
- Insgesamt gab es 5 solcher Blöcke. Nach jedem dieser Blöcke haben wir eine gründliche Überwachung durchgeführt und die Anzahl der Filter um das Eineinhalbfache erhöht.
- Während des Wettbewerbs haben wir von einer binären Klassifizierung zu einer Mehrklassenklassifizierung gewechselt , um die Mischtechnik, bei der wir zwei Sounds mischen und ihre Klassenbezeichnungen zusammenfassen, effizienter zu nutzen. Darüber hinaus konnten wir nach einem solchen Übergang die Wahrscheinlichkeit der Parodieklasse künstlich erhöhen, indem wir sie mit 1,3 multiplizierten. Dies hat uns geholfen, da davon ausgegangen wurde, dass die Klassenbalance in der Teststichprobe möglicherweise von der in der Schulung abweicht, und daher die Qualität der Modelle verbessert wurde.
- Faltenmodelle wurden trainiert und die Vorhersagen mehrerer Modelle wurden gemittelt.
- Auch die Frequenzcodierungstechnik hat sich als nützlich erwiesen. Die Quintessenz lautet: 2D-Faltungen sind positionsinvariant, und in den Spektrogrammen haben die Werte entlang der vertikalen Achse sehr unterschiedliche physikalische Bedeutungen. Daher möchten wir diese Informationen auf das Modell übertragen. Dazu haben wir das Spektrogramm und die Matrix verkettet, die aus Zahlen in einem Segment von -1 bis 1 von unten nach oben bestehen.
Der Klarheit halber werde ich den Code geben:
n, d, h, w = x.size() vertical = torch.linspace(-1, 1, h).view(1, 1, -1, 1) vertical = vertical.repeat(n, 1, 1, w) x = torch.cat([x, vertical], dim=1)
- Wir haben dies alles geschult, auch anhand von pseudo-markierten Daten aus dem durchgesickerten Testmuster der ersten Stufe.
Validierung
Von Beginn des Wettbewerbs an waren alle Teilnehmer von der Frage geplagt: Warum ergibt die lokale Validierung eine EER von 0,01 und weniger und eine Rangliste von 0,1, die nicht besonders korreliert? Wir hatten zwei Hypothesen: Entweder enthielten die Daten Duplikate, oder es wurden Trainingsdaten für einen Satz von Sprechern und Testdaten für einen anderen Satz gesammelt.
Die Wahrheit lag irgendwo dazwischen. In den Trainingsdaten erwiesen sich ungefähr 5% der Daten als Duplikate, und dies gilt nur für vollständige Duplikate der Hashes (es könnte übrigens auch verschiedene Ausschnitte derselben Datei enthalten, aber es ist nicht so einfach zu überprüfen - aus diesem Grund haben wir dies nicht getan).
Um die zweite Hypothese zu testen, haben wir ein Sprecher-ID-Gitter trainiert, Einbettungen für jeden Sprecher erhalten, alles mit k-Mitteln gruppiert und geschichtet gefaltet. Wir haben nämlich Referenten aus einem Cluster geschult und Referenten aus anderen vorausgesagt. Diese Validierungsmethode korreliert bereits mit der Bestenliste, obwohl sie drei- bis viermal besser abschneidet. Alternativ haben wir versucht, nur Vorhersagen zu validieren, bei denen das Modell zumindest ein wenig unsicher war, das heißt, der Unterschied zwischen der Vorhersage und der Klassenbezeichnung betrug> 10 ** - 4 (0,0001), aber ein solches Schema brachte keine Ergebnisse.
Und was hat nicht funktioniert?
Im Internet reicht es aus, Tausende von Stunden menschlicher Sprache zu finden. Darüber hinaus wurde bereits vor einigen Jahren ein ähnlicher Wettbewerb ausgetragen. Aus diesem Grund schien es naheliegend, eine Menge Daten herunterzuladen (wir haben ca. 300 GB heruntergeladen) und den Klassifikator darauf zu trainieren. In einigen Fällen erwies sich das Training mit solchen Daten als etwas schwierig, wenn wir vor Erreichen eines Plateaus zusätzliche und Zugdaten lernten und dann nur mit Trainingsdaten trainierten. Aber mit diesem Schema hat sich das Modell in ungefähr 2 Tagen angeglichen, was 10 Tagen für alle Falten bedeutete. Deshalb haben wir diese Idee aufgegeben.
Außerdem stellten viele Teilnehmer eine Korrelation zwischen der Dateilänge und der Klasse fest, die in der Testprobe nicht festgestellt wurde. Gewöhnliche Bildraster wie resnext, nasnet-mobile, mobileNetV3 zeigten sich nicht sehr gut.
Nachwort
Es war nicht einfach und manchmal seltsam, aber wir haben trotzdem eine coole Erfahrung gemacht und uns durchgesetzt. Durch Versuch und Irrtum wurde mir klar, welche Ansätze funktionieren und welche nicht sehr gut sind. Jetzt werde ich diese Erkenntnisse bei der Verarbeitung von Ton verwenden. Ich arbeite hart daran, die Gesprächs-KI auf ein vom Menschen nicht zu unterscheidendes Niveau zu bringen, und daher immer auf der Suche nach interessanten Aufgaben und Chips. Ich hoffe du hast auch was neues gelernt.
Nun, endlich poste ich
unseren Code .