作爲一項學習練習,我試圖實現一個Java類,它能夠根據另一個音頻效果文件應用一些語音變化。音頻信號調製產生語音變化效果
E.G.比方說,我有一個音頻樣本,用來說出「hello world」和另一個「呼吸噪音」的音頻樣本,我想用噪音來調節聲音,以達到類似於「達斯維達」效果的效果。
谷歌搜索了一下,我發現這可以通過使用頻率調製來實現,所以我的第一個疑問是:頻率調製是我的問題的正確答案? (我不想意識到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函數的樣本,這是非常基本的,但沒有使用不同載體的例子(即我的噪聲效應)。
通過閱讀一些論文,我瞭解到信號屏蔽並不是我正在尋找的東西。例如,要將聲音改變爲機器人聲音或達斯維德效應,我可以在FFT上應用一些移位,或者改變一些音高,但在這種情況下,我想讓聲音看起來像是與另一個人講話聲音(例如想象一個鏈鋸或燃燒的火焰說出類似hello world的東西)。
所以我的問題是什麼是在我的代碼中實現FM功能的最好和最有效的方式?它會用於我的目的嗎?
我發現我正在尋找的特定調製可能是環形調製。那是對的嗎? – ChaSIem