音频信号调制产生语音转换效果

时间:2017-03-07 10:18:44

标签: java audio signals frequency modulation

作为一项学习练习,我正在尝试实现一个能够根据另一个音频效果文件应用一些语音更改的java类。

E.G。让我们说我有一个我的声音的音频样本说"你好世界"和另一个呼吸噪音的音频样本",我想用噪音调制声音,以达到像达斯维达"效果。

谷歌搜索了一下我发现这可以通过使用频率调制来实现,所以我首先怀疑:频率调制是我问题的正确答案吗? (我不想实现darth vader的声音效果,我想让声音听起来像是用普通的噪音效果说的。)

假设频率调制是正确的答案,我试图弄清楚如何在java中实现它并最终达到类似的目的:

public void modulate(File voice, File effect, File output) {
   AmplitudeData ampVoice = readAudioFile(voice);
   AmplitudeData ampEffect = readAudioFile(effect);
   FFT fftVoice = FFT(ampVoice);
   FFT fftEffect = FFT(ampVoice);
   FFT fftModulated = FM(fftVoice,fftEffect);
   AmplitudeData ampModulated = IFFT(fftModulated);
   writeAmplitudeToFile(ampModulated, "WAV");
}

我基本上知道如何应用FFT和IFFT,但我仍在寻找可能比我的更好的稳定高效的开源代码,所以假设我能够将音频文件(例如MP3)读入幅度表示然后产生音频文件的FFT表示。此外,可以计算逆FFT。

关于FM(我不是信号处理方面的专家),我发现使用sin函数的样本非常基本,但没有使用不同载波的例子(即我的噪声效应)。

通过阅读一些论文,我明白信号屏蔽不是我想要的。例如,要将声音更改为机器人声音或darth vader效果,我可以在FFT上应用一些移位,或者一些音高变化,但在这种情况下,我想让声音看起来像是用另一个说话声音(例如想象一个链锯或灼热的火焰,说出类似于你好世界的东西)。

所以我的问题是在我的代码中实现FM功能的最佳和最有效的方法是什么?它能用于我的目的吗?

1 个答案:

答案 0 :(得分:0)

该解决方案的简化版似乎是通过使用调制器信号对载波进行简单的环形调制。

主要思想就像“颤音”效应,即简单地将信号数字阵列与颤音变换相乘:

h [i] = inner_product(c [i],m [i])

是最终结果,C是载波,M是调制器,对于每个i,其中i是每个信号的每个数字样本的索引。

在此版本中,信号的长度必须相同。

结果可能会受到失真的影响,但它应该适合我的目的。如果没有其他人知道更好的解决方案,我认为这将是正确的答案。