Ses zarflarının nerede başladığını ve durduğunu tespit etmenin en basit yolu


43

Aşağıda konuşan birinin kaydını gösteren bir sinyal var. Buna dayanarak bir dizi daha küçük ses sinyali oluşturmak istiyorum. 'Önemli' sesin ne zaman başladığını ve bittiğini saptamak ve yeni ses parçacığını yapmak için bunları işaretçiler için kullanmak fikri. Başka bir deyişle, sessizliği bir ses chunk'unun ne zaman başladığına veya durduğuna ve buna dayanarak yeni ses tamponları oluşturduğuna dair göstergeler olarak kullanmak istiyorum.

Mesela, eğer bir kişi kendini söyleyerek kaydederse

Hi [some silence] My name is Bob [some silence] How are you?

bundan sonra üç ses klibi yapmak istiyorum. Biri diyor Hi, biri diyor My name is Bobdiğeri diyor How are you?.

Benim ilk fikrim, düşük genlikli alanların nerede olduğunu kontrol etmek için sürekli olarak ses tamponundan geçmek. Belki bunu ilk on örneği alarak yapabilirim, değerleri ortaladım ve sonuç düşükse o zaman sessiz olarak etiketleyin. Sonraki on örneği kontrol ederek arabellek aşağı ilerlerdim. Bu şekilde artarak zarfların nerede başladığını ve nerede durduğunu tespit edebildim.

Herhangi birisinin iyi, ancak basit bir şekilde yapması için herhangi bir tavsiyesi varsa, bu harika olurdu. Benim amacıyla çözüm olabilir oldukça ilkel olması.

DSP'de profesyonel değilim, ancak bazı temel kavramları anlıyorum. Ayrıca, bunu programlı olarak yapıyor olurdum, böylece algoritmalar ve dijital örnekler hakkında konuşmak en iyisi olacaktı.

Tüm yardımların için teşekkürler!

görüntü tanımını buraya girin


1 EDIT

Şimdiye kadar büyük tepkiler! Bunun canlı yayında olmadığını açıklamak istedim ve algoritmaları kendim C veya Objective-C olarak yazacağım, böylece kütüphaneleri kullanan herhangi bir çözüm gerçekten bir seçenek olamaz.


1
Sessizlik dönemleri kırılma noktası olarak kullanarak onu parçalamaya çalışıyorsunuz gibi geliyor. Neden sadece "sessizliği" belirlemek için güç eşiğini kullanmıyor ve bir mola verecek kadar uzun olup olmadığını belirlemek için eşik zamanına sahip değilsiniz?
Jim Clay,

@JimClay Evet, tam olarak bunu yapmaya çalışıyorum. Güç eşiğini hiç duymadım ama kullanabileceğim bir şeye benziyor. Karmaşık mı? Bunu biraz genişletir misiniz?
Eric Brotto

@EricBrotto Belki bize kütüphanelerinizde hangi yeteneklere sahip olduğunuzu biraz anlatmalısınız. Bu, sizin için gerçek metodolojiyi daha iyi masaj etmemizi sağlayacaktır.
Spacey

sessizlik tespiti için bu yaklaşım daha iyidir ?? 0.05 x = wavread ('s1.wav') dışındaki seviyenin ne olması gerektiği; i = 1; abs iken (x (i)) <% 0.05 Sessizlik algılama i = i + 1; son x (1: i) = []; x (6000: 10000) = 0;
zeee

Yanıtlar:


26

Bu klasik konuşma saptama problemidir . Yapılacak ilk şey, Google’ın konsepti olacaktır. Dijital iletişimde yaygın olarak kullanılmaktadır ve konuyla ilgili birçok araştırma yapılmıştır ve orada iyi makaleler vardır.

Genel olarak, uğraşmanız gereken arka plan gürültüsü ne kadar ayrıntılı olursa, konuşma algılama yönteminiz o kadar ayrıntılı olmalıdır. Sakin bir odada çekilmiş kayıtları kullanıyorsanız, bunu çok daha kolay bir şekilde yapabilirsiniz (daha sonra). Birisi konuşurken her türlü gürültünüz varsa (kamyonlar geçiyor, köpekler havlıyor, plakalar kırılıyor, uzaylılar saldırıyor), çok daha akıllıca bir şeyler kullanmak zorunda kalacaksınız.

Yaptığınız dalga biçimine bakıldığında, gürültünüz minimumdur, bu yüzden aşağıdakileri öneririm:

  1. Sinyal zarfını çıkart
  2. İyi bir eşik seçin
  3. Zarf büyüklüğünün eşiği aştığı yerleri algılama

Tüm bunlar ne anlama geliyor? Bir sinyalin zarfı , frekans içeriğinin salınım yapış şeklinden bağımsız olarak, zaman içindeki büyüklüğünü tanımlayan bir eğridir (aşağıdaki resme bakın).

görüntü tanımını buraya girin

Zarf çıkarma, orijinal sinyalinizin mutlak değerlerini içeren yeni bir sinyal oluşturarak yapılabilir, örneğin, , ve ardından sonucu filtreleyen düşük geçişli . En basit düşük geçişli filtre, her bir numune değerini her iki taraftaki ortalama N komşusu ile değiştirerek uygulanabilir . En iyi N değeri deneysel olarak bulunabilir ve örnekleme oranınız gibi birkaç şeye bağlı olabilir.{1,45,6,2,43,2}{1,45,6,2,43,2}

Çok fazla gürültü yapmadığınız görüntüden görebilirsiniz, sinyal zarfınız her zaman belirli bir eşiğin (yükseklik seviyesinin) üzerinde olacak ve bu bölgeleri konuşma tespit bölgeleri olarak düşünebilirsiniz .


3
Bunu gerçekten iyi'ol winamp'ındaki eklentilerden biri olarak uygulamıştım. Tarif ettiğiniz şey iyi ama yeterli değil. Genellikle sesli ses (ünlüler) ve sesli olmayan sesler (konsollar) vardır. Eğer sadece sesli ses varsa, anlattığınız şey işe yarayacaktır - ama sesli olmayan ses çok düşük enerjidir ve genel gürültüden ayırt edilemez. Ve gürültü çıkmayan koşullar da stüdyolarda bile çok nadir görülür.
Dipan Mehta,

Bu python içinde nasıl elde edilir?
kRazzy R

26

Gerçekten yapmak istediğiniz şey, esas olarak Sesli Etkinlik Algılama veya konuşma algılama olarak adlandırılır .

Temel olarak herhangi bir saf konuşma sinyalinin (müzik içermeyen) üç bölümü vardır.

  1. Sesli ses - temelde Vowels kaynaklı
  2. Seslendirilmemiş ses - ünsüzleri içerir.

İnsan sesinin özelliği, ses tonunda çok fazla enerji kullanılmasına rağmen gerçek bilginin ünsüzlerde yer almasıdır. Ayrıca, sesli ses genellikle sesli olmayan seslerin daha yüksek frekanslar olduğu yerlerde daha düşük bir frekanstır. [Kesin olmak gerekirse, sesin tamamı, sesi olan belirli bir kişi için az ya da çok sabit bir frekansa rezonansa alınır].

Şimdi, herhangi bir sistemde gürültü var. Seslendirilen ses, genellikle ayırt edilebilecek kadar kuvvetlidir. Ancak, daha düşük bir frekans filtrelemesi uyguladığınızda, sesli seslerin büyük bir bölümünü toplamak mümkündür, ancak seslendirilmemiş ses (tüm zengin bilgilerle birlikte) kaybolur.

Nasıl çözüleceği sorusuna geliyoruz:

İşin püf noktası, açık olmayan sesin hala bir rezonans kaynağından geldiği gerçeğinde yatmaktadır; ve doğası gereği belirli bir frekansta sınırlı. Gibi, gürültü oldukça tekdüze. Bu yüzden, üçünü de ayıran basit bir önlem "yerel güç" ya da alternatif olarak ancak eşdeğerdir, pencereli otomatik korelasyonu almaktır.

Bir anda alırsanız 100 örnek söylerseniz - ve kendini otomatik olarak ilişkilendirirseniz, sadece gürültü içeriyorsa, sonuçlar konuşma sırasındaki gibi oldukça sıfır olacaktır (bu beyaz gürültüsünün özelliğidir), çünkü bu büyüklük gözlemlenebilir çünkü sinyal hala daha iyi bir yapıya sahip. Bu geçmişte benim için çalıştı.

VAD aktif bir araştırma alanı olmuştur - çünkü neredeyse tüm Cep telefonu iletişimleri konuşma dışı kısmı tespit etmek ve kodlamaktan çıkarmak ister. Fakat eğer sesli olmayan konuşmaları sileceklerse, bu telefonun işe yaramaz olmasını sağlar.

G.729 standardı VAD'yi aşağıdaki gibi özelliklere dayanarak hesaplar: çizgi spektral frekansları, tam bant enerjisi, düşük bant enerjisi (<1 kHz) ve sıfır geçiş hızı.

GSM standardı şu şekilde çalışır: Seçenek 1, SNR'yi dokuz bantta hesaplar ve bu değerlere bir eşik uygular. Seçenek 2 farklı parametreleri hesaplar: kanal gücü, ses ölçümleri ve gürültü gücü. Daha sonra, tahmini SNR'ye göre değişen bir eşik kullanarak ses ölçümlerini eşitler. (wikipedia'dan)

Daha ileri teknikler için bu konuda bazı referanslar listeliyorum.

  1. En çok kullanılan referans: Jongseo Sohn; Nam Soo Kim; Wonyong Sung; "İstatistiksel bir model tabanlı ses etkinliği algılama" Sinyal İşleme Mektupları, IEEE, Oca 1999, Cilt: 6 Sayı: 1 s: 1-3

  2. Sizin için en uygun olanı : Mark Marzinzik ve Birger Kollmeier "Güç Zarfı Dinamiklerini İzleyerek Gürültü Spektrum Tahmini için Konuşma Duraklatma Tespiti" KONUŞMA VE SES İŞLEME, VOL ÜZERİNDE IEEE İŞLEMLERİ. 10, NO. 2, ŞUBAT 2002, s.109

  3. Ramírez, J.; JM Górriz, JC Segura (2007). "Sesli Etkinlik Tespiti. Temelleri ve Konuşma Tanıma Sistemi Sağlamlığı". M. Grimm ve K. Kroschel'de. Sağlam Konuşma Tanıma ve Anlama. sayfa 1-22. ISBN 978-3-902613-08-0.

  4. Giriş: Jonathan Kola, Carol Espy-Wilson ve Tarun Pruthi "Sesli Etkinlik Tespiti"


Bu python içinde nasıl elde edilir?
kRazzy R

9

Yaklaşırken Jim Clay'i ikinci olarak seçerdim, ama tadı zarfı kullanarak biraz değiştirdim:

Konuşmanın çoğunlukla 1-2kHz civarında gerçekleştiğini biliyoruz. Veri örneklemeniz 44kHz olabilir (bu, kayıt cihazınıza bağlıdır). İlk önce yapacağım şey, sinyal gücünün bir zarfına sahip olmak için 10 nokta boyunca gerçek zamanlı olarak kare sinyalin hareketli bir ortalamasıdır. Bu, algılamada bir gecikmeye neden olur, bu yüzden bunu düşük tutmak istersiniz.

Sonra sisteminize bir kalibrasyon aşaması eklerdim: kullanıcıdan sessiz kalmasını, bir düğmeye basmasını ve 10 saniye boyunca diyelim ki arka plan gürültüsünü kaydetmesini isteyin. Zarfın ortalamasını ya da ortanca genliğini alın, güvenliğiniz için 2 ile çarpın; bu size Jim'nin bahsettiği eşiği otomatik olarak verir.

Gerçek zamanlı kayıt değilse, gecikmeden kaynaklanan sıkıntıyı azaltmak için 0 fazlı hareketli ortalama kullanmak yararlı olabilir. Bize senin için işe yarayıp yaramadığını söyle.


9

Eric

Eğer gerçekten hızlı ve kirli bir şeyin peşindeyseniz, almanız gereken ilk şey zarf, ve bunu basitçe (MATLAB'da) yaparak yapardım:

 envelope = abs(hilbert(yourSignal));

Bu noktada, basitçe eşik olurdum ve belirli bir eşiğin üstünde olursanız 'ses var'.

Bu çok basit bir çözüm btw, ama sizin için işe yarayabilir.


1
+1. Belki de bu kod satırının arkasındaki yöntemi inceleyebilirsiniz? OP'nin Hilbert Dönüşümü üzerinden zarf çıkartma ile aşina olmadığından eminim.
Phonon

@Mohammad Teşekkürler! Ama lütfen EDIT
1'ime

@EricBrotto Ah tamam, size bir hilbert transformatörünün nasıl uygulanacağını söyleyebilirim, ancak C / Obj-C kütüphanelerinizde FFT yapma yeteneğine sahip olduğunuzu farz ediyorum?
Olmazsa

Bu python içinde nasıl elde edilir?
kRazzy R

Nazım Efendim / Hanımefendi, bu hilbert’in Python’da nasıl uygulanacağına dair bana kaynak gösterebilir misiniz?
kRazzy R

6

Gerçek, karmaşık sinyallerle uğraştığınızı farz ediyorum - eğer böyle değilse, bana bildirin ve cevabı değiştirebilirim.

Güç, sinyalin karesi olarak tanımlanır (yani sinyal örnekleri kendileri ile çarpılır). Konuşma olup olmadığını belirlemek için gücü bazı eşiklerle karşılaştırabilirsiniz. Muhtemelen ampirik olarak iyi bir eşik bulmak için kayıtlarınız üzerinde bazı ölçümler yapmanız gerekecektir.

Kayıtlarınız "temiz" ise (yani çok fazla gürültü yoksa), anlık gücü (yani tek bir örnek) eşik ile karşılaştırarak muhtemelen mümkün olduğunca basit giderdim. Bu, istemiyorsanız kare yapmak zorunda kalmayacağınız anlamına gelir, sadece mutlak değere ihtiyacınız vardır ve bunu, önceden hesaplanabilecek olan güç eşiğinin kare köküyle karşılaştırın. Konuşmayı algıladığınızda, tüm konuşmayı aldığınızdan emin olmak için konuşmadan önce bir miktar kayıt alın ve bir saniyenin 1 / 10’u?). Eşiği aşan hiçbir numunenin uzun süre kalmadığını bulana kadar devam edin. Yine, sürenin uzunluğunun ampirik olarak belirlenmesi gerekecektir.

Durulayın ve tekrarlayın.


4

Java'da bir etkinlik dedektörü sınıfı yazdım. Açık kaynaklı Java DSP koleksiyonumun bir parçası . Giriş olarak bir WAV dosyasıyla kontrol etmek için WavSplitter.java test programını kullanabilirsiniz.


OP'nin özellikle algoritmaları C de yazması gerektiğini söylediğini unutmayın
Sam Maloney

Bu tür algoritmaları Java'dan C'ye dönüştürmek çok kolay.
Christian d'Heureuse,

Efendim, bunu python'da nasıl elde edersiniz?
kRazzy R
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.