参数化语音以删除情感内容


12

我很高兴接受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

那么结果听起来如何呢?它应该介于嘶哑,嘈杂的开裂之间,而不是那么机器人化。如果对话能保持某种可理解的程度,那将是很好的。我知道-有点主观,但是不用担心-非常欢迎提出野蛮的建议和松散的解释。

参考文献:


一种简单的方法是使用(noise + 1.0)调制声音,从而使其相乘。但是还有一个问题:您要做什么?使声音难以理解时,您的总体目标是什么?

1
为什么不简单地noisy <- audio + k*white_noise为k的多个值做您想要的?当然,请记住,“难以理解”是高度主观的。哦,您可能想要几十个不同的white_noise样本,以避免由于audio与单个随机值noise文件之间的错误关联而引起的任何偶然影响。

最终,我想从参数上降低听觉信息的可靠性,以便针对不同级别的操纵音频剪辑,准确性判断会有所不同。准确性判断将取决于情感-谈话是开心还是生气。问题在于,很难操纵长时间说话的情感内容(例如上面连接的剪辑)。人们只用一个元音,而不是整个句子。因此,我决定对此问题进行概括,并找出以参数方式降低整个音频信息频谱的方法。

@CarlWitthoft您的解决方案仅调整噪声的幅度,正如我所说-我需要噪声与信号混合在一起的东西。+1您关于我需要不同白噪声样本的建议-正如您所指出的,这的确可能会有所作为。

好吧...我在这里表示无知:“混合”两个音频流的数学定义是什么?我天真地假设,不考虑可编程滤波器的存在,您可以对两个时间采样幅度的向量进行加法运算。

Answers:


11

我读了您的原始问题,不确定您要得到什么,但是现在已经很清楚了。您遇到的问题是,即使背景噪音非常高,大脑也非常善于挑选言语和情感,而您现有的尝试仅取得了有限的成功。

我认为获得想要的东西的关键是理解传达情感内容的机制,因为这些机制与传达清晰度的机制大多是分开的。我对此有一些经验(实际上,我的学位论文是在类似的主题上),所以我将尝试提出一些想法。

将您的两个样本视为非常激动人心的演讲的示例,然后考虑什么将是“无情感”的示例。我现在能想到的最好的是计算机生成的“斯蒂芬·霍金”型语音。因此,如果我理解正确,那么您想要做的就是理解它们之间的差异,并弄清楚如何使样本失真,使其逐渐变得像计算机生成的无情感的声音。

我想说,要获得想要的两种主要机制是通过音调和时间失真,因为语音的语调和节奏中包含了许多情感内容。因此,提出了一些可能值得尝试的建议:

  1. 音高失真型效果,可弯曲音高并减少音调。这可以通过与Antares Autotune一样的方法来完成,在该方法中,您逐渐将音调逐渐向恒定值弯曲,直到它成为一个完整的单调为止。

  2. 时间拉伸效果会改变语音某些部分的长度-可能是恒定的浊音音素,会破坏语音的节奏。

现在,如果您决定采用这两种方法中的任一种,那么我会说实话-在DSP中实现它们并不是那么简单,而且也不会只是几行代码。您将需要做一些工作以了解信号处理。如果您认识具有Pro-Tools / Logic / Cubase的人和Antares Autotune的副本,那么在尝试编写类似的代码之前,可能有必要尝试看看它是否会达到您想要的效果。

希望能给您一些想法并有所帮助。如果您需要我解释我所说的话,请告诉我。


感谢您的建议@Redeye。不幸的是,时间延长不是一种选择,因为在某种情况下我会向他们提供视频信息,因此我需要使修改后的语音与原始语音保持相同的长度。音高失真是一种有趣的方法-您是否知道任何公开的参考文献可以更好地解释此方法?
Geek On Acid

1
对语音进行音高转换以完成您想要的操作将涉及两个阶段-首先是对语音进行分析以建立当前的基本频率曲线,其次是音高转换。分析非常简单,有几种有效的方法。音调变化更为复杂-我会尝试在AES期刊中搜索已发表的参考文献(JAES第47卷,第11期,第928-936页; 1999年11月看起来可能有用)。就像我之前说过的,您正在这里进行一些非常复杂的处理,因此绝对值得首先使用Autotune进行尝试。
Redeye 2012年

2
Redeye有很好的建议,但我只想指出,对于音调转换语音,我不建议使用相位声码器或任何频域方法-PSOLA(音调同步重叠叠加)是一种不错的选择,因为它听起来会更好单音锁相乐器之类的声音。
schnarf 2012年

4

我建议您获得一些音乐制作软件,并使用它来获得想要的效果。只有这样,您才需要担心以编程方式解决此问题。(如果可以从命令行调用音乐软件,则可以从R或MATLAB调用它)。


尚未讨论的另一种可能性是通过使用语音转文本软件创建字符串来完全消除情绪,然后使用语音转文本软件将字符串转换为机器人声音。参见 /programming/491578/how-do-i-convert-speech-to-text/programming/637616/open-source-text-to-speech-library

为了使此功能可靠地工作,您可能必须训练第一个软件才能识别说话者。


我需要过滤原始文件,因此尽管我可能会想到普通语音和合成语音之间的一些变形范例,但文本转语音并不是真正的选择。
Geek On Acid
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.