Secara parametrik menurunkan pidato untuk menghilangkan konten emosional

12

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)

masukkan deskripsi gambar di sini

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)

masukkan deskripsi gambar di sini

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:

Kutu Asam
sumber
Salah satu pendekatan sederhana adalah memodulasi, maka gandakan, suara dengan (noise + 1.0). Tetapi pertanyaan lain: Apa yang Anda coba lakukan? Apa tujuan utama Anda, ketika membuat suara tidak dapat dipahami?
1
Mengapa tidak sekadar melakukan noisy <- audio + k*white_noiseuntuk berbagai nilai k melakukan apa yang Anda inginkan? Ingat, tentu saja, bahwa "kecerdasan" itu sangat subjektif. Oh, dan Anda mungkin ingin beberapa lusin white_noisesampel berbeda untuk menghindari efek kebetulan karena korelasi palsu antara audiodan satu noisefile nilai acak .
Pada akhirnya saya ingin mengurangi keandalan informasi pendengaran secara parametrik, sehingga penilaian keakuratan akan berbeda untuk berbagai tingkat klip audio yang dimanipulasi. Penghakiman yang akurat adalah untuk emosi - apakah percakapan itu bahagia atau marah. Masalahnya adalah sangat sulit untuk memanipulasi konten emosional ucapan panjang (seperti klip saya terlampir di atas). Orang-orang melakukannya dengan satu vokal, tetapi tidak seluruh kalimat. Jadi saya memutuskan untuk menggeneralisasi pertanyaan, dan mencari cara untuk secara parametrik menurunkan seluruh spektrum informasi audio.
@CarlWitthoft Solusi Anda hanya mengatur amplitudo kebisingan, dan seperti yang saya katakan - Saya perlu sesuatu yang mencampur kebisingan dengan sinyal. Memberi Anda saran bahwa saya memerlukan sampel berbeda white noise - yang mungkin memang membuat perbedaan seperti yang Anda tunjukkan.
Baiklah ... Saya memohon ketidaktahuan di sini: apa definisi matematis dari "mencampur" dua aliran audio? Saya dengan naif berasumsi bahwa, meninggalkan keberadaan filter yang dapat diprogram, yang dapat Anda lakukan dengan dua vektor amplitudo sampel waktu adalah menambahkannya.

Jawaban:

11

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:

  1. 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.

  2. 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.

Mata merah
sumber
Terima kasih atas saran Anda @Redeye. Sayangnya, rentang waktu bukanlah suatu pilihan, karena akan ada suatu kondisi di mana saya menyajikan informasi video kepada mereka, jadi saya perlu menjaga pidato yang dimodifikasi dengan panjang yang sama dengan yang asli. Distorsi pitch adalah pendekatan yang menarik - apakah Anda tahu referensi yang diterbitkan untuk menjelaskan metode ini dengan lebih baik?
Geek On Acid
1
Pitch menggeser pidato untuk melakukan apa yang Anda inginkan akan melibatkan dua tahap - analisis pertama pidato untuk menetapkan profil frekuensi dasar saat ini, kemudian kedua pergeseran nada. Analisisnya cukup mudah dan ada beberapa metode yang efektif. Pergeseran pitch lebih kompleks - Saya akan mencoba mencari jurnal AES untuk referensi yang diterbitkan (JAES Volume 47 Edisi 11 hal. 928-936; November 1999 sepertinya itu mungkin berguna). Seperti yang saya katakan sebelumnya, Anda masuk ke beberapa pemrosesan yang cukup rumit di sini dan pasti akan pantas untuk dicoba dengan Autotune terlebih dahulu.
Redeye
2
Redeye memiliki saran yang bagus, tetapi saya hanya akan mencatat bahwa untuk pidato perpindahan nada, saya tidak akan merekomendasikan fase vocoder atau pendekatan domain frekuensi apa pun - PSOLA (add-over tumpang tindih pitch-sinkron) adalah cara yang baik untuk digunakan karena akan terdengar lebih baik untuk instrumen fase-terkunci monofonik seperti suara.
schnarf
4

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.

Richie Cotton
sumber
Saya perlu memfilter file asli sehingga text-to-speech sebenarnya bukan pilihan, meskipun saya mungkin berpikir tentang beberapa paradigma morphing antara pidato normal dan pidato sintetis.
Geek On Acid