Saya senang menerima saran baik dalam R atau Matlab, tetapi kode yang saya sajikan di bawah ini hanya R-saja.
File audio yang terlampir di bawah ini adalah percakapan singkat antara dua orang. Tujuan saya adalah mendistorsi pembicaraan mereka sehingga konten emosional menjadi tidak dapat dikenali. Kesulitannya adalah bahwa saya memerlukan ruang parametrik untuk distorsi ini, katakanlah dari 1 menjadi 5, di mana 1 adalah 'emosi yang sangat dikenali' dan 5 adalah 'emosi yang tidak dapat dikenali'. Ada tiga cara yang saya pikir dapat saya gunakan untuk mencapainya dengan R.
Unduh gelombang audio 'bahagia' dari sini .
Unduh gelombang audio 'marah' dari sini .
Pendekatan pertama adalah untuk mengurangi kejelasan keseluruhan dengan memperkenalkan kebisingan. Solusi ini disajikan di bawah ini (terima kasih kepada @ carl-witthoft untuk sarannya). Ini akan mengurangi baik kejelasan dan isi emosional pidato, tetapi pendekatannya sangat 'kotor' - sulit untuk membuatnya benar untuk mendapatkan ruang parametrik, karena satu-satunya aspek yang dapat Anda kendalikan ada amplitudo (volume) kebisingan.
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)
Pendekatan kedua adalah bagaimana menyesuaikan kebisingan, untuk mengubah pembicaraan hanya pada pita frekuensi tertentu. Saya pikir saya bisa melakukannya dengan mengekstraksi amplop amplop dari gelombang audio asli, menghasilkan noise dari amplop ini dan kemudian menerapkan kembali noise ke gelombang audio. Kode di bawah ini menunjukkan cara melakukannya. Itu melakukan sesuatu yang berbeda dari kebisingan itu sendiri, membuat suara retak, tetapi kembali ke titik yang sama - bahwa saya hanya dapat mengubah amplitudo kebisingan di sini.
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)
Pendekatan terakhir mungkin menjadi kunci untuk menyelesaikan ini, tetapi itu cukup rumit. Saya menemukan metode ini dalam makalah laporan yang diterbitkan dalam Science oleh Shannon et al. (1996) . Mereka menggunakan pola pengurangan spektral yang cukup rumit, untuk mencapai sesuatu yang mungkin terdengar sangat robot. Tetapi pada saat yang sama, dari uraian, saya berasumsi mereka mungkin telah menemukan solusi yang dapat menjawab masalah saya. Informasi penting ada pada paragraf kedua dalam teks dan catat nomor 7 dalam Referensi dan Catatan- seluruh metode dijelaskan di sana. Upaya saya untuk mereplikasi sejauh ini tidak berhasil tetapi di bawah ini adalah kode yang berhasil saya temukan, bersama dengan interpretasi saya tentang bagaimana prosedur harus dilakukan. Saya pikir hampir semua teka-teki ada di sana, tapi entah bagaimana saya belum bisa mendapatkan seluruh gambarnya.
###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
Jadi bagaimana hasilnya? Seharusnya ada sesuatu di antara suara serak, suara bising, tapi bukan robot. Akan lebih baik jika dialog tetap dipertahankan sampai batas tertentu. Saya tahu - itu semua agak subyektif, tapi jangan khawatir tentang itu - saran liar dan interpretasi longgar sangat diterima.
Referensi:
- Shannon, RV, Zeng, FG, Kamath, V., Wygonski, J., & Ekelid, M. (1995). Pengenalan ucapan dengan isyarat temporal. Science , 270 (5234), 303. Unduh dari http://www.cogsci.msu.edu/DSS/2007-2008/Shannon/temporal_cues.pdf
noisy <- audio + k*white_noise
untuk berbagai nilai k melakukan apa yang Anda inginkan? Ingat, tentu saja, bahwa "kecerdasan" itu sangat subjektif. Oh, dan Anda mungkin ingin beberapa lusin white_noise
sampel berbeda untuk menghindari efek kebetulan karena korelasi palsu antara audio
dan satu noise
file nilai acak .