這篇文章將為大家詳細講解有關iOS下如何使用SoundTouch實現(xiàn)變聲并轉為wav格式進行播放,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

首先的問題是:我們調用手機的麥克風采集到的錄音數(shù)據(jù)是pcm格式的,pcm是裸數(shù)據(jù),沒有頭部信息,一般播放器不能播放,所以我們一般都要轉為wav格式,這樣普通的播放器就能播放了,而在iOS中直接可以使用AVAudioPlayer來播放,而不需要去調用底層的API了。關于如果將pcm轉為wav,大家可以參考我前面的博文,這里就不再介紹了。
第二個問題是:如何變聲?還好有一個開源軟件叫“soundtouch”,它是用c++寫的,因此很容易集成到iOS中,而廣受好評的湯姆貓就是利用“soundtouch“來變聲的。下面介紹一下如何在iOS中編譯soundtouch:
1. 在 http://www.surina.net/soundtouch/sourcecode.html 這個網(wǎng)站下載soundtouch的源代碼,下載下來是一個壓縮包,解壓開來的目錄結構如下:

2. 將里面所有的.h和.cpp文件拷出來,放到soundtouch目錄下:

3. 默認是沒有soundtouch_config.h這個頭文件的,因為它跟具體的平臺有關,需要自己手工編譯生成。大家可以根據(jù)soundtouch的文檔說明進行編譯,如果不想自己編譯的話,可以使用我編譯好的。
4. 然后將整個soundtouch下的文件全部添加到xcode中,因為是c++文件,所以要把相應的.m文件修改為.mm文件以便支持c++編譯。
5. 默認情況下,soundtouch使用的錄音數(shù)據(jù)是float類型的,但是我們錄音數(shù)據(jù)一般都是short類型,因此找到STTypes.h頭文件,將 #define SOUNDTOUCH_FLOAT_SAMPLES 1 這句注釋掉,將這句
#define SOUNDTOUCH_INTEGER_SAMPLES 1 打開,如下:

6. 還有soundtouch和iOS都對BOOL進行了typedef
soundtouch:typedef int BOOL
iOS: typedef signed char BOOL
這樣編譯的時候有沖突,將soundtouch中也改成typedef signed char BOOL即可。
7. 變聲的時候只要使用一個頭文件soundtouch.h,將它導入到你的文件中,然后創(chuàng)建soundtouch對象,設置一些參數(shù):

這些只是我自己設置的參數(shù),可以根據(jù)自己的需求進行調整。
8. 調用 mSoundTouch.putSamples方法將錄音數(shù)據(jù)傳遞給soundtouch處理,有兩個參數(shù);第一個是錄音數(shù)據(jù),short *類型,第二個是錄音數(shù)據(jù)的長度。如果你的錄音數(shù)據(jù)是char *類型的話,需要強制轉換,例如:
char *pcmData = (char *)audioData.bytes;
int pcmSize = audioData.length;
int nSamples = pcmSize / 2;
// 這里強制將char *轉為short *,注意長度是原來的一般,因為一個short相當于2個char
mSoundTouch.putSamples((short *)pcmData, nSamples);
9. 調用receiveSamples接收soundtouch處理完的數(shù)據(jù),這個方法同樣有兩個參數(shù),是存放數(shù)據(jù)的緩沖區(qū),因此我們事先要創(chuàng)建一個緩沖區(qū)來接收數(shù)據(jù),這個函數(shù)的返回值是實際接收到的大小。這個方法應該在一個循環(huán)中調用,當receiveSamples返回為0表示接收完畢,退出循環(huán),否則繼續(xù)接收,例如:
short *samples = newshort[pcmSize];
int numSamples = 0;
do {
memset(samples, 0, pcmSize);
numSamples = mSoundTouch.receiveSamples(samples, pcmSize);
[soundTouchDatas appendBytes:samples length:numSamples*2];
} while (numSamples > 0);
delete [] samples;
[audioData release];
我這個例子中,將接收到的數(shù)據(jù)存放在NSMutable中,由于NSMutable是按字節(jié)來存放的,因此大小要乘2,即numSamples*2。
10. 錄音數(shù)據(jù)變聲完后,需要在之前加上44個字節(jié)的頭部,轉為wav格式,然后保存
// 加上44個字節(jié)的wav頭
NSMutableData *wavDatas = [[NSMutableDataalloc] init];
int fileLength = soundTouchDatas.length;
void *header = createWaveHeader(fileLength, 1, 16000, 16);
[wavDatas appendBytes:header length:44];
[wavDatas appendData:soundTouchDatas];
// 保存到Documents目錄中
NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *filePath = [path stringByAppendingPathComponent:@"soundtouch.wav"];
[wavDatas writeToFile:filePath atomically:YES];
[soundTouchDatas release];
[wavDatas release];
以上就是使用soundtouch變聲的主要步驟了,附件中是完整的工程,可以直接運行。
注意:這個工程只能運行在真機上,同時必須是armv7以后的手機上。
運行說明:
1. 點擊“開始說話”,進行錄音
2. 點擊“說完了”,停止錄音
3. 錄音停止后會自動進行播放,播完后重新回到“開始說話”
關于“iOS下如何使用SoundTouch實現(xiàn)變聲并轉為wav格式進行播放”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
網(wǎng)站名稱:iOS下如何使用SoundTouch實現(xiàn)變聲并轉為wav格式進行播放-創(chuàng)新互聯(lián)
瀏覽地址:http://chinadenli.net/article40/hjjho.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作、品牌網(wǎng)站制作、做網(wǎng)站、定制開發(fā)、營銷型網(wǎng)站建設、App設計
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容