Identifikasi Tempat Bernyanyi Dimulai dengan Rekaman Suara Saja

14

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?

Mike Hogan
sumber
Jawaban saya mungkin membantu Anda - dsp.stackexchange.com/a/1543/440
Dipan Mehta
Dalam beberapa rekaman, suara adalah satu-satunya instrumen yang dimainkan dengan amplitudo yang sama di kedua saluran. Anda dapat menggunakan informasi ini untuk mengekstrak suara dari rekaman stereo.
Jader Dias

Jawaban:

4

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)

endolit
sumber
Endolith, dalam pengalaman Anda, apakah itu membuat perbedaan besar jika Anda mengambil besarnya kuadrat VS hanya besarnya sebelum Anda mengukur kerataan spektral?
Spacey
@Mohammad: Saya tidak punya pengalaman dengan itu. :) Saya mengajukan pertanyaan sebelumnya karena saya tidak mengerti spesifikasi, dan saya masih tidak yakin jalan mana yang benar. Saya tidak berpikir kuadrat membuat perbedaan praktis, meskipun. Jika Anda hanya memicu ketika melewati ambang, itu harus bereaksi secara identik apakah kuadrat atau tidak (dengan asumsi Anda menyesuaikan ambang untuk mencocokkan), sehingga besarnya saja secara komputasi lebih murah secara komputasi.
endolith
@ Endolith, ini agak sulit: apakah Anda tahu cara menerapkan pendekatan ini di matlab? Saya ingin menguji semua pendekatan yang disebutkan di sini di matlab (sebenarnya oktaf) untuk melihat mana yang terbaik?
Mike Hogan
@MikeHogan: Tidak, saya sudah lama tidak menggunakan matlab. : / Juga itu akan membutuhkan melakukan pekerjaan nyata. :) Saya tidak punya apa pun yang ditulis sebelumnya. Pisahkan sinyal menjadi potongan-potongan kecil, lakukan FFT masing-masing, dan untuk masing-masing FFT, bagi rata-rata geometrik dari besarnya dengan rata-rata aritmatika dari besarnya. angka yang lebih tinggi berisik, angka yang lebih rendah adalah nada.
endolith
3

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.

Spacey
sumber
Mohammad, apa yang Anda maksud dengan "baris"?
Mike Hogan
@MikeHogan Silakan lihat hasil edit saya, saya menulis ulang jawabannya.
Spacey
Akankah ini tidak menemukan onset apa pun? Tabuhan drum atau kebisingan impulsif lainnya juga akan terdeteksi. Itu tidak membedakan antara suara nada dan suara bising.
endolith
@ endolith Anda mendapatkan poin yang bagus - namun saya percaya ini mungkin masih berfungsi. Alasan saya adalah bahwa dalam skenario ini, Anda berada dalam kondisi suara + musik, atau hanya dalam keadaan musik. Jadi saat menghitung fluks spektral, Anda benar-benar hanya menghitung delta antara suara + musik dan hanya musik. (Tentu saja saya perlu menganalisanya lebih banyak tetapi itulah bagaimana saya memikirkannya sekarang) :-P
Spacey
1
@endolith Saya baru saja membaca ulang dan OP mengatakan hanya ada suara, (tampaknya ini adalah aplikasi sederhana), jadi dalam hal ini hanya akan menjadi suara VS tidak ada.
Spacey
2

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.

endolit
sumber
@endolith, tautan itu benar-benar di luar jangkauan saya! Apakah Anda mengetahui penerapan open source yang dapat saya lihat, atau resep langkah demi langkah lebih lanjut tentang cara kerjanya?
Mike Hogan
2

" 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.

Daniel R Hicks
sumber
2

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.

hotpaw2
sumber