Sparametryzuj degradację mowy w celu usunięcia treści emocjonalnych

12

Z przyjemnością przyjmuję sugestie w języku R lub Matlab, ale kod, który przedstawiam poniżej, jest tylko w języku R.

Załączony poniżej plik audio to krótka rozmowa między dwojgiem ludzi. Moim celem jest zniekształcenie ich mowy, aby treść emocjonalna stała się nie do poznania. Trudność polega na tym, że potrzebuję trochę przestrzeni parametrycznej dla tego zniekształcenia, powiedzmy od 1 do 5, gdzie 1 to „bardzo rozpoznawalna emocja”, a 5 to „nie rozpoznawalna emocja”. Są trzy sposoby, dzięki którym mogę to osiągnąć dzięki R.

Pobierz „szczęśliwą” falę dźwiękową stąd .

Pobierz „gniewną” falę dźwiękową stąd .

Pierwsze podejście polegało na zmniejszeniu ogólnej zrozumiałości poprzez wprowadzenie hałasu. To rozwiązanie zostało przedstawione poniżej (dzięki @ carl-witthoft za jego sugestie). Zmniejszy to zarówno zrozumiałość, jak i treść emocjonalną mowy, ale jest to bardzo „brudne” podejście - trudno jest odpowiednio ustawić przestrzeń parametryczną, ponieważ jedynym aspektem, który można kontrolować, jest amplituda (głośność) hałasu.

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)

wprowadź opis zdjęcia tutaj

Drugim podejściem byłoby jakoś dostosowanie szumu, zniekształcenie mowy tylko w określonych pasmach częstotliwości. Pomyślałem, że mogę to zrobić, wydobywając obwiednię amplitudy z oryginalnej fali audio, generując hałas z tej obwiedni, a następnie ponownie stosując szum do fali dźwiękowej. Poniższy kod pokazuje, jak to zrobić. Robi coś innego niż sam hałas, powoduje trzaskanie dźwięku, ale wraca do tego samego punktu - że mogę tutaj zmienić tylko amplitudę hałasu.

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)

wprowadź opis zdjęcia tutaj

Ostateczne podejście może być kluczem do rozwiązania tego, ale jest dość trudne. Znalazłem tę metodę w artykule opublikowanym w Science przez Shannon i in. (1996) . Zastosowali dość skomplikowany wzór redukcji widmowej, aby osiągnąć coś, co prawdopodobnie brzmi dość robotycznie. Ale jednocześnie z opisu zakładam, że mogli znaleźć rozwiązanie, które mogłoby rozwiązać mój problem. Ważna informacja znajduje się w drugim akapicie tekstu i uwadze nr 7 w Odwołaniach i uwagach- cała metoda jest tam opisana. Moje dotychczasowe próby replikacji zakończyły się niepowodzeniem, ale poniżej znajduje się kod, który udało mi się znaleźć, wraz z moją interpretacją tego, jak należy wykonać procedurę. Myślę, że są tam prawie wszystkie zagadki, ale jakoś nie mogę jeszcze uzyskać całego obrazu.

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

Jak więc powinien brzmieć wynik? Powinno to być coś pomiędzy chrypką, hałaśliwym trzaskaniem, ale nie tyle robotycznym. Byłoby dobrze, gdyby dialog pozostał do pewnego stopnia zrozumiały. Wiem - wszystko jest trochę subiektywne, ale nie martw się tym - dzikie sugestie i luźne interpretacje są bardzo mile widziane.

Bibliografia:

Geek On Acid
źródło
Jednym prostym podejściem byłoby modulowanie, a zatem mnożenie głosu za pomocą (szum + 1,0). Ale kolejne pytanie: co próbujesz zrobić? Jaki jest twój nadrzędny cel, gdy głosy stają się niezrozumiałe?
1
Dlaczego po prostu nie robi noisy <- audio + k*white_noiseróżnych wartości k, aby robić to, co chcesz? Oczywiście należy pamiętać, że „zrozumiały” jest wysoce subiektywny. Aha, i zapewne chcesz kilkudziesięciu różnych white_noisepróbek, aby uniknąć przypadkowych efektów z powodu fałszywej korelacji między audiojednym noiseplikiem o losowej wartości .
Ostatecznie chcę parametrycznie zmniejszyć niezawodność informacji słuchowych, aby oceny dokładności były różne dla różnych poziomów zmanipulowanego klipu audio. Ocena dokładności będzie dotyczyła emocji - niezależnie od tego, czy rozmowa jest szczęśliwa czy zła. Problem polega na tym, że niezwykle trudno jest manipulować treściami emocjonalnymi długich wypowiedzi mowy (jak mój klip załączony powyżej). Ludzie robią to za pomocą pojedynczych samogłosek, ale nie całych zdań. Postanowiłem więc uogólnić pytanie i znaleźć sposób na parametryczną degradację całego spektrum informacji audio.
@CarlWitthoft Twoje rozwiązanie dostosowuje tylko amplitudę szumu, a jak powiedziałem - potrzebuję czegoś, co łączy szum z sygnałem. Daj +1 sugestii, że potrzebuję różnych próbek białego szumu - to może rzeczywiście zrobić różnicę, jak zauważyłeś.
Cóż ... Przytaczam tutaj ignorancję: jaka jest matematyczna definicja „miksowania” dwóch strumieni audio? Naiwnie zakładałem, że pomijając istnienie programowalnego filtra, wszystko, co możesz zrobić z dwoma wektorami amplitud próbkowanych w czasie, to dodać je.

Odpowiedzi:

11

Przeczytałem twoje pierwotne pytanie i nie byłem do końca pewien, do czego zmierzasz, ale teraz jest o wiele wyraźniejsze. Problem polega na tym, że mózg jest wyjątkowo dobry w rozpoznawaniu mowy i emocji, nawet gdy hałas w tle jest bardzo wysoki, co oznacza, że ​​twoje dotychczasowe próby zakończyły się jedynie ograniczonym sukcesem.

Myślę, że kluczem do uzyskania tego, czego chcesz, jest zrozumienie mechanizmów, które przekazują treść emocjonalną, ponieważ są one w większości oddzielone od tych, które przekazują zrozumiałość. Mam trochę doświadczenia w tym zakresie (w rzeczywistości moja praca dyplomowa dotyczyła podobnego tematu), więc spróbuję zaproponować kilka pomysłów.

Rozważ dwie próbki jako przykłady bardzo emocjonalnej mowy, a następnie zastanów się, co byłoby przykładem „pozbawionym emocji”. Najlepsze, o czym mogę teraz myśleć, to generowany komputerowo głos typu „Stephen Hawking”. Więc jeśli dobrze rozumiem, to co chcesz zrobić, to zrozumieć różnice między nimi i dowiedzieć się, jak zniekształcić próbki, aby stopniowo stać się jak generowany komputerowo głos bez emocji.

Powiedziałbym, że dwa główne mechanizmy pozwalające uzyskać to, czego chcesz, to zniekształcenie wysokości dźwięku i czasu, ponieważ wiele treści emocjonalnych zawartych jest w intonacji i rytmie mowy. Sugestia kilku rzeczy, które warto spróbować:

  1. Efekt typu zniekształcenia tonu, który powoduje wygięcie tonu i redukuje intonację. Można to zrobić w ten sam sposób, w jaki działa Antares Autotune, w którym stopniowo wygina się wysokość dźwięku w kierunku stałej wartości, aż do uzyskania pełnego monotonu.

  2. Efekt rozciągnięcia w czasie, który zmienia długość niektórych części mowy - być może fonemy o stałym głosie, które przerywają rytm mowy.

Teraz, jeśli zdecydujesz się podejść do jednej z tych metod, to będę szczery - nie są one tak łatwe do zaimplementowania w DSP i nie będzie to tylko kilka wierszy kodu. Będziesz musiał popracować, aby zrozumieć przetwarzanie sygnału. Jeśli znasz kogoś z Pro-Tools / Logic / Cubase i kopią Antares Autotune, prawdopodobnie warto spróbować sprawdzić, czy przyniesie pożądany efekt, zanim spróbujesz samodzielnie napisać coś podobnego.

Mam nadzieję, że to daje ci kilka pomysłów i trochę pomaga. Jeśli potrzebujesz wyjaśnienia któregokolwiek z moich słów, daj mi znać.

Czerwone oko
źródło
Dziękuję za sugestie @Redeye. Rozciągnięcie w czasie nie jest niestety opcją, ponieważ będą warunki, w których przedstawię im informacje wideo, więc muszę zachować zmodyfikowaną mowę na tej samej długości co oryginalna. Zniekształcenie podziałki jest interesującym podejściem - czy znasz jakieś opublikowane odniesienia, aby lepiej wyjaśnić tę metodę?
Geek On Acid
1
Przesunięcie mowy w celu wykonania tego, co chcesz, będzie wymagało dwóch etapów - po pierwsze analizy mowy w celu ustalenia bieżącego profilu częstotliwości podstawowej, a następnie zmiany wysokości tonu. Analiza jest dość prosta i istnieje kilka metod, które są skuteczne. Zmiana tonacji jest bardziej złożona - spróbuję przeszukać dziennik AES w poszukiwaniu opublikowanych odniesień (JAES Volume 47 Issue 11 str. 928-936; Listopad 1999 wydaje się być przydatny). Jak powiedziałem wcześniej, przechodzisz tutaj przez dość skomplikowane przetwarzanie i na pewno warto najpierw spróbować z Autotune.
Redeye
2
Redeye ma dobre sugestie, ale chciałbym tylko zauważyć, że w przypadku mowy z przesunięciem tonu nie zaleciłbym wokodera fazowego ani żadnego podejścia w dziedzinie częstotliwości - PSOLA (dodawanie nakładania się z synchronizacją tonu) jest dobrym sposobem, ponieważ będzie brzmiał lepiej dla monofoniczny instrument z zablokowaną fazą jak głos.
sznurek
4

Sugeruję, abyś otrzymał oprogramowanie do produkcji muzyki i bawił się nim, aby uzyskać pożądany efekt. Tylko wtedy powinieneś się martwić programowym rozwiązaniem tego problemu. (Jeśli oprogramowanie muzyczne można wywołać z wiersza poleceń, możesz wywołać je z R lub MATLAB).


Inną możliwością, o której nie dyskutowano, jest całkowite wyeliminowanie emocji za pomocą oprogramowania syntezatora mowy w celu utworzenia łańcucha, a następnie oprogramowania syntezatora mowy w celu przekształcenia łańcucha w głos robota. Zobacz /programming/491578/how-do-i-convert-speech-to-text i /programming/637616/open-source-text-to-speech-library .

Aby to działało niezawodnie, prawdopodobnie będziesz musiał przeszkolić pierwsze oprogramowanie do rozpoznawania głośnika.

Richie Cotton
źródło
Potrzebuję filtrować oryginalne pliki, więc zamiana tekstu na mowę nie jest naprawdę niestety opcją, chociaż mogę pomyśleć o jakimś morfingu paradygmacie między normalną mową a mową syntetyczną.
Geek On Acid