Saya memiliki aplikasi bergaya karaoke kecil di mana pengguna menyanyikan 4 baris lagu, dengan jarak satu detik di antara setiap baris. Tidak ada backing musik, jadi itu hanya suara, mudah-mudahan membuat masalah lebih mudah untuk dipecahkan.
Saya mencari cara yang paling kuat untuk mendeteksi dengan tepat di mana dalam rekaman saya pengguna mulai dan berakhir menyanyikan baris 1, mulai dan berakhir menyanyikan baris 2, dll.
Saya telah menyusun sebuah algoritma sederhana yang bekerja ketika ada sedikit kebisingan latar belakang dalam rekaman (seperti kapan hal itu terjadi?), Tetapi jatuh berkeping-keping di hadapan suara terkecil.
Adakah yang bisa mengarahkan saya ke sesuatu yang lebih kuat?
audio
signal-detection
Mike Hogan
sumber
sumber
Jawaban:
Jika kebisingan latar belakang putih-ish, Anda bisa mengukur kerataan spektral dan menganggapnya sebagai suara ketika amplitudo berada di atas ambang batas dan kerataan spektral di bawah ambang batas.
Pada dasarnya Anda hanya mengambil FFT sepotong sinyal, kemudian membagi rata-rata geometrik dari besarnya spektrum dengan rata-rata aritmatika.
Anda juga bisa menggunakan band-pass filter untuk menekankan hanya daerah frekuensi di mana suara manusia biasanya duduk (sesederhana mengatur daerah yang tidak diinginkan dari FFT ke 0 sebelum mengukur kerataan spektral)
sumber
Saya telah menggunakan spektral-fluks di masa lalu dan tampaknya berfungsi dengan baik. Ide dasarnya adalah, buat spektrogram sinyal Anda, melintasi pita-pita yang Anda pedulikan. Mari kita asumsikan frekuensi Anda berada pada sumbu y, dan waktu Anda pada sumbu x, seperti itu .
Ini berarti spektogram Anda adalah sebuah matriks. Setiap kolom mewakili nilai absolut FFT dari satu snap-shot dalam waktu sinyal Anda, dan setiap baris mewakili bagaimana energi dari satu band berubah dari waktu ke waktu.
Sekarang, cukup ambil perbedaan kolom. Yaitu, ambil satu kolom, dan kurangi sendiri dari kolom sebelumnya, dan lakukan untuk semua kolom. (Meninggalkan kolom awal saja jelas). Kemudian jumlah semua band. Artinya, jumlahkan semua baris bersama.
Anda akan berakhir dengan sinyal 1-D yang codifies sinyal onsets . Ini akan memberi tahu Anda di mana suara Anda dimulai.
EDIT:
Sekarang setelah Anda mendeteksi onsets, jika Anda ingin mendeteksi yang sebaliknya, (yaitu, ketika sinyal berubah dari aktivitas menjadi tidak ada), fluks spektral sebenarnya memberi Anda informasi itu. Di mana pun Anda memiliki permulaan, Anda akan memiliki puncak positif, dan di mana pun Anda memiliki 'deset' (karena tidak ada kata yang lebih baik), Anda akan memiliki puncak negatif.
Saya hanya akan mengambil puncak positif pertama, dan puncak negatif terakhir, untuk menandai total waktu mulai dan berhenti sinyal saya.
sumber
Dari pengalaman saya, saya akan mencoba melihat Mel-Frekuensi-Cepstrum-Koefisien (MFCC) . MFCC cukup mudah diimplementasikan jika Anda memiliki FFT yang tersedia dan digunakan cukup umum dalam pemrosesan suara.
Dengan MFCC, Anda harus dapat membedakan data suara aktual dari kebisingan.
sumber
" Fluks spektral " (juga disebut sebagai "perbedaan spektral") adalah metode umum untuk "deteksi serangan". Pada dasarnya Anda mengambil FFT berurutan dari sinyal dan menjumlahkan besarnya perbedaan ember FFT dari satu sampel ke yang berikutnya. "Onset" umumnya akan diwakili oleh "lompatan" substansial dalam nilai ini.
Google "deteksi awal" untuk ide-ide lain.
sumber
Menggunakan fluks spektral saja dapat menghasilkan positif palsu untuk suara-suara tertentu serta mendeteksi suara bernyanyi.
Bernyanyi biasanya menyiratkan konten sinyal yang mengandung nada, sehingga Anda dapat menggunakan detektor nada atau penaksir (cepstrum, dll.). Anda dapat memeriksa fraksi energi yang terdeteksi sebagai nada versus total energi sinyal, dan bahwa nada yang diperkirakan berada dalam rentang suara manusia. Itu akan mengurangi tingkat positif palsu untuk kebisingan yang tidak dipancarkan serta suara musik di luar kisaran vokal normal.
sumber