[轉載][項目總結]在ios中使用soundtouch庫實現變聲

來源:互聯網
上載者:User

這篇文章是項目總結了。

做了段時間的項目,過程中也遇到了很多麻煩,但是好在終雩都解決了,這裡是這裡是項目之後憑著記憶總結出來,大家有遇到同樣的問題,希望能參考了,但是我記憶可能不太好了,要是實踐中有什麼問題可以直接給我留言,或者到weibo.com/yarin上找我了。

要在ios中實現一個變聲技術,而且又要要求能在iphone 3g上也能運行,所以內建的一些api就顯得比較麻煩,因此決定使用soundtouch開源庫,該庫可以實現變聲效果,包括可以調節聲音的頻率而不改變聲音的長度,大家可以使用openal試試,改變頻率之後,聲音就會變短了。

呵呵,有了這個庫,其實我們就可以山寨一個talkingtom了,記住我不是叫大家去山寨,這裡只是談談學習的技術。還是要創新才好啊。

SoundTouch是一個開源的音頻處理庫,主要實現包含變速、變調、變速同時變調等三個 功能模組,能夠對媒體流即時操作,也能對音頻檔案操作。採用32位浮點或者16位定點,支援單聲道或者雙聲道,採樣率範圍為8k~48k。

過程大概如下:

首先下載soundtouch開源苦,這個可以到官方網站去找了,http://www.surina.net/soundtouch/。

下載之後解壓,將“soundtouch/source/SoundTouch”中的檔案全部拷貝到要添加的ios項目中,暫時記不清出要不要修改其他的參數了,如果又任何錯誤則歡迎討論,應該是可以直接編譯的,加入之後如。

因為soundtouch是一個c++編寫的開源庫,所以要在ios中使用,就要和object-c混編了,該改尾碼名的就改了吧。

下面我們要修改音頻檔案主要調整的幾個函數如下了:

  1. mSoundTouch.setSampleRate(sampleRate);//設定聲音的採樣頻率 
  2. mSoundTouch.setChannels(channels);//設定聲音的聲道 
  3. m_SoundTouch.setTempoChange(tempoDelta); //這個就是傳說中的變速不變調 
  4. m_SoundTouch.setPitchSemiTones(pitchDelta);//設定聲音的pitch 
  5. mSoundTouch.setRateChange(rateDelta);//設定聲音的速率 
  6. // quick是一個bool變數,USE_QUICKSEEK具體有什麼用我暫時也不太清楚。 
  7. mSoundTouch.setSetting(SETTING_USE_QUICKSEEK, quick); 
  8. // noAntiAlias是一個bool變數,USE_AA_FILTER具體有什麼用我暫時也不太清楚。 
  9. mSoundTouch.setSetting(SETTING_USE_AA_FILTER, !(noAntiAlias)); 

其中mSoundTouch是一個soundtouch對象了。至於要怎麼變就看你怎麼調節參數了,soundtouch的特點好像就是吧聲音變得卡通了,這個按照自己的需求去選擇吧,也還有其他的一些開源庫了。

在文末會給大家提供一個soundtouch整合iphone內建的SpeakHere的例子了,2013最新美劇熱門排行榜但是不知道能不能上傳,好像有點兒大,如果不能上傳就到http://weibo.com/yarin上找我吧。

最後需要注意的兩個問題:

已開始我編譯出來,聲音很奇怪也有噪音很大,還是花了很多時間來找原因,但是都無果,突然想起前面我們說過,它同時支援32位浮點和16位定點,預設時採用32位浮點的,我將其改為16位定點數的,哈哈,對了,效果很好,更改方式在STTypes.h檔案中找到FLOAT_SAMPLES宏,注釋掉,並開啟INTEGER_SAMPLES宏,如下:

  1. #if !(INTEGER_SAMPLES || FLOAT_SAMPLES) 
  2.     
  3.     /// Choose either 32bit floating point or 16bit integer sampletype 
  4.     /// by choosing one of the following defines, unless this selection  
  5.     /// has already been done in some other file. 
  6.     //// 
  7.     /// Notes: 
  8.     /// - In Windows environment, choose the sample format with the 
  9.     ///   following defines. 
  10.     /// - In GNU environment, the floating point samples are used by  
  11.     ///   default, but integer samples can be chosen by giving the  
  12.     ///   following switch to the configure script: 
  13.     ///       ./configure --enable-integer-samples 
  14.     ///   However, if you still prefer to select the sample format here  
  15.     ///   also in GNU environment, then please #undef the INTEGER_SAMPLE 
  16.     ///   and FLOAT_SAMPLE defines first as in comments above. 
  17.     #define INTEGER_SAMPLES     1    //< 16bit integer samples 
  18.     //#define FLOAT_SAMPLES       1    //< 32bit float samples 
  19.   
  20.  #endif 

另外一個問題就是在模擬器上測試都完全無誤了,這個時候放到真機裝置上,直接報錯,退出程式,又一個花了我不少時間的問題,最終發現,在真機上需要將聲道改變為單聲道,如下,神奇影院在自己設定的時候使用:

  1. mSoundTouch.setChannels(2);//1則為單聲道 

大功告成,當然了如果你要繼續瞭解soundtouch庫,那麼這裡(http://blog.csdn.net/leilu2008/article/details/6540575)又一系列的參考資料。

附件已經上傳,下載之後請將zip尾碼去掉,!正確的後最應該是“.tar.gz”.

附件下載:
  speakhere

本文出自 “yarin's blog” 部落格,請務必保留此出處http://yarin.blog.51cto.com/1130898/640398

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.