【问题标题】:Audio signal modulation to produce voice changing effects音频信号调制产生变声效果
【发布时间】: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


【解决方案1】:

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

主要思想类似于“颤音”效果,即通过简单地将信号数字阵列与颤音变化相乘:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2021-05-13
    • 2011-09-17
    • 2011-07-09
    • 2012-12-12
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    • 2018-07-18
    • 1970-01-01
    相关资源
    最近更新 更多