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 lusinwhite_noise
sampel berbeda untuk menghindari efek kebetulan karena korelasi palsu antaraaudio
dan satunoise
file nilai acak .Jawaban:
Saya membaca pertanyaan awal Anda dan tidak yakin apa yang Anda maksudkan tetapi sekarang sudah jauh lebih jelas. Masalah yang Anda miliki adalah bahwa otak sangat pandai memilih ucapan dan emosi bahkan ketika kebisingan latar belakang sangat tinggi yang merupakan upaya Anda yang ada hanya keberhasilan yang terbatas.
Saya pikir kunci untuk mendapatkan apa yang Anda inginkan adalah memahami mekanisme yang menyampaikan konten emosional karena sebagian besar terpisah dari mekanisme yang menyampaikan kejelasan. Saya punya pengalaman tentang hal ini (sebenarnya disertasi gelar saya tentang topik yang sama) jadi saya akan mencoba dan menawarkan beberapa ide.
Pertimbangkan dua sampel Anda sebagai contoh ucapan yang sangat emosional, kemudian pertimbangkan contoh apa yang akan menjadi contoh "tanpa emosi". Yang terbaik yang bisa saya pikirkan saat ini adalah komputer yang menghasilkan suara tipe "Stephen Hawking". Jadi, jika saya mengerti benar apa yang ingin Anda lakukan adalah memahami perbedaan di antara mereka dan mencari tahu bagaimana mengubah sampel Anda untuk secara bertahap menjadi seperti komputer yang menghasilkan suara tanpa emosi.
Saya akan mengatakan bahwa dua mekanisme utama untuk mendapatkan apa yang Anda inginkan adalah melalui distorsi nada dan waktu karena banyak konten emosional terkandung dalam intonasi dan ritme pidato. Jadi, saran dari beberapa hal yang mungkin patut dicoba:
Efek tipe distorsi pitch yang menekuk pitch dan mengurangi intonasi. Ini bisa dilakukan dengan cara yang sama seperti yang dilakukan Antares Autotune di mana Anda sedikit demi sedikit membengkokkan nada ke nilai yang konstan hingga menjadi monoton lengkap.
Efek rentang waktu yang mengubah panjang beberapa bagian pidato - mungkin fonem bersuara konstan yang akan memecah ritme pidato.
Sekarang, jika Anda memutuskan untuk mendekati salah satu dari metode ini maka saya akan jujur - mereka tidak mudah diimplementasikan dalam DSP dan itu tidak akan menjadi hanya beberapa baris kode. Anda perlu melakukan beberapa pekerjaan untuk memahami pemrosesan sinyal. Jika Anda mengenal seseorang dengan Pro-Tools / Logic / Cubase dan salinan Antares Autotune maka mungkin ada baiknya mencoba untuk melihat apakah itu akan memiliki efek yang Anda inginkan sebelum mencoba kode sesuatu yang serupa dengan diri Anda.
Saya harap itu memberi Anda beberapa ide dan sedikit membantu. Jika Anda membutuhkan saya untuk menjelaskan hal-hal yang telah saya katakan lagi, beri tahu saya.
sumber
Saya sarankan Anda mendapatkan beberapa perangkat lunak produksi musik dan bermain dengan itu untuk mendapatkan efek yang Anda inginkan. Hanya dengan begitu Anda harus khawatir tentang pemecahan masalah ini secara terprogram. (Jika perangkat lunak musik Anda dapat dipanggil dari baris perintah, maka Anda dapat memanggilnya dari R atau MATLAB).
Satu kemungkinan lain yang belum dibahas adalah menghapus emosi sepenuhnya dengan menggunakan perangkat lunak speech to text untuk membuat string, kemudian perangkat lunak text to speech untuk mengubah string itu menjadi suara robot. Lihat /programming/491578/how-do-i-convert-speech-to-text dan /programming/637616/open-source-text-to-speech-library .
Agar ini berfungsi dengan baik, Anda mungkin harus melatih perangkat lunak pertama untuk mengenali pembicara.
sumber