Degrado parametrico del discorso per rimuovere il contenuto emotivo


12

Sono felice di accettare suggerimenti in R o Matlab, ma il codice che presento di seguito è solo R.

Il file audio allegato di seguito è una breve conversazione tra due persone. Il mio obiettivo è distorcere il loro discorso in modo che il contenuto emotivo diventi irriconoscibile. La difficoltà è che ho bisogno di spazio parametrico per questa distorsione diciamo da 1 a 5, dove 1 è "emozione altamente riconoscibile" e 5 è "emozione non riconoscibile". Ci sono tre modi in cui pensavo di poter usare per raggiungerlo con R.

Scarica un'onda audio "felice" da qui .

Scarica l'onda audio 'arrabbiata' da qui .

Il primo approccio è stato quello di ridurre l'intelligibilità generale introducendo rumore. Questa soluzione è presentata di seguito (grazie a @ carl-witthoft per i suoi suggerimenti). Ciò ridurrà sia l'intelligibilità sia il contenuto emotivo del discorso, ma è un approccio molto "sporco": è difficile renderlo corretto per ottenere lo spazio parametrico, poiché l'unico aspetto che puoi controllare è l'ampiezza (volume) del rumore.

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)

inserisci qui la descrizione dell'immagine

Il secondo approccio sarebbe in qualche modo regolare il rumore, distorcere il discorso solo nelle bande di frequenza specifiche. Ho pensato di poterlo fare estraendo l'inviluppo di ampiezza dall'onda audio originale, generare rumore da questo inviluppo e quindi riapplicare il rumore all'onda audio. Il codice seguente mostra come farlo. Fa qualcosa di diverso dal rumore stesso, fa spezzare il suono, ma torna allo stesso punto - che qui posso solo modificare l'ampiezza del rumore.

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)

inserisci qui la descrizione dell'immagine

L'approccio finale potrebbe essere la chiave per risolverlo, ma è piuttosto complicato. Ho trovato questo metodo nel rapporto pubblicato su Science da Shannon et al. (1996) . Hanno usato un modello piuttosto complesso di riduzione spettrale, per ottenere qualcosa che probabilmente suona abbastanza robotico. Ma allo stesso tempo, dalla descrizione, presumo che avrebbero potuto trovare la soluzione che potesse rispondere al mio problema. Le informazioni importanti si trovano nel secondo paragrafo nel testo e nella nota numero 7 in Riferimenti e note- l'intero metodo è descritto lì. I miei tentativi di replicarlo finora non hanno avuto successo, ma di seguito è riportato il codice che sono riuscito a trovare, insieme alla mia interpretazione di come dovrebbe essere eseguita la procedura. Penso che quasi tutti i puzzle ci siano, ma in qualche modo non riesco ancora a ottenere l'intera immagine.

###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

Come dovrebbe apparire il risultato? Dovrebbe essere qualcosa tra raucedine, un cracking rumoroso, ma non così tanto robotico. Sarebbe bello se il dialogo rimanesse in qualche modo comprensibile. Lo so - è tutto un po 'soggettivo, ma non ti preoccupare - suggerimenti selvaggi e interpretazioni vaghe sono i benvenuti.

Riferimenti:


Un approccio semplice sarebbe modulare, quindi moltiplicare, la voce con il (rumore + 1.0). Ma un'altra domanda: cosa stai cercando di fare? Qual è il tuo obiettivo dominante, quando si rendono incomprensibili le voci?

1
Perché semplicemente fare noisy <- audio + k*white_noiseper una varietà di valori di k non fa quello che vuoi? Tenendo presente, ovviamente, che "intelligibile" è altamente soggettivo. Oh, e probabilmente vuoi qualche dozzina di white_noisecampioni diversi per evitare effetti audiocasuali a causa della falsa correlazione tra e un singolo noisefile a valore casuale .

In definitiva, desidero ridurre parametricamente l'affidabilità delle informazioni uditive, in modo che i giudizi di precisione differiscano per i diversi livelli di clip audio manipolata. Il giudizio di precisione sarà per l'emozione, sia che la conversazione sia felice o arrabbiata. Il problema è che è estremamente difficile manipolare il contenuto emotivo di un lungo discorso (come la mia clip allegata sopra). La gente lo fa con una singola vocale, ma non con le frasi intere. Così ho deciso di generalizzare la domanda e di capire come degradare parametricamente l'intero spettro di informazioni audio.

@CarlWitthoft La tua soluzione regola solo l'ampiezza del rumore e, come ho detto, ho bisogno di qualcosa che mescoli il rumore con il segnale. Fai +1 sul suggerimento che ho bisogno di diversi campioni di rumore bianco, che potrebbero davvero fare la differenza, come hai sottolineato.

Bene ... supplico qui l'ignoranza: qual è la definizione matematica di "missaggio" di due flussi audio? Pensavo ingenuamente che, tralasciando l'esistenza di un filtro programmabile, tutto ciò che si può fare con due vettori di ampiezze campionate nel tempo è aggiungerli.

Risposte:


11

Ho letto la tua domanda originale e non ero abbastanza sicuro di cosa stavi arrivando, ma ora è molto più chiaro. Il problema che hai è che il cervello è estremamente bravo a individuare le parole e le emozioni anche quando il rumore di fondo è molto alto, i tuoi tentativi esistenti hanno avuto solo un successo limitato.

Penso che la chiave per ottenere ciò che vuoi sia capire i meccanismi che trasmettono il contenuto emotivo in quanto sono per lo più separati da quelli che trasmettono l'intelligibilità. Ho avuto una certa esperienza al riguardo (in effetti la mia tesi di laurea era su un argomento simile) quindi proverò ad offrire alcune idee.

Considera i tuoi due campioni come esempi di discorso molto emotivo, quindi considera quello che sarebbe un esempio "privo di emozioni". Il meglio che mi viene in mente in questo momento è la voce di tipo "Stephen Hawking" generata dal computer. Quindi, se ho capito bene cosa vuoi fare è capire le differenze tra loro e capire come distorcere i tuoi campioni per diventare gradualmente come una voce priva di emozioni generata dal computer.

Direi che i due meccanismi principali per ottenere ciò che vuoi sono tramite il tono e la distorsione del tempo poiché gran parte del contenuto emotivo è contenuto nell'intonazione e nel ritmo del discorso. Quindi, un suggerimento di un paio di cose che potrebbero valere la pena provare:

  1. Un effetto di tipo distorsione intonazione che piega l'intonazione e riduce l'intonazione. Questo potrebbe essere fatto allo stesso modo in cui Antares Autotune funziona dove pieghi gradualmente il tono verso un valore costante sempre più fino a quando non è un monotono completo.

  2. Un effetto di allungamento del tempo che modifica la lunghezza di alcune parti del discorso - forse i fonemi con voce costante che spezzerebbero il ritmo del discorso.

Ora, se hai deciso di approcciare uno di questi metodi, sarò onesto: non sono così semplici da implementare in DSP e non saranno solo poche righe di codice. Avrai bisogno di fare un po 'di lavoro per capire l'elaborazione del segnale. Se conosci qualcuno con Pro-Tools / Logic / Cubase e una copia di Antares Autotune, probabilmente varrebbe la pena provare a vedere se avrà l'effetto desiderato prima di provare a scrivere qualcosa di simile.

Spero che ti dia alcune idee e aiuti un po '. Se hai bisogno che io spieghi qualcos'altro che ho detto, fammelo sapere.


Grazie per i tuoi suggerimenti @Redeye. Purtroppo il time-stretch non è un'opzione, perché ci sarà una condizione in cui li presento con le informazioni sul video, quindi devo mantenere il discorso modificato della stessa lunghezza di quello originale. La distorsione del tono è un approccio interessante - conosci qualche riferimento pubblicato per spiegare meglio questo metodo?
Geek On Acid,

1
Il pitch shifting del discorso per fare ciò che vuoi coinvolgerà due fasi: in primo luogo l'analisi del discorso per stabilire il profilo di frequenza fondamentale corrente, quindi il pitch shift. L'analisi è abbastanza semplice e ci sono diversi metodi che sono efficaci. Il cambio di intonazione è più complesso - proverei a cercare nei riferimenti AES i riferimenti pubblicati (JAES Volume 47 Numero 11 pagg. 928-936; novembre 1999 sembra che potrebbe essere utile). Come ho detto prima, stai entrando in un processo piuttosto complesso qui e varrebbe sicuramente la pena provarlo prima con Autotune.
Redeye,

2
Redeye ha dei buoni suggerimenti, ma vorrei solo notare che per il discorso di pitch shifting, non consiglierei il vocoder di fase o qualsiasi approccio al dominio della frequenza - PSOLA (aggiunta di sovrapposizione sincrono del tono) è un buon modo di procedere perché suonerà meglio per un strumento monofonico a fase bloccata come la voce.
schnarf,

4

Ti suggerisco di procurarti un software di produzione musicale e di giocarci per ottenere l'effetto che desideri. Solo allora dovresti preoccuparti di risolverlo a livello di codice. (Se il tuo software musicale può essere chiamato da una riga di comando, puoi chiamarlo da R o MATLAB).


Un'altra possibilità che non è stata discussa è quella di eliminare completamente l'emozione usando il software di sintesi vocale per creare una stringa, quindi un software di sintesi vocale per trasformare quella stringa in una voce di robot. Vedi /programming/491578/how-do-i-convert-speech-to-text e /programming/637616/open-source-text-to-speech-library .

Per farlo funzionare in modo affidabile dovrai probabilmente addestrare il primo software a riconoscere l'altoparlante.


Ho bisogno di filtrare i file originali in modo che il text-to-speech non sia davvero un'opzione sfortunatamente, anche se potrei pensare a un paradigma morphing tra discorso normale e discorso sintetico.
Geek On Acid,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.