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)
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)
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:
- Shannon, RV, Zeng, FG, Kamath, V., Wygonski, J., i Ekelid, M. (1995). Rozpoznawanie mowy z użyciem przede wszystkim wskazówek czasowych. Science , 270 (5234), 303. Pobierz z http://www.cogsci.msu.edu/DSS/2007-2008/Shannon/temporal_cues.pdf
noisy <- audio + k*white_noise
róż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óżnychwhite_noise
próbek, aby uniknąć przypadkowych efektów z powodu fałszywej korelacji międzyaudio
jednymnoise
plikiem o losowej wartości .Odpowiedzi:
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ć:
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.
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ć.
źródło
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.
źródło