Yalnızca Ses Kaydıyla Şarkının Nereden Başladığını Belirleme


14

Ben bir kullanıcı her satır arasında bir saniye boşluk, bir şarkının 4 satır söylüyor küçük bir karaoke tarzı bir uygulama var. Destek müziği yok, bu yüzden sadece ses, umarım problemi çözmeyi kolaylaştırır.

Kayıt sırasında kullanıcının şarkı 1 no'lu hattı başladığı ve bittiği, 2 no'lu şarkı satırı 2'yi başlattığı ve bittiği yeri tam olarak tespit etmenin en sağlam yolunu arıyorum.

Kayıtta çok az arka plan gürültüsü olduğunda çalışan basit fikirli bir algoritmayı bir araya getirdim (bu ne zaman olduğu gibi?), Ancak en küçük gürültünün varlığında parçalara düşüyor.

Biri beni daha sağlam bir şeye yönlendirebilir mi?


Cevabım size yardımcı olabilir - dsp.stackexchange.com/a/1543/440
Dipan Mehta

Bazı kayıtlarda ses, her iki kanalda aynı genlikte çalınan tek araçtır. Bu bilgileri, stereo kayıttan sesi çıkarmak için kullanabilirsiniz.
Jader Dias

Yanıtlar:


4

Arka plan gürültüsü beyaz renkteyse, spektral düzlüğü ölçebilir ve genlik bir eşiğin üzerinde olduğunda ve spektral düzlük bir eşiğin altında olduğunda ses olarak düşünebilirsiniz.

Temel olarak sinyalin bir kısmının FFT'sini alırsınız, daha sonra spektrumun büyüklüğünün geometrik ortalamasını aritmetik ortalamaya bölersiniz.

Sadece insan sesinin genellikle oturduğu frekans bölgelerini vurgulamak için bir bant geçiren filtre de kullanabilirsiniz (spektral düzlüğü ölçmeden önce FFT'nin istenmeyen bölgelerini 0'a ayarlamak kadar basit)


Endolith, deneyimlerinizde, spektral düzlüğü ölçmeden önce kare büyüklük VS'ye sadece büyüklük alırsanız büyük bir fark yaratır mı?
Spacey

@Mohammad: Bununla ilgili hiçbir deneyimim yok. :) Bir önceki soruyu sordum çünkü spesifikasyonu anlamadım ve hala hangi yolun doğru olduğundan emin değilim. Yine de karenin pratik bir fark yarattığını düşünmüyorum. Sadece bir eşiği geçtiğinde tetikliyorsanız, kare olsun ya da olmasın aynı şekilde tepki vermelidir (eşiği eşleşecek şekilde ayarladığınızı varsayarak), böylece yalnızca büyüklük hesaplama açısından daha ucuzdur.
endolit

@Endolith, bu biraz uzun bir atış: Matlab'da bu yaklaşımı nasıl uygulayacağınızı biliyor musunuz? Hangisinin en iyi olduğunu görmek için burada matlab'da (aslında oktav) belirtilen tüm yaklaşımları test etmek istiyorum.
Mike Hogan

@MikeHogan: Hayır, uzun zamandır matlab kullanmadım. : / Ayrıca gerçek iş yapmayı gerektirir. :) Önceden yazılmış bir şeyim yok. Sinyali küçük parçalara ayırın, her birinin FFT'sini yapın ve her FFT için, büyüklüğün geometrik ortalamasını büyüklüğün aritmetik ortalamasına bölün. yüksek sayılar gürültülü, düşük sayılar tonludur.
endolith

3

Geçmişte spektral akı kullandım ve iyi çalışıyor gibi görünüyor. Temel fikir, önem verdiğiniz bantlarda sinyalin bir spektrogramını oluşturmaktır. Bize frekans y ekseni üzerinde ve zaman, x ekseni üzerinde olduğunu varsayalım şöyle .

Bu, spektrogramınızın bir matris olduğu anlamına gelir. Her sütun, sinyal zamanınızdaki bir anlık çekimin FFT'sinin mutlak değerini temsil eder ve her satır bir banttan gelen enerjinin zaman içinde nasıl değiştiğini temsil eder.

Şimdi, sütun farkını almanız yeterlidir. Yani, bir sütun alın ve kendisinden önceki sütunu çıkarın ve tüm sütunlar için yapın. (Başlangıç ​​sütunlarını açıkça yalnız bırakmak). Sonra tüm gruplarda toplayın. Yani, tüm satırları bir araya getirin.

Sonuç olarak sinyal başlangıçlarınızı kodlayan bir 1-D sinyali elde edersiniz . Bu size sesinizin nerede başladığını söyleyecektir.

DÜZENLE:

Artık başlangıçları algıladığınıza göre, tam tersini tespit etmek istiyorsanız (yani, bir sinyalin aktiviteye sahip olmasından hiçbirine gitmediğinde), spektral akı aslında size bu bilgileri verir. Nerede bir başlangıç ​​geçirirseniz, pozitif bir zirveye sahip olacaksınız ve nerede daha iyi bir kelimeniz olmadığı için (daha iyi bir kelime olmaması için) negatif bir zirveye sahip olacaksınız.

Sinyalimin toplam başlangıç ​​ve bitiş zamanlarını işaretlemek için ilk pozitif zirveyi ve son negatif zirveyi alırdım.


Mohammad, "sıra" ile ne demek istiyorsun?
Mike Hogan

@MikeHogan Lütfen düzenlemelerime bakın, cevabı tekrar yazdım.
Spacey

Bu hiçbir şeyin başlangıcını bulamaz mı? Davul vuruşları veya diğer dürtüsel gürültü de tespit edilir. Tonal sesler ve gürültülü sesler arasında ayrım yapmaz.
endolit

@endolith İyi bir noktaya değindin - ancak yine de işe yarayabileceğine inanıyorum. Benim nedenim, bu senaryoda, ses + müzik durumunda ya da sadece müzik durumunda olmanızdır. Spektral akıyı hesaplarken, gerçekten sadece ses + müzik ve sadece müzik arasındaki deltayı hesaplıyorsunuz. (Elbette çok daha fazla analiz etmem gerekecekti ama şu an böyle düşünüyorum) :-P
Spacey

1
@ endolith Ben sadece yeniden okumak ve OP sadece ses olduğunu söylüyor, (görünüşe göre onun basit bir uygulama), bu nedenle bu durumda sadece VS hiçbir şey ses olurdu.
Spacey

2

Deneyimlerimden, Mel-Frekans-Cepstrum-Katsayıları (MFCC) içine bakmayı deneyeceğim . Bir FFT'niz varsa ve ses işlemede oldukça yaygın olarak kullanılıyorsa MFCC'lerin uygulanması oldukça kolaydır.

MFCC'lerle, gerçek ses verilerini gürültüden ayırt edebilmelisiniz.


@endolith, bu bağlantı tamamen benden öte! Bakabileceğim herhangi bir açık kaynak uygulaması veya nasıl çalıştığının adım adım tarifini biliyor musunuz?
Mike Hogan

2

" Spektral akı " ("spektral fark" olarak da bilinir) "başlangıç ​​tespiti" için yaygın bir yöntemdir. Temel olarak sinyalin sıralı FFT'lerini alırsınız ve bir numuneden diğerine FFT kovalarının farklılıklarının büyüklüğünü toplarsınız. "Başlangıç" genellikle bu değerde önemli bir "sıçrama" ile temsil edilir.

Google diğer fikirler için "başlangıç ​​tespiti".


2

Tek başına spektral akı kullanmak, belirli sesler için yanlış pozitifler üretmenin yanı sıra bir şarkı sesi algılayabilir.

Şarkı söylemek genellikle bir adım içeren bir sinyal içeriği anlamına gelir, böylece bir adım dedektörü veya tahmincisi (cepstrum vb.) Kullanabilirsiniz. Toplam sinyal enerjisine karşı perdeli olarak algılanan enerjinin fraksiyonunu ve tahmini perdenin insan sesi aralığında olduğunu akılcı bir şekilde kontrol edebilirsiniz. Bu, ses tonunun yanlış pozitif oranını ve normal vokal aralık dışındaki müzikal sesleri azaltacaktı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.