Apa kamu Bagaimana kami membedakan tipuan dari manusia - dan bahkan menang

Baru-baru ini, ID R&D Voice Antispoofing Challenge diadakan , tugas utamanya adalah membuat algoritma yang dapat membedakan suara manusia dari rekaman yang disintesis (spoof). Saya Peneliti ML di Dasha AI dan banyak bekerja pada pengenalan ucapan, jadi saya memutuskan untuk berpartisipasi. Bersama dengan tim kami mengambil tempat pertama. Di bawah potongan, saya akan berbicara tentang pendekatan keren baru untuk pemrosesan suara, serta tentang kesulitan dan keanehan yang harus kami hadapi.

98 orang berpartisipasi dalam kompetisi - ada sangat sedikit orang karena ini adalah kompetisi untuk pemrosesan suara, pada platform Rusia, dan bahkan di buruh pelabuhan. Saya berada di sebuah tim dengan Dmitry Danevsky, Kaggle Master, yang kami temui dan sepakati untuk berpartisipasi sambil mendiskusikan pendekatan dalam kompetisi lain.

Tantangan


Kami diberi 5 GB file audio, dibagi menjadi spoof / kelas manusia, dan kami harus memprediksi probabilitas kelas, membungkusnya dengan buruh pelabuhan dan mengirimkannya ke server. Solusinya seharusnya bekerja dalam 30 menit dan beratnya kurang dari 100 MB. Menurut informasi resmi, penting untuk membedakan antara suara seseorang dan suara yang dibuat secara otomatis - walaupun secara pribadi tampak bagi saya bahwa kelas spoof juga memasukkan kasus-kasus di mana suara dihasilkan dengan memegang speaker ke mikrofon (seperti yang dilakukan penyerang dengan mencuri rekaman suara orang lain untuk identifikasi).

Metriknya adalah EER :



Kami mengambil kode pertama yang datang dari jaringan, karena kode penyelenggara tampak kelebihan beban.

Persaingan


Panitia memberikan garis dasar dan sekaligus teka-teki utama kompetisi. Itu sesederhana tongkat: kami mengambil file audio, menghitung spektogram kapur , melatih MobileNetV2 dan menemukan diri kami berada di tempat ke-12 atau lebih rendah. Karena ini, banyak orang akan berpikir bahwa selusin orang berpartisipasi dalam kompetisi, tetapi ini tidak terjadi. Seluruh tahap pertama kompetisi, tim kami tidak bisa menembus garis dasar ini. Kode identik idealnya memberikan hasil yang jauh lebih buruk, dan setiap perbaikan (seperti mengganti dengan grid yang lebih berat dan prediksi OOF ) membantu, tetapi tidak membawanya lebih dekat ke garis dasar.

Dan kemudian hal yang tak terduga terjadi: sekitar seminggu sebelum akhir kompetisi ternyata implementasi penghitungan metrik penyelenggara berisi bug dan bergantung pada urutan prediksi. Sekitar waktu yang sama, ditemukan bahwa dalam wadah buruh pelabuhan panitia tidak ramah mematikan Internet, begitu banyak yang mengunduh sampel uji. Kemudian kontes dibekukan selama 4 hari, koreksi metrik, perbarui data, matikan Internet dan mulai lagi selama 2 minggu. Setelah menceritakan kembali, kami berada di posisi ke-7 dengan salah satu kiriman pertama kami. Ini berfungsi sebagai motivasi yang kuat untuk terus berpartisipasi dalam kompetisi.

Berbicara tentang model


Kami menggunakan grid konvolusi mirip resnet yang dilatih menggunakan spektrogram kapur.

  1. Total ada 5 blok, setelah setiap blok, kami melakukan pengawasan mendalam dan meningkatkan jumlah filter sebanyak satu setengah kali.
  2. Selama kompetisi, kami pindah dari klasifikasi biner ke klasifikasi multi-kelas agar lebih efisien menggunakan teknik mixup , di mana kami mencampur dua suara dan meringkas label kelas mereka. Selain itu, setelah transisi seperti itu, kami dapat secara artifisial meningkatkan probabilitas kelas spoof dengan mengalikannya dengan 1,3. Ini membantu kami, karena ada asumsi bahwa keseimbangan kelas dalam sampel uji mungkin berbeda dari yang pelatihan, dan dengan demikian kami meningkatkan kualitas model.
  3. Model lipat dilatih, dan prediksi beberapa model rata-rata.
  4. Teknik encoding frekuensi juga berguna. Intinya adalah: Konvolusi 2D invarian-posisi, dan dalam spektrogram nilai-nilai sepanjang sumbu vertikal memiliki makna fisik yang sangat berbeda, jadi kami ingin mentransfer informasi ini ke model. Untuk melakukan ini, kami menggabungkan spektrogram dan matriks, yang terdiri dari angka dalam segmen dari -1 hingga 1 dari bawah ke atas.

    Untuk kejelasan, saya akan memberikan kode:

    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) 
  5. Kami melatih semua ini, termasuk pada data berlabel pseudo dari sampel uji bocor pada tahap pertama.

Validasi


Sejak awal kompetisi, semua peserta tersiksa oleh pertanyaan: mengapa validasi lokal memberikan EER 0,01 dan lebih rendah, dan leaderboard 0,1 dan tidak terlalu berkorelasi? Kami memiliki 2 hipotesis: apakah ada duplikat dalam data, atau data pelatihan dikumpulkan pada satu set pembicara, dan menguji data pada yang lain.

Kebenaran ada di antara keduanya. Dalam data pelatihan, sekitar 5% dari data ternyata merupakan duplikat, dan ini hanya menghitung duplikat penuh dari hash (ngomong-ngomong, itu juga bisa berisi potongan tanaman yang berbeda dari file yang sama, tetapi itu tidak begitu mudah untuk diperiksa - itu sebabnya kami tidak melakukannya).

Untuk menguji hipotesis kedua, kami melatih kotak speaker-id, menerima embedding untuk masing-masing pembicara, mengelompokkannya dengan k-means, dan melipatnya bertingkat. Yaitu, kami melatih pembicara dari satu klaster, dan memperkirakan pembicara dari yang lain. Metode validasi ini sudah mulai berkorelasi dengan leaderboard, meskipun menunjukkan skor 3-4 kali lebih baik. Sebagai alternatif, kami mencoba memvalidasi hanya pada prediksi di mana model setidaknya sedikit tidak yakin, yaitu, perbedaan antara prediksi dan label kelas adalah> 10 ** - 4 (0,0001), tetapi skema seperti itu tidak membuahkan hasil.

Dan apa yang tidak berhasil?


Di Internet, menemukan ribuan jam bicara manusia sudah cukup. Selain itu, kompetisi serupa sudah diadakan beberapa tahun lalu. Oleh karena itu, sepertinya ide yang jelas untuk mengunduh banyak data (kami mengunduh ~ 300 GB) dan melatih penggolong ini. Dalam beberapa kasus, pelatihan tentang data semacam itu terbukti sedikit jika kami mengajar tentang data tambahan dan data kereta sebelum mencapai dataran tinggi, dan kemudian kami hanya melatih data pelatihan. Tetapi dengan skema ini, model bertemu dalam sekitar 2 hari, yang berarti 10 hari untuk semua lipatan. Karena itu, kami meninggalkan ide ini.

Selain itu, banyak peserta melihat korelasi antara panjang file dan kelas, korelasi ini tidak diperhatikan dalam sampel uji. Kisi-kisi gambar biasa seperti resnext, nasnet-mobile, mobileNetV3 tidak tampil dengan baik.

Kata penutup


Itu tidak mudah dan kadang-kadang aneh, tetapi kami masih mendapatkan pengalaman yang keren dan keluar di atas. Melalui trial and error, saya menyadari pendekatan mana yang cukup berhasil dan mana yang tidak terlalu bagus. Sekarang saya akan menggunakan wawasan ini bersama kami saat memproses suara. Saya bekerja keras untuk membawa AI percakapan ke tingkat yang tidak dapat dibedakan dari manusia, dan karena itu selalu mencari tugas dan chip yang menarik. Saya harap Anda juga belajar sesuatu yang baru.

Akhirnya, saya memposting kode kita .

Source: https://habr.com/ru/post/id475480/


All Articles