開源的音頻處理庫 SoundTouch 實現變聲技術
SoundTouch是一個開源的音頻處理庫,主要實現包含變速、變調、變速同時變調等三個 功能模塊,能夠對媒體流實時操作,也能對音頻文件操作。采用32位浮點或者16位定點,支持單聲道或者雙聲道,采樣率范圍為8k~48k。
要在ios中實現一個變聲技術,而且又要要求能在iphone 3g上也能運行,所以自帶的一些api就顯得比較麻煩,因此決定使用soundtouch開源庫,該庫可以實現變聲效果,包括可以調節聲音的頻率而不改變 聲音的長度,大家可以使用openal試試,改變頻率之后,聲音就會變短了。
呵呵,有了這個庫,其實我們就可以山寨一個talkingtom了,記住我不是叫大家去山寨,這里只是談談學習的技術。還是要創新才好啊。
過程大概如下:
首先下載soundtouch開源庫,這個可以到項目主頁去找了,http://www.surina.net/soundtouch/。
下載之后解壓,將“soundtouch/source/SoundTouch”中的文件全部拷貝到要添加的ios項目中,暫時記不清出要不要修改其他的參數了,如果又任何錯誤則歡迎討論,應該是可以直接編譯的,加入之后如下圖。
因為soundtouch是一個c++編寫的開源庫,所以要在ios中使用,就要和object-c混編了,該改后綴名的就改了吧。
下面我們要修改音頻文件主要調整的幾個函數如下了:
- mSoundTouch.setSampleRate(sampleRate);//設置聲音的采樣頻率
- mSoundTouch.setChannels(channels);//設置聲音的聲道
- m_SoundTouch.setTempoChange(tempoDelta);
//這個就是傳說中的變速不變調 - m_SoundTouch.setPitchSemiTones(pitchDelta);//設置聲音的pitch
- mSoundTouch.setRateChange(rateDelta);//設置聲音的速率
- //
quick是一個bool變量,USE_QUICKSEEK具體有什么用我暫時也不太清楚。 - mSoundTouch.setSetting(SETTING_USE_QUICKSEEK,
quick); - //
noAntiAlias是一個bool變量,USE_AA_FILTER具體有什么用我暫時也不太清楚。 - mSoundTouch.setSetting(SETTING_USE_AA_FILTER,
!(noAntiAlias));
其中mSoundTouch是一個soundtouch對象了。至于要怎么變就看你怎么調節參數了,soundtouch的特點好像就是吧聲音變得卡通了,這個按照自己的需求去選擇吧,也還有其他的一些開源庫了。
在文末會給大家提供一個soundtouch整合iphone自帶的SpeakHere的例子了,但是不知道能不能上傳,好像有點兒大,如果不能上傳就到http://weibo.com/yarin上找我吧。
最后需要注意的兩個問題:
已開始我編譯出來,聲音很奇怪也有噪音很大,還是花了很多時間來找原因,但是都無果,突然想起前面我們說過,它同時支持32位浮點和16位定點,默 認時采用32位浮點的,我將其改為16位定點數的,哈哈,對了,效果很好,更改方式在STTypes.h文件中找到FLOAT_SAMPLES宏,注釋 掉,并打開INTEGER_SAMPLES宏,如下:
- #if
!(INTEGER_SAMPLES || FLOAT_SAMPLES) -
-
/// Choose either 32bit floating point or 16bit integer sampletype -
/// by choosing one of the following defines, unless this selection -
/// has already been done in some other file. -
//// -
/// Notes: -
/// - In Windows environment, choose the sample format with the -
/// following defines. -
/// - In GNU environment, the floating point samples are used by -
/// default, but integer samples can be chosen by giving the -
/// following switch to the configure script: -
/// ./configure --enable-integer-samples -
/// However, if you still prefer to select the sample format here -
/// also in GNU environment, then please #undef the INTEGER_SAMPLE -
/// and FLOAT_SAMPLE defines first as in comments above. -
#define INTEGER_SAMPLES 1 //< 16bit integer samples -
//#define FLOAT_SAMPLES 1 //< 32bit float samples -
-
#endif
另外一個問題就是在模擬器上測試都完全無誤了,這個時候放到真機設備上,直接報錯,退出程序,又一個花了我不少時間的問題,最終發現,在真機上需要將聲道改變為單聲道,如下,在自己設置的時候使用:
- mSoundTouch.setChannels(2);//1則為單聲道
大功告成,當然了如果你要繼續了解soundtouch庫,那么這里(http://blog.csdn.net/leilu2008/article/details/6540575)又一系列的參考資料。