R 또는 Matlab에서 제안을 수락하게되어 기쁘지만 아래에 제시된 코드는 R 전용입니다.
아래 첨부 된 오디오 파일은 두 사람 사이의 짧은 대화입니다. 저의 목표는 감정적 인 내용을 인식 할 수 없도록 말을 왜곡하는 것입니다. 어려움은이 왜곡이 1에서 5까지 말할 수있는 매개 변수 공간이 필요하다는 것입니다. 여기서 1은 '높은 인식 가능한 감정'이고 5는 '인식 할 수없는 감정'입니다. R을 사용하여 달성 할 수 있다고 생각한 세 가지 방법이 있습니다.
첫 번째 방법은 소음을 도입하여 전반적인 명료성을 낮추는 것이 었습니다. 이 솔루션은 아래에 제시되어 있습니다 (그의 제안에 대해 @ carl-witthoft에게 감사드립니다). 이렇게하면 음성의 명료성과 감정적 내용이 감소하지만 매우 '더러운'접근 방식입니다. 제어 할 수있는 유일한 측면은 잡음의 진폭 (볼륨)이 있기 때문에 파라 메트릭 공간을 확보하기가 어렵습니다.
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)
두 번째 방법은 잡음을 조정하여 특정 주파수 대역에서만 음성을 왜곡하는 것입니다. 원래 오디오 웨이브에서 진폭 엔벨로프를 추출하고이 엔벨로프에서 노이즈를 생성 한 다음 노이즈를 오디오 웨이브에 다시 적용하여 할 수 있다고 생각했습니다. 아래 코드는이를 수행하는 방법을 보여줍니다. 노이즈 자체와는 다른 방식으로 작동하여 사운드가 크래킹되지만 같은 지점으로 돌아갑니다. 노이즈 진폭 만 변경할 수 있습니다.
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)
최종 접근법이 이것을 해결하는 열쇠 일지 모르지만 매우 까다 롭습니다. 나는이 방법 발견 에 게시 된 보고서 용지 과학 섀넌 등으로합니다. (1996) . 그들은 상당히 까다로운 스펙트럼 감소 패턴을 사용하여 아마도 로봇처럼 들리는 것을 달성했습니다. 그러나 동시에, 설명에서, 나는 그들이 내 문제에 대답 할 수있는 해결책을 찾은 것으로 가정합니다. 중요한 정보는 참고 문헌 및 참고 문헌 의 텍스트 및 메모 번호 7의 두 번째 단락에 있습니다.-전체 방법이 여기에 설명되어 있습니다. 지금까지 복제 시도가 실패했지만 아래는 절차를 수행하는 방법에 대한 해석과 함께 내가 찾은 코드입니다. 나는 거의 모든 퍼즐이 있다고 생각하지만 아직 전체 그림을 얻을 수는 없습니다.
###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
결과는 어떻습니까? 쉰 목소리, 시끄러운 크래킹 사이에 있지만 로봇이 많지 않아야합니다. 대화가 이해하기 쉽게 확장 될 수 있다면 좋을 것입니다. 나는 모두 주관적이지만 그에 대해 걱정하지 마십시오. 거친 제안과 느슨한 해석은 매우 환영합니다.
참고 문헌 :
- Shannon, RV, Zeng, FG, Kamath, V., Wygonski, J., & Ekelid, M. (1995). 주로 일시적인 신호를 이용한 음성 인식. Science , 270 (5234), 303. http://www.cogsci.msu.edu/DSS/2007-2008/Shannon/temporal_cues.pdf 에서 다운로드
noisy <- audio + k*white_noise
다양한 k 값을 사용하여 원하는 것을 수행하지 않는 이유는 무엇입니까? 물론 "지능형"은 매우 주관적이라는 것을 명심하십시오. 아, 그리고 단일 무작위 값 파일 white_noise
간의 잘못된 상관 관계로 인한 우연한 영향을 피하기 위해 수십 가지의 다른 샘플을 원할 것입니다 . audio
noise