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)
İ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)
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:
- Shannon, RV, Zeng, FG, Kamath, V., Wygonski, J. ve Ekelid, M. (1995). Öncelikle zamansal işaretlerle konuşma tanıma. Bilim , 270 (5234), 303. http://www.cogsci.msu.edu/DSS/2007-2008/Shannon/temporal_cues.pdf adresinden indirin.
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_noise
arasındaki yanlış korelasyon nedeniyle rastlantısal etkilerden kaçınmak için birkaç düzine farklı örnek istersiniz . audio
noise