在ios中使用soundtouch庫實現變聲

2021-07-09 22:03:04 字數 3855 閱讀 7330

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

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

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

過程大概如下:

官方**去找了。

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

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

12

3

4

5

6

7

8

9

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的例子了,但是不知道能不能上傳,好像有點兒大,如果不能上傳就到上找我吧。

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

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

12

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

#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

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

1msoundtouch.setchannels(2);//1則為單聲道

大功告成,當然了如果你要繼續了解soundtouch庫,那麼這裡(又一系列的參考資料。

speakhere.tar.gz

**:

在 iOS 中使用 iconfont

在講icon font之前,首先先來看看普通自定義字型是如何在ios中使用的,兩個原理是一樣的。這裡以kaushanscript regular為例 step 1 匯入字型檔案 將字型檔案拖入專案 ios支援的字型格式有 ttf otf,其他格式不確定 然後再在專案的資源池中確認字型檔案是否加入專案...

在iOS中使用icon font

在開發阿里資料ios版客戶端的時候,由於專案進度很緊,專案裡的所有圖示都是用最平常的背景方案來實現。而為了要相容普通屏與retina屏的裝置,蘋果要求每個背景圖都要以兩種尺寸存 閱讀器 icon font ios 在開發阿里資料ios版客戶端的時候,由於專案進度很緊,專案裡的所有圖示都是用最平常的背...

在iOS開發中使用FMDB

sqlite 是乙個輕量級的關聯式資料庫。ios sdk很早就支援了sqlite,在使用時,只需要加入 libsqlite3.dylib 依賴以及引入 sqlite3.h 標頭檔案即可。但是,原生的sqlite api在使用上相當不友好,在使用時,非常不便。於是,開源社群中就出現了一系列將sqlit...