Canlı ses girişindeki ıslıkları, sesleri ve diğer sesleri nasıl tespit edebilirim?


9

SO hakkında birçok soru okudum ve açıkçası, her biri bu konu hakkında herhangi bir yol tarif etmiyor. Bazıları "FFT yapın" ve bazıları "sıfır geçiş" diyorlar. Ama sadece dijital ses girişinin belirli bir frekans ve iyi için bir dizi genlikten oluştuğunu anladım. ötesinde.

Şimdi Nyquist teoremini, frekansını, genliğini, Fourier serisini vb. Biliyorum ve bunu 2-3 yıl öncesine kadar bir dönem üniversite programımda yaptım. Ama o zamanlar gerçekten Fourier'in gerçek dünya kullanımını öğretmedik ve konuyu geçebilecek kadar öğrenmenin ötesinde konuyla ilgili daha fazla kazma zahmetine girmedim. Ama şimdi tüm bunları kullanmam gerekecek.

İşte tespit etmeye çalıştığım seslerin bir anlık görüntüsü:

parmak enstantane ve ışık anahtarı benzersiz grafik açma / kapama

Açıkçası seslerin benzersiz grafikleri var. Sadece grafikteki benzersiz sivri çizgileri için özel karakteristiklerini nasıl elde edeceğimizi anlamak istiyorum. Ne genlik, frekans, vb. Ve ne kadar zaman için - sanırım bu önemsiz olsa da.

Basit, adım adım anlaşılır bir talimat listesi istiyorum.

Belki böyle mi? -

  1. Giriş ses verilerini alma

  2. Çizim spektogramı

  3. Gürültüsüz bir ortamda tespit etmek istediğiniz ses için spektogram grafiği edinin

  4. Bu grafiği inceleyin - o sesin benzersiz özelliklerini çizin

  5. (4) 'de bulunan sesin özelliklerini kullanarak canlı ses beslemesindeki bu belirli özellikleri algılayabilen bir tür işlev yapın

  6. Bir eşleşme bulunursa, iş bitti.

  7. Yanlış negatifleri ayıklamak için algoritmayı cilalayın.

Kafam karıştı - nasıl 3,4,5 hakkında giderim. Özellikle 3 ve 4. Kullanıcının daha sonra kullanmak üzere bir jest girişi olarak herhangi bir sesi kaydedebileceği bir yazılım ürettiğim için, sistemimin herhangi bir ses kaydedebilmesini ve canlı sese karşı eşleştirebilmesini istiyorum ses hareketini algılamak için besleyin. Mesela öksürme veya parmak yakalama, ıslık çalma veya alkışlama. Ya sessiz harfleri söyleyerek - ya ya da veya . Hemen hemen her ses.birBXZ

Kullanıcının, saklamak istedikleri sesi sessiz bir ortamda bir jest olarak kaydetmesini düşünüyordum. Ve kullanıcı sadece sessiz zaman dolgusu arasında ses çıkarırdı ; Kaydın başında ve sonunda 3 saniye.

Diyelim ki, ilk 3 saniye boyunca, sistemim mevcut girişin normal sessiz arka plan sesi olduğunu belirleyecektir. Ve sonra grafikteki ani bir değişiklik ses girişi başlangıcı olacaktır. Ve bu durduğunda, kayıt 3 saniye daha devam eder, arkadaki sessiz zaman dolgusu . Bu kullanıcı tarafından manuel olarak yapılacaktır. Daha sonra otomatik olarak sadece grafikteki ani değişimin sürdüğü parçanın özelliklerini - dolgu süreleri arasında bir yerde saklar.

Ve böylece o parçanın özellikleri, daha sonra canlı ses beslemesinde o sesi tespit etmek için kullanılacak sesin hareket verileri olarak kaydedilecektir.

Sorun şu ki, tüm bunları basit İngilizce olarak düşünüyorum. Kodumda verimli bir şekilde uygulayabilmek için matematik ve fizikte düşünmem gerekiyor. Ne yazacağım ve kodumda nereye yazacağım konusunda çok bilgim yok - elimdeki SO hakkında birçok kütüphane ve soru bile.

Ve eğer bu uzun olsaydı özür dilerim.


1
Meraktan, bu spektrogram bir telefon veya tablet üzerinde mi yapılmış? öyleyse, uygulamanın adını söyleyebilir misiniz? Gerçekten harika görünüyor. Sorunuzla ilgili olarak, başvurunuzun izole kelime tanıma yapma konusuna / görevine benzer olduğunu düşünüyorum. Bunu googling'den muhtemelen birçok fikir ve ilham alabilirsiniz. Zor kısım, sınırlı göreceli küçük bir hareket kümesindeki hareketleri tanımak değil, zor kısım ise, hareket olmayan şeyleri filtrelemektir.
niaren

Bu uygulama: play.google.com/store/apps/… Ve görüşleriniz için teşekkürler. Ama bana kelimeleri değil, ıslık, pop, alkışlar gibi sesleri (şu an için en az) nasıl algılayacağımı söylemenizi istiyorum. Python'da çalışıyorum.
bad_keypoints

1
Ne yazık ki bu tür bir şey hala bir araştırma alanı. Bu sorunu çözen kimsenin farkında değilim.
Bjorn Roche

Yanıtlar:


2

Konuşma tanıma tekniklerini kullanmanın iyi bir başlangıç ​​olabileceğine dair yorumlardan birine katılıyorum, ancak bu sesler farklı ve onları kategorize etmek için herhangi bir araştırma yapan kimsenin farkında değilim (Nathan'ın alıntı yaptığı yazı sadece konuşmayı ayırt ediyor gibi görünüyor) ve gürültü), bu yüzden birisi bununla çelişecek bir şey sunmadığı sürece, kendi tekniğinizi icat etmeniz gerekecek ve bu çok fazla öğrenme ve çok çalışma gerektirecek. Yapabileceğim en iyi şey başlamak için.

Öncelikle, kimsenin sihirli bir formül üretmesini beklemeyin. Sesten sesin ne olduğuna dair bir denklem yoktur. İnsanlar ve bilgisayarlar, seslerin ne olduğu hakkında eğitimli tahminler yapmak için verileri birleştirerek öğrenmelidir. İnsanların cevaplarında “FFT kullan” veya “sıfır geçiş kullan” demelerinin nedeni, bunların konuşma tanıma ve ilgili algoritmalarda kullanılan temel DSP yapı taşlarından bazıları olmasıdır. Ancak FFT ve sıfır geçiş hızı, sesi tanımlayan bir dizi parametre oluşturmak için genellikle sadece ilk adımlardır. Bu parametreler daha sonra hangi kategoriye ait olduklarını belirlemek için istatistiksel olarak analiz edilir (bazı sihirli işlevlerle değil). "Büyük olasılıkla" dediğime dikkat edin: en iyi konuşma tespiti (ve insan beyni!)

Bu nedenle, arayabileceğiniz bazı parametreler şunları içerir:

  • sıfır geçiş oranı
  • frekans merkezi
  • zarf (bu aslında saldırı süresi dahil bir dizi parametredir)
  • spektral zarf
  • çift ​​/ tek harmonik denge
  • voiciness
  • temel adım

Seslerinizi ayırt etmenizi sağlayacağını düşündüğünüz bir dizi parametreye sahip olduğunuzda, bunları kategorilere ayırmak için bazı istatistiksel yöntemler kullanmanız gerekecektir. Gizli Markov Modeli genellikle konuşmada kullanılır. Ayrıca lojistik regresyona da bakabilirsiniz, K-araçları ve eminim başka seçenekler de var, ama bence HMM denenmiş ve doğru.


Cevabınız iyi, ancak temelde kullanıcının kendi seslerini daha sonra yazılımımı kullanmak için çıkardığı seslerle eşleştirmesini istiyorum. Benzerlik gibi şeyler. Bir kullanıcının farklı ses türleri A, B ve C yaptığını ve bu seslerin karakteristiklerinin sırasıyla C_A, C_B ve C_C olarak saklandığını varsayalım.
bad_keypoints

Teknik hala aynı: 1. hangi parametreleri ölçeceğinizi anlayın, 2. ölçün, 3. her sesi neyin farklı kıldığını öğrenmek için istatistikleri kullanın, 4. bu verileri kategorilere ayırmak için kullanın.
Bjorn Roche

temelde böyle düşündüm. ama sanırım iyi uzun listeden hangi parametrelerin sesleri ayırt etmek için işaretlemem gerektiğini görmek zorundayım.
bad_keypoints

1
Dürüst olmak gerekirse, çok fazla örnek veri ve belki de verdiğimden daha fazla parametre olmadan çeşitli ortamlarda parmak yakalama ve ışık anahtarı gibi şeyleri ayırt edebilmek konusunda çok kötümserim ama umarım yanılıyorum. Lütfen biraz zaman alsa bile sonuçlarınızı rapor edin.
Bjorn Roche

Ayrıca, music-dsp posta listesindeki bazı kişilerin ( music.columbia.edu/cmc/music-dsp ) başka önerileri olabilir.
Bjorn Roche

0

Bu yazıyı , telefon konuşmalarında bu tür sesleri görmezden gelmeye çalıştığımda, bilgisayar konuşma tanıma için kullanılan entropi tabanlı uç işaretinde kullandım, yakalamaya çalıştığınız sesler konuşma ise, entropi gerçekten işe yarayabilir, müzik için yararlı değil.


0

Bence Bjorn'un önerileri çok iyi, ama bazı ek bilgiler vermek istiyorum. Açıklamanızdan, bu bir tını tanımlama problemine çok benziyor. Bilgisayar müziği bağlamında bu alanda bazı araştırmalar var (farklı enstrümanları tanımlamak yararlı bir şeydir ve bir çırpma ve alkış arasındaki farkı söylemek sesin tınısıdır). William Brentbu alanda biraz araştırma yaptı (sayfasında timbreID'yi arayın) ve Pure Data'da kullanmak için bazı yazılımlar yarattı. Belirli olayları aradığınız her durumda, bu nedenle başlangıç ​​tespiti ile bazı otomatik segmentasyon yapmak iyi bir fikir olacaktır. Zaten bir STFT aldığınız için, bir başlangıç ​​belirlemek çok fazla ek çalışma gerektirmez (Spectral Flux başlangıç ​​tespitine bakın). Bir sistem taslağı şöyle olabilir:

Eğitim

  • Uygun özellikleri belirleyin (örn. Sıfır geçiş hızı, spektral centroid, MFCC'ler)
  • Bir başlangıç ​​algıla
  • Giriş sesinde (hareket kayıtlarınızda) bu özellikleri hesaplayın
  • Özellik hesaplamaları için bir veritabanı tutun. Bunun denetimli veya denetimsiz bir eğitim durumu olup olmadığını belirlemeniz gerekir. Örneğin, kullanıcılar önceden bir çıtçıtın "ses 1" ve bir alkış "ses 2" olduğunu belirtiyorlar mı veya sisteminiz eğitimden sonra bunları kümelemeye çalışıyor mu?

sınıflandırma

  • Bir başlangıcı gerçek zamanlı olarak algılama ve gelen sesin özelliklerini hesaplama
  • Veritabanınızdan "en yakın" sesi belirlemek için en yakın komşu veya K en yakın komşu sınıflandırmasını yapmak için bir mesafe metriği (öklid mesafesi veya başka bir Lp mesafesi) kullanın

Vurmalı tını tanımlaması ile ilgili bu makale bazı yararlı olabilir. Gelen ses üzerinde hesaplanacak potansiyel özelliklerin tanımlarını ve yazarın sınıflandırma yöntemini özetlemektedir. Bu, vurmalı sesler için oldukça iyi çalışacaktır, ancak konuşma (çoklu heceler) gibi bir şey için de işe yaramayabilir, bu durumda bir HMM yöntemi daha uygun olacaktır. Benzer şekilde, başlangıç ​​algılamanızın doğruluğu aradığınız ses türlerine göre değişir.

Özellikle enstantane ve ışık anahtarları konusunda endişeleriniz varsa, hangi özelliklerin iki ses arasında doğru bir şekilde ayrım yapabileceğini bulmak için biraz zaman ayırın.


Gelen ses verilerindeki ani değişiklikleri tespit ederek başlangıcı tespit ederim. Bu işe yaramalı. Saklanacak hareketlerin başlangıcını ve bitişini tespit etmeye başladım.
bad_keypoints

Evet, bu çoğunlukla işe yarar. Spectral Flux'u önermemin tek nedeni, yine de bir STFT alacağınızdır. Oldukça sessiz bir ortam bekliyorsanız, temel bir genlik eşiği yeterince iyi çalışmalıdır.
greatscott
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.