我很高兴接受 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 等人在Science上发表的报告论文中发现了这种方法。(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)。主要具有时间线索的语音识别。科学,270 (5234),303。从http://www.cogsci.msu.edu/DSS/2007-2008/Shannon/temporal_cues.pdf下载