2017-03-07 85 views
1

作爲一項學習練習,我試圖實現一個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功能的最好和最有效的方式?它會用於我的目的嗎?

+0

我發現我正在尋找的特定調製可能是環形調製。那是對的嗎? – ChaSIem

回答

0

該解決方案的簡化版本似乎是通過使用調製器信號對載波進行簡單的環形調製。

的主要思想是像 「顫音」 的效果,通過簡單地將信號數字陣列乘以顫音變化,即:

H [I] = inner_product(C [1],M [I])

是H的最終結果,C是載波,M是調製器,對於每個i,其中i是每個信號的每個數字採樣的索引。

在此版本中,信號必須具有相同的長度。

結果可能會受到失真的影響,但對我的目的應該沒問題。如果沒有人知道更好的解決方案,我認爲這將是正確的答案。