2010-01-06 15 views

回答

0

您正在尋找的技術被稱爲audio normalization。這個第三方代碼Mp3SoundCapture提供了一種方法,但它是一個單獨的應用程序,而不是一個庫。

+0

我還沒有下載的項目,所以我不知道有關的API - 但它看起來像一個捕捉程序,不是一個按摩已經錄製的文件的人。 – Egor 2010-01-06 09:01:56

+0

這是,但我的觀點是,你可以看看他們是如何做到的,並採納它來滿足你的需求。 – 2010-01-06 15:28:10

0

解決這個問題有兩種主要途徑有:

  1. 正常化這僅僅涉及到搜索的聲音最響亮的部分,然後放大整個文件,以便最響亮的部分變爲最大音量。如果聲音最大的部分是50%或更少,此技術纔有用。如果您的輸入文件中某處出現單個峯值達到最大音量,則標準化對您不起任何作用。

  2. 壓縮/限幅這需要一個稍微不同的方式,在音樂錄製廣泛使用。基本的想法是,超過一定音量的任何聲音(稱爲「閾值」)變得更安靜(或者在限制器的情況下,超過特定音量不允許聲音)。這會影響整個錄音的音量(安靜的位保持不變,而較大的位更安靜)。然後,您可以放大整個信號而不會使其失真(這稱爲補償增益)。有關更多信息,請參閱有關dynamic range compression的此文章。

至於在.NET實現這一點,NAudio會讓你在輸入WAV文件查看樣品,讓您創建自己的正常化作用。我還在Skype Voice Recorder中演示瞭如何在.NET中實現壓縮器。

您應該意識到的最後一件事是這些算法僅在您有權訪問示例值時纔有效。因此,例如,如果您的文件是MP3,則需要先轉換爲PCM,然後應用標準化/壓縮,最後再轉換回MP3。

2

這樣做的命令行程序是sox

該算法的總體思路是找到最高絕對值採樣(音頻應居中,無論採樣數據的測量如何)。

你用這個數字(它保證等於或小於你的值)除以你的最大可能值,然後你乘以你想要的峯值水平(即,你是否希望它達到最大值的95%?完全1.0 ?)。如果結果不是一個,它就成爲你的比例值。然後你遍歷你的文件並將每個樣本乘以該數字。例如,對於CD質量的音頻,樣本的最高可能絕對值是32767(爲了使示例更容易,實際範圍是-32768到32767,但將32767作爲最大值使得事情變得更簡單) ,所以如果你掃描完了,你發現的最高絕對值是18000,比你的放大係數是1.8203888 ...,如果你想讓你的最大音量達到0.9887997070223 *最大可用值,那麼給你一個新的比例因子爲1.8。因此,您循環播放保存音頻文件的數組,並將每個樣本的前一個值替換爲值* 1.8。

這可以通過先點擊濾波器來消除寄生瞬態,也可以通過去噪來優化,通過消除揚聲器無法產生的低頻分量,確保波形均勻地圍繞中值移動或者被人耳聽到。點擊過濾器是低通的,並且消除器是高通的。一旦這些濾波器運行,就會有更多的空間放大聲音而不會引入失真。

+0

感謝賈斯汀的解釋;我會看看Sox。 Levelator所做的一件事就是將音頻轉換爲絕對音量。如果我拿兩個聲音文件,一個音量很高,另一個非常低,我獨立地對它們進行平衡,他們聽起來和他們都是同一個水平。 Sox能做些什麼嗎? – Pablo 2010-01-18 16:43:00

+0

是的。你必須調用它兩次。首先告訴它分析,它會返回一個幅度尺度,以使其達到最大音量。然後根據以前的返回值調整音量(當然,如果您正在與另一個文件混合並希望它稍微安靜一點或其他),則可以調整該返回值。首先,你會基於對的輸出做「襪-n 統計-n」,然後,「襪 -v 」 – 2010-01-18 18:27:14

3

事實上,平衡器既不是壓縮器也不是標準器。是的,它正常化了,但它做得更多,比你用sox等做的更多智慧。把它看作是推子上的手,事先知道會發生什麼,甚至會知道什麼時候離開足夠單獨。看看這裏的算法討論:http://www.conversationsnetwork.org/levelatorAlgorithm

...道格(Levelator聯合創始人)

+0

有點像播放增益,但作爲一個壓縮步驟 – Spudd86 2010-06-18 22:57:46

+0

我們會付錢給許可Levelator完成作爲一個圖書館(如果我們能負擔得起),可惜你們不這樣做。 – Pablo 2010-06-22 10:25:20

相關問題