Duygusal içeriği kaldırmak için konuşmayı parametrik olarak bozun


12

R veya Matlab'da önerileri kabul etmekten mutluluk duyuyorum, ancak aşağıda sunduğum kod sadece R.

Aşağıda ekli olan ses dosyası iki kişi arasındaki kısa bir konuşmadır. Amacım konuşmalarını çarpıtarak duygusal içeriğin tanınmaz hale gelmesini sağlamak. Zorluk şu ki, bu çarpıtma için bazı parametrik alanlara ihtiyacım var. 1'den 5'e kadar diyelim, burada 1 'çok tanınabilir duygu' ve 5 'tanınmayan duygu'. R ile bunu başarmak için kullanabileceğimi düşündüğüm üç yol var.

'Mutlu' ses dalgasını buradan indirin .

'Kızgın' ses dalgasını buradan indirin .

İlk yaklaşım gürültü çıkararak genel anlaşılırlığı azaltmaktı. Bu çözüm aşağıda sunulmuştur (önerileri için @ carl-witthoft'a teşekkürler). Bu, konuşmanın hem anlaşılabilirliğini hem de duygusal içeriğini azaltacaktır, ancak çok 'kirli' bir yaklaşımdır - parametrik alanı elde etmeyi doğru yapmak zordur, çünkü orada kontrol edebileceğiniz tek yön, bir gürültü (hacim) gürültüsüdür.

require(seewave)
require(tuneR)
require(signal)
h <- readWave("happy.wav")
h <- cutw(h.norm,f=44100,from=0,to=2)#cut down to 2 sec
n <- noisew(d=2,f=44100)#create 2-second white noise
h.n <- h + n #combine audio wave with noise
oscillo(h.n,f=44100)#visualize wave with noise(black)
par(new=T)
oscillo(h,f=44100,colwave=2)#visualize original wave(red)

resim açıklamasını buraya girin

İkinci yaklaşım, gürültüyü bir şekilde ayarlamak, konuşmayı sadece belirli frekans bantlarında deforme etmek olacaktır. Orijinal ses dalgasından genlik zarfı çıkararak, bu zarftan gürültü üreterek ve sonra sesi ses dalgasına yeniden uygulayarak yapabileceğimi düşündüm. Aşağıdaki kod, bunun nasıl yapılacağını gösterir. Gürültünün kendisinden farklı bir şey yapar, sesi çatlatır, ancak aynı noktaya geri döner - burada sadece gürültünün genliğini değiştirebiliyorum.

n.env <- setenv(n, h,f=44100)#set envelope of noise 'n'
h.n.env <- h + n.env #combine audio wave with 'envelope noise'
par(mfrow=c(1,2))
spectro(h,f=44100,flim=c(0,10),scale=F)#spectrogram of normal wave (left)
spectro(h.n.env,f=44100,flim=c(0,10),scale=F,flab="")#spectrogram of wave with 'envelope noise' (right)

resim açıklamasını buraya girin

Son yaklaşım, bunu çözmenin anahtarı olabilir, ancak oldukça zor. Ben bu yöntemi buldum yayınlanan rapor kağıt Science Shannon ve arkadaşları tarafından. (1996) . Muhtemelen oldukça robotik bir şey elde etmek için oldukça zor spektral redüksiyon modeli kullandılar. Ama aynı zamanda, açıklamadan, sorunuma cevap verebilecek çözümü bulmuş olabileceklerini varsayıyorum. Önemli bilgiler Kaynaklar ve Notlar'daki 7 numaralı metnin ve 7 numaralı notun ikinci paragrafında yer almaktadır.- tüm yöntem burada açıklanmıştır. Şimdiye kadar çoğaltma girişimlerim başarısız oldu, ancak aşağıda prosedürün nasıl yapılması gerektiğine ilişkin yorumumla birlikte bulmayı başardığım kod var. Bence neredeyse tüm bulmacalar orada, ama bir şekilde henüz tüm resmi alamıyorum.

###signal was passed through preemphasis filter to whiten the spectrum 
#low-pass below 1200Hz, -6 dB per octave
h.f <- ffilter(h,to=1200)#low-pass filter up to 1200 Hz (but -6dB?)

###then signal was split into frequency bands (third-order elliptical IIR filters)
#adjacent filters overlapped at the point at which the output from each filter 
#was 15dB down from the level in the pass-band
#I have just a bunch of options I've found in 'signal'
ellip()#generate an Elliptic or Cauer filter
decimate()#downsample a signal by a factor, using an FIR or IIR filter
FilterOfOrder()#IIR filter specifications, including order, frequency cutoff, type...
cutspec()#This function can be used to cut a specific part of a frequency spectrum

###amplitude envelope was extracted from each band by half-wave rectification 
#and low-pass  filtering
###low-pass filters (elliptical IIR filters) with cut-off frequencies of:
#16, 50, 160 and 500 Hz (-6 dB per octave) were used to extract the envelope

###envelope signal was then used to modulate white noise, which was then 
#spectrally limited by the same bandpass filter used for the original signal

Peki sonuç nasıl olmalı? Ses kısıklığı, gürültülü bir çatlak arasında bir şey olmalı, ama çok robotik değil. Diyaloğun bir dereceye kadar anlaşılır kalması iyi olurdu. Biliyorum - hepsi biraz öznel, ama bunun için endişelenmeyin - vahşi öneriler ve gevşek yorumlar çok açıktır.

Referanslar:


Basit bir yaklaşım, sesi (gürültü + 1.0) ile modüle etmek, dolayısıyla çarpmak olacaktır. Ama başka bir soru: Ne yapmaya çalışıyorsunuz? Sesleri anlaşılmaz kılarken, temel hedefiniz nedir?

1
Neden sadece noisy <- audio + k*white_noiseçeşitli k değerleri için yapmak istemiyorsunuz? Elbette ki, "anlaşılabilir" in yüksek derecede öznel olduğunu akılda tutarak. Oh, ve muhtemelen tek bir rastgele değer dosyası white_noisearasındaki yanlış korelasyon nedeniyle rastlantısal etkilerden kaçınmak için birkaç düzine farklı örnek istersiniz . audionoise

Sonuçta, işitsel bilgilerin güvenilirliğini parametrik olarak azaltmak istiyorum, böylece doğruluk kararları, manipüle edilmiş farklı ses klibi seviyeleri için farklı olacaktır. Doğruluk yargısı, konuşma mutlu ya da öfkeli olsun, duygu için olacaktır. Sorun, uzun bir konuşma ifadesinin duygusal içeriğini manipüle etmenin son derece zor olmasıdır (yukarıdaki klipim gibi). İnsanlar tek bir sesli harfle yaparlar, ancak tüm cümleleri kullanmazlar. Bu yüzden soruyu genelleştirmeye karar verdim ve tüm ses bilgisi spektrumunu parametrik olarak bozmanın yolunu bulmaya karar verdim.

@CarlWitthoft Çözümünüz sadece gürültünün genliğini ayarlar ve dediğim gibi - gürültüyü sinyal ile karıştıran bir şeye ihtiyacım var . + Farklı beyaz gürültü örneklerine ihtiyacım olduğu fikrini + 1'lediniz - bu da işaret ettiğiniz gibi bir fark yaratabilir.

Eh ... Burada cehaleti yalvarıyorum: iki ses akışını "karıştırmanın" matematiksel tanımı nedir? Naif olarak, programlanabilir bir filtrenin varlığını bırakarak, iki örneklenmiş zaman genliği vektörü ile yapabileceğiniz her şeyin onları eklemesi olduğunu varsayıyordum.

Yanıtlar:


11

Orijinal sorunuzu okudum ve ne elde ettiğinden emin değildim ama şimdi çok daha net. Sahip olduğunuz sorun, arka plan gürültüsü çok yüksek olsa bile, mevcut girişimleriniz sadece sınırlı başarıya ulaşmış olsa bile, beynin konuşma ve duyguları seçmede son derece iyi olmasıdır.

Bence istediğini elde etmenin anahtarı duygusal içeriği taşıyan mekanizmaları, anlaşılırlığı taşıyanlardan çoğunlukla ayrı oldukları için anlamaktır. Bu konuda biraz deneyimim var (aslında benim derece tezim benzer bir konuydu) bu yüzden bazı fikirler sunmaya çalışacağım.

İki örneğinizi çok duygusal konuşmanın örnekleri olarak düşünün, ardından "duygusuz" bir örnek olacağını düşünün. Şu anda aklıma gelen en iyi şey bilgisayar tarafından üretilen "Stephen Hawking" tipi ses. Yani, doğru yapmak istediğimi anlarsam, aralarındaki farkları anlamak ve örneklerin yavaş yavaş bilgisayar tarafından üretilen duygusuz bir ses gibi olmak için nasıl çarpılacağını bulmak.

Duygusal içeriğin birçoğu konuşmanın tonlama ve ritminde yer aldığından, istediğinizi elde etmek için iki ana mekanizmanın adım ve zaman bozulması yoluyla olduğunu söyleyebilirim. Yani, denemeye değer olabilecek birkaç şeyin önerisi:

  1. Perdeyi büken ve tonlamayı azaltan bir perde distorsiyonu tipi etkisi. Bu, Antares Autotune'un tam bir monoton olana kadar perdeyi sürekli olarak sabit bir değere doğru eğdiğiniz yerde çalıştığı gibi yapılabilir.

  2. Konuşmanın bazı bölümlerinin uzunluğunu değiştiren bir zaman uzatma etkisi - belki de konuşmanın ritmini bozacak sabit sesli fonemler.

Şimdi, bu yöntemlerden herhangi birine yaklaşmaya karar verdiyseniz, o zaman dürüst olacağım - DSP'de uygulamak o kadar kolay değildir ve sadece birkaç kod satırı olmayacaktır. Sinyal işlemeyi anlamak için biraz iş yapmanız gerekecek. Pro-Tools / Logic / Cubase ve Antares Autotune kopyasına sahip birini tanıyorsanız, muhtemelen kendinize benzer bir şey kodlamaya çalışmadan önce istediğiniz etkiye sahip olup olmayacağını görmeye değer olacaktır.

Umarım bu size bazı fikirler verir ve biraz yardımcı olur. Daha önce söylediğim şeylerden herhangi birini açıklamam gerekiyorsa bana haber ver.


@Redeye önerileriniz için teşekkür ederiz. Zaman uzatma maalesef bir seçenek değil, çünkü onlara video bilgilerini sunduğum bir durum olacak, bu yüzden değiştirilmiş konuşmayı orijinalle aynı uzunlukta tutmam gerekiyor. Pitch bozulma ilginç bir yaklaşımdır - bu yöntemi daha iyi açıklamak için yayınlanmış referanslar biliyor musunuz?
Asit Geek

1
Konuşmayı istediğinizi yapmak için kaydırmak iki aşamadan oluşacaktır - önce mevcut temel frekans profilini oluşturmak için konuşmanın analizi, sonra da ikinci adımdaki kaydırma. Analiz oldukça basittir ve etkili olan birkaç yöntem vardır. Saha değişimi daha karmaşıktır - AES dergisinde yayınlanmış referanslar için arama yapmayı denerdim (JAES Cilt 47 Sayı 11 s. 928-936; Kasım 1999 faydalı olabilir gibi görünüyor). Daha önce söylediğim gibi, burada oldukça karmaşık bir işlem görüyorsunuz ve öncelikle Autotune ile denemeye değer.
Redeye

2
Redeye'nin iyi önerileri var, ancak sadece adım kaydırma konuşması için faz vocoder veya herhangi bir frekans alanı yaklaşımı önermeyeceğim - PSOLA (adım eşzamanlı çakışma ekleme) gitmek için iyi bir yoldur çünkü ses gibi monofonik faz kilitli alet.
12'de schnarf

4

İstediğiniz efekti elde etmek için bazı müzik prodüksiyon yazılımı almanızı ve bununla oynamanızı öneririm. Ancak o zaman bunu programlı olarak çözme konusunda endişelenmelisiniz. (Müzik yazılımınız bir komut satırından çağrılabiliyorsa, R veya MATLAB'den arayabilirsiniz).


Tartışılmayan diğer bir olasılık da, bir dize oluşturmak için konuşmadan metne yazılımını, daha sonra bu dizeyi bir robot sese dönüştürmek için metinden konuşmaya yazılımını kullanarak duyguları tamamen ortadan kaldırmaktır. Bakınız /programming/491578/how-do-i-convert-speech-to-text ve /programming/637616/open-source-text-to-speech-library .

Bunun güvenilir bir şekilde çalışmasını sağlamak için muhtemelen hoparlörü tanımak için ilk yazılım parçasını eğitmeniz gerekecektir.


Orijinal dosyaları filtrelemeye ihtiyacım var, bu yüzden metin-konuşma ne yazık ki bir seçenek değil, ancak normal konuşma ve sentetik konuşma arasındaki bazı geçiş paradigmasını düşünebilirim.
Geek On Acid
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.