【发布时间】:2017-07-27 12:00:40
【问题描述】:
作为一项学习练习,我正在尝试实现一个能够根据另一个音频效果文件应用一些语音变化的 java 类。
例如假设我有一个我的声音说“你好世界”的音频样本和另一个“呼吸噪音”的音频样本,我想用噪音调制声音以实现类似“Darth Vader”的效果。
谷歌搜索了一下,我发现这可以通过使用频率调制来实现,所以我的第一个疑问是:频率调制是我问题的正确答案吗? (我不想实现 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 上应用一些移位或一些音高变化,但在这种情况下,我想让声音看起来像是和另一个人说话声音(例如,想象一把链锯或燃烧的火在说类似 hello world 的话)。
所以我的问题是在我的代码中实现 FM 功能的最佳和最有效的方法是什么?它对我的目的有用吗?
【问题讨论】:
-
我发现我正在寻找的特定调制可能是环形调制。对吗?
标签: java audio signals frequency modulation