Bagaimana cara mendeteksi peluit, muncul dan suara lain dalam input audio langsung?

9

Saya sudah membaca banyak pertanyaan tentang SO, dan terus terang, masing-masing dari mereka tidak menjelaskan cara khusus untuk melakukannya. Ada yang bilang "do FFT" dan ada yang bilang "zero crossing" dll. Tapi saya hanya mengerti sejauh mana input audio digital terdiri dari array amplitudo untuk frekuensi tertentu dan well .. Tidak benar-benar tahu banyak di luar itu.

Sekarang saya tahu teorema Nyquist, frekuensi, amplitudo, seri Fourier dll, dan itu dari 2-3 tahun yang lalu ketika saya melakukan itu di program universitas saya dalam beberapa semester. Tapi saat itu kami benar-benar tidak banyak diajarkan penggunaan Fourier di dunia nyata, dan saya tidak repot-repot menggali lebih dalam tentang subjek di luar pembelajaran hanya cukup untuk melewati subjek. Tapi sekarang aku harus menggunakan semua itu.

Berikut cuplikan dari suara yang saya coba deteksi:

grafik unik bidik jari dan sakelar lampu on / off

Jelas suara memiliki grafik unik. Saya hanya ingin memahami cara mengekstrak karakteristik unik khusus mereka untuk garis runcing unik mereka dalam grafik. Seperti apa amplitudo, frekuensi, dll. Dan untuk berapa banyak waktu - meskipun itu sepele saya kira.

Saya ingin langkah demi langkah yang sederhana, daftar instruksi yang tidak jelas - Saya dapat menggunakan istilah yang tidak akan saya mengerti.

Seperti mungkin ini? -

  1. Dapatkan input data audio

  2. Plot spektogram

  3. Dapatkan grafik spektogram untuk suara yang ingin Anda deteksi di lingkungan yang tidak bersuara

  4. Pelajari grafik itu - gambarkan karakteristik unik dari suara itu

  5. Buat semacam fungsi yang dapat mendeteksi karakteristik khusus tersebut dalam umpan audio langsung, menggunakan karakteristik suara yang ditemukan di (4)

  6. Jika kecocokan ditemukan, baik - pekerjaan selesai.

  7. Polandia algoritma untuk menghilangkan negatif palsu.

ABXZ

Saya sedang berpikir untuk membuat pengguna merekam suara yang ingin mereka simpan sebagai gerakan di lingkungan yang tenang. Dan pengguna akan membuat suara hanya di antara padding waktu tenang ; 3 detik di awal dan di akhir rekaman.

Jadi katakanlah, selama 3 detik pertama, sistem saya akan menetapkan bahwa input saat ini adalah suara latar belakang normal yang tenang. Dan kemudian perubahan tiba-tiba pada grafik akan menjadi input suara yang dimulai. Dan ketika itu berhenti, rekaman akan berlangsung selama 3 detik, padding time trailing quiet . Ini akan dilakukan secara manual oleh pengguna. Maka secara otomatis akan menyimpan karakteristik hanya bagian yang selama perubahan tiba-tiba dalam grafik berlangsung - di suatu tempat di antara waktu padding.

Dan dengan demikian karakteristik dari bagian itu akan disimpan sebagai data isyarat suara itu, yang akan digunakan untuk mendeteksi suara itu dalam umpan audio langsung di kemudian hari.

Masalahnya, saya memikirkan semua ini dalam bahasa Inggris. Saya perlu berpikir dalam matematika dan fisika, untuk dapat mengimplementasikannya secara efisien dalam kode saya. Aku benar-benar tidak mengerti tentang apa yang harus ditulis dan di mana harus menuliskannya dalam kode saya - bahkan dengan begitu banyak perpustakaan dan pertanyaan tentang SO yang saya miliki.

Dan maaf jika ini lama.

bad_keypoints
sumber
1
Karena penasaran, apakah spektogram itu dibuat di ponsel atau tablet? jika demikian, dapatkah Anda memberi tahu nama aplikasi tersebut. Itu terlihat sangat keren. Berkenaan dengan pertanyaan Anda maka saya pikir aplikasi Anda mirip dengan topik / tugas melakukan pengenalan kata terisolasi. Anda mungkin bisa mendapatkan banyak ide dan inspirasi dari googling itu. Bagian yang sulit adalah tidak mengenali gerakan-gerakan dalam gerakan terbatas yang relatif kecil, bagian yang sulit adalah menyaring hal-hal yang bukan gerakan.
niaren
Ini adalah aplikasinya: play.google.com/store/apps/… Dan terima kasih atas sudut pandang Anda. Tapi saya ingin Anda memberi tahu saya cara mendeteksi bukan kata-kata, tetapi suara (setidaknya untuk saat ini), seperti bersiul, pop, bertepuk tangan, dll. Saya bekerja dengan Python.
bad_keypoints
1
Sayangnya hal semacam ini masih menjadi area penelitian. Saya tidak mengetahui ada orang yang memecahkan masalah khusus ini.
Bjorn Roche

Jawaban:

2

Sementara saya setuju dengan salah satu komentar bahwa menggunakan teknik pengenalan suara mungkin merupakan awal yang baik, suara-suara ini berbeda dan saya tidak mengetahui ada orang yang melakukan penelitian untuk mengkategorikan mereka (makalah yang dikutip oleh Nathan tampaknya hanya untuk membedakan antara ucapan dan kebisingan), jadi kecuali seseorang menghadirkan sesuatu yang bertentangan dengan itu, Anda harus menemukan teknik Anda sendiri, dan itu akan membutuhkan banyak pembelajaran dan banyak pekerjaan. Yang terbaik yang bisa saya lakukan adalah membantu Anda memulai.

Pertama, jangan berharap ada yang bisa menghasilkan formula ajaib. Tidak ada persamaan untuk mendapatkan dari suara ke apa suara itu. Manusia dan komputer harus belajar dengan memasukkan data untuk membuat tebakan cerdas tentang bunyi apa itu. Alasan orang mengatakan dalam jawaban mereka "use FFT" atau "use zero crossing" adalah karena ini adalah beberapa blok bangunan DSP dasar yang digunakan dalam pengenalan suara dan algoritma terkait. Tetapi FFT dan zero crossing rate biasanya hanya langkah pertama dalam menciptakan seperangkat parameter yang menggambarkan suara. Parameter-parameter ini kemudian dianalisis secara statistik (bukan melalui fungsi sulap) untuk menentukan kategori mana yang paling mungkin dimiliki. Perhatikan bahwa saya mengatakan "kemungkinan besar": bahkan deteksi ucapan terbaik (dan otak manusia!

Jadi, beberapa parameter yang bisa Anda cari termasuk:

  • tingkat zero-crossing
  • frekuensi centroid
  • amplop (ini sebenarnya satu set parameter, termasuk, misalnya waktu serangan)
  • amplop spektral
  • keseimbangan harmonik genap / ganjil
  • voiciness
  • nada dasar

Setelah Anda memiliki satu set parameter yang menurut Anda akan memungkinkan Anda untuk membedakan suara Anda, Anda perlu menggunakan beberapa metode statistik untuk mengategorikannya. Hidden Markov Model sering digunakan dalam pidato. Anda juga dapat melihat regresi logistik, K-means, dan saya yakin ada pilihan lain, tapi saya pikir HMM sudah dicoba dan benar.

Bjorn Roche
sumber
Jawaban Anda bagus, tetapi pada dasarnya saya meminta semacam pencocokan suara pengguna sendiri dengan suara yang ia buat nanti untuk menggunakan perangkat lunak saya. Seperti, kesamaan barang. Katakanlah pengguna membuat berbagai jenis suara A, B dan C. Dan karakteristik suara ini disimpan masing-masing sebagai C_A, C_B, dan C_C.
bad_keypoints
Tekniknya masih sama: 1. mencari tahu parameter apa yang akan Anda ukur, 2. mengukurnya, 3. menggunakan statistik untuk mempelajari apa yang membuat setiap suara berbeda, 4. menggunakan data itu untuk mengkategorikan.
Bjorn Roche
jadi pada dasarnya itulah yang saya pikirkan. tapi saya rasa saya harus melihat parameter mana dari daftar panjang yang Anda berikan saya harus menandai hingga suara jarak dengan.
bad_keypoints
1
Sejujurnya, saya sangat pesimis bisa membedakan hal-hal seperti jentikan jari dan lampu di berbagai lingkungan tanpa banyak data sampel dan mungkin lebih banyak parameter daripada yang saya berikan, tapi saya harap saya salah. Silakan laporkan kembali hasil Anda bahkan jika itu butuh waktu.
Bjorn Roche
Juga, beberapa orang di milis musik-dsp ( music.columbia.edu/cmc/music-dsp ) mungkin punya saran lain.
Bjorn Roche
0

Saya menggunakan makalah ini pada titik akhir berdasarkan entropi ketika saya mencoba untuk mengabaikan jenis-jenis suara dalam panggilan telepon, digunakan untuk pengenalan suara komputer, jika suara yang Anda coba untuk menangkap adalah pidato maka entropi dapat bekerja dengan sangat baik, untuk musik mungkin tidak berguna.

Nathan Day
sumber
0

Saya pikir rekomendasi Bjorn sangat bagus, tetapi saya ingin memberikan beberapa informasi tambahan. Dari uraian Anda, ini terdengar seperti masalah identifikasi timbre. Ada beberapa penelitian di bidang ini dalam konteks musik komputer (mengidentifikasi instrumen yang berbeda adalah hal yang berguna untuk dapat dilakukan dan mengatakan perbedaan antara jepret dan bertepuk tangan karena timbre suara). William Brenttelah melakukan beberapa penelitian di bidang ini (mencari timbreID di halamannya) dan membuat beberapa perangkat lunak untuk digunakan dalam Pure Data. Dalam setiap situasi yang Anda cari untuk peristiwa tertentu, melakukan segmentasi otomatis dengan deteksi serangan akan menjadi ide yang baik. Karena Anda sudah menggunakan STFT, menentukan onset tidak akan membutuhkan terlalu banyak pekerjaan tambahan (lihat deteksi onset Fluks Spektral). Garis besar sistem bisa seperti itu:

Latihan

  • Tentukan fitur yang sesuai (misalnya, zero-crossing rate, spektral centroid, MFCC's)
  • Deteksi permulaan
  • Hitung fitur-fitur ini pada audio input (rekaman gerakan Anda)
  • Menyimpan basis data penghitungan fitur. Anda perlu menentukan apakah ini adalah situasi pelatihan yang diawasi atau tidak diawasi. Misalnya, apakah pengguna menentukan sebelumnya bahwa snap adalah "sound 1" dan clap adalah "sound 2", atau apakah sistem Anda mencoba mengelompokkannya setelah pelatihan.

Klasifikasi

  • Mendeteksi serangan secara real-time dan menghitung fitur pada audio yang masuk
  • Gunakan metrik jarak (jarak euclidean atau jarak Lp lainnya) untuk melakukan tetangga terdekat atau klasifikasi tetangga-K terdekat untuk menentukan suara "terdekat" dari basis data Anda

Makalah ini tentang identifikasi timbre perkusi bisa berguna. Ini menguraikan definisi untuk fitur potensial untuk menghitung pada suara yang masuk dan metode klasifikasi penulis. Ini akan bekerja cukup baik untuk bunyi perkusi, tetapi mungkin tidak berfungsi dengan baik untuk sesuatu seperti ucapan (beberapa suku kata), dalam hal ini metode HMM akan lebih cocok. Demikian pula, akurasi deteksi serangan Anda akan bervariasi tergantung pada jenis suara yang Anda cari.

Jika Anda sangat khawatir tentang bidik vs. sakelar lampu, maka luangkan waktu untuk mencari tahu fitur mana yang secara akurat dapat membedakan antara dua suara.

hebat
sumber
Saya akan mendeteksi serangan dengan mendeteksi perubahan mendadak pada data audio yang masuk. Itu seharusnya bekerja. Saya akan mendeteksi awal dan akhir gerakan untuk disimpan.
bad_keypoints
Ya itu seharusnya berhasil. Satu-satunya alasan saya menyarankan Spectral Flux, adalah karena Anda akan mengambil STFT. Jika Anda mengharapkan lingkungan yang cukup sunyi, maka ambang batas amplitudo dasar harus bekerja dengan cukup baik.
greatscott