我很高兴接受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)
最终的方法可能是解决此问题的关键,但这非常棘手。我在Shannon等人在《科学》杂志上发表的报告中找到了这种方法。(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
那么结果听起来如何呢?它应该介于嘶哑,嘈杂的开裂之间,而不是那么机器人化。如果对话能保持某种可理解的程度,那将是很好的。我知道-有点主观,但是不用担心-非常欢迎提出野蛮的建议和松散的解释。
参考文献:
- 香农,RV,曾,FG,卡马斯,V。,威贡斯基,J。和埃凯里德,M。(1995)。语音识别主要具有时间提示。科学 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
文件之间的错误关联而引起的任何偶然影响。