下面附带的音频文件是两个人之间简短的对话。我的目标是使他们的讲话失真,使情感内容变得无法识别。困难在于,我需要一些参数空间来使这种变形从1到5,其中1是“高度可识别的情绪”,而5是“不可识别的情绪”。我认为我可以使用三种方法来实现R。
从这里下载“快乐”音频波。
从这里下载“愤怒”音频波。
第一种方法是通过引入噪声来降低整体清晰度。下面介绍了此解决方案(感谢@ carl-witthoft的建议)。这将同时降低语音的清晰度和情感内容,但这是非常“肮脏”的方法-很难正确地获得参数空间,因为您可以控制的唯一方面是噪声(音量)。 br />
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
那么结果如何听起来呢?它应该介于嘶哑,嘈杂的开裂之间,而不是那么机器人化。如果对话能保持某种可理解的程度,那将是很好的。我知道-这有点主观,但不必担心-非常欢迎提出野蛮的建议和松散的解释。
参考文献:
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
#1 楼
我读了您的原始问题,不确定您要得到什么,但是现在已经很清楚了。您遇到的问题是,即使背景噪音非常高,大脑也非常善于挑选言语和情感,而您现有的尝试仅取得了有限的成功。我认为,获得想要的东西的关键是理解传达情感内容的机制,因为这些机制与传达清晰度的机制大多是分开的。我对此有一些经验(实际上,我的学位论文是在类似的主题上),所以我将尝试提出一些想法。
将您的两个样本视为非常令人激动的演讲的示例,然后考虑什么是“无情”的例子。我现在能想到的最好的是计算机生成的“斯蒂芬·霍金”式语音。因此,如果我正确理解您想要做的就是理解它们之间的差异,并弄清楚如何使样本失真,使其逐渐变得像计算机生成的无情感的声音。
我会说这两者主要的机制是通过音调和时间失真来实现的,因为语音的语调和节奏中包含了许多情感内容。因此,建议您做一些可能值得尝试的事情:
音高失真类型效果可以弯曲音高并减少音调。这可以通过与Antares Autotune相同的方法来完成,在该方法中,您逐渐将音调逐渐向恒定值弯曲,直到它成为一个完整的单调。
时间拉伸效果会改变语音的某些部分的长度-也许是不断发声的音素会破坏语音的节奏。
现在,如果您决定采用这两种方法中的任一种,那么我会说实话-在DSP中实现它们并不是那么简单,而且也不会只是几行代码。您将需要做一些工作以了解信号处理。如果您认识具有Pro-Tools / Logic / Cubase的人以及Antares Autotune的副本,那么在尝试编写类似的代码之前,可能值得尝试看看它是否会达到您想要的效果。
我希望能给您一些想法并有所帮助。如果您需要我解释我所说的话,请告诉我。
评论
$ \ begingroup $
感谢您的建议@Redeye。不幸的是,时间延长不是一种选择,因为在某种情况下我会向他们提供视频信息,因此我需要使修改后的语音的长度与原始语音相同。音高失真是一种有趣的方法-您是否知道任何公开的参考文献可以更好地解释此方法?
$ \ endgroup $
–极客酸
2012年1月24日在16:48
$ \ begingroup $
将语音进行音调转换以完成您想要的操作将涉及两个阶段-首先分析语音以建立当前的基本频率曲线,然后进行音调转换。分析非常简单,有几种有效的方法。音调变化更加复杂-我会尝试在AES期刊中搜索已发表的参考文献(JAES第47卷第11期928-936页; 1999年11月看起来可能有用)。就像我之前说过的那样,您正在这里进行一些非常复杂的处理,因此绝对值得首先使用Autotune进行尝试。
$ \ endgroup $
–红眼
2012年1月24日19:12
$ \ begingroup $
Redeye有很好的建议,但是我要指出的是,对于音调转换语音,我不建议使用相位声码器或任何频域方法-PSOLA(音调同步重叠添加)是一种不错的选择,因为它会对于单声道锁相乐器(如声音),声音听起来更好。
$ \ endgroup $
– schnarf
2012年1月30日,1:14
#2 楼
我建议您获得一些音乐制作软件,并使用它来获得想要的效果。只有这样,您才需要担心以编程方式解决此问题。 (如果可以从命令行调用音乐软件,则可以从R或MATLAB调用它。)尚未讨论的另一种可能性是完全消除通过使用语音转文本软件创建字符串,然后使用文本转语音软件将字符串转换为机器人语音来表达情感。参见
https://stackoverflow.com/questions/491578/how-do-i-convert-speech-to-text
和
https://stackoverflow.com/questions/637616 / open-source-text-to-speech-library。
要使此功能可靠运行,您可能必须训练第一套软件才能识别说话者。
评论
$ \ begingroup $
我需要过滤原始文件,因此尽管我可能会想到普通语音和合成语音之间的某些变形范例,但文本转语音并不是真正的选择。
$ \ endgroup $
–极客酸
2012年1月24日17:21
评论
一种简单的方法是使用(noise + 1.0)调制声音,从而使其相乘。但是还有一个问题:您要做什么?使声音难以理解时您的总体目标是什么?为什么不简单地对各种k值进行嘈杂的<-audio + k * white_noise呢?当然,请记住,“难以理解”是高度主观的。哦,您可能想要几十个不同的white_noise样本,以避免由于音频和单个随机值噪声文件之间的虚假关联而产生的任何巧合效应。
最终,我想从参数上降低听觉信息的可靠性,以便对不同级别的音频片段进行不同的准确性判断。准确性判断将取决于情感-谈话是开心还是生气。问题在于,很难操纵长时间说话的情感内容(例如上面连接的我的剪辑)。人们只用一个元音,而不是整个句子。因此,我决定对此问题进行概括,并找出以参数方式降低整个音频信息频谱的方法。
@CarlWitthoft您的解决方案仅调整噪声的幅度,正如我所说-我需要将噪声与信号混合的东西。 +1您关于我需要不同白噪声样本的建议-正如您所指出的,这的确可能会有所作为。
好吧...我在这里表示无知:“混合”两个音频流的数学定义是什么?我只是天真地假设,不考虑可编程滤波器的存在,您可以对两个时间采样幅度的向量进行加法运算。