溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

iOS下如何使用SoundTouch實(shí)現(xiàn)變聲并轉(zhuǎn)為wav格式進(jìn)行播放

發(fā)布時(shí)間:2021-10-21 10:16:18 來(lái)源:億速云 閱讀:279 作者:小新 欄目:移動(dòng)開(kāi)發(fā)

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

首先的問(wèn)題是:我們調(diào)用手機(jī)的麥克風(fēng)采集到的錄音數(shù)據(jù)是pcm格式的,pcm是裸數(shù)據(jù),沒(méi)有頭部信息,一般播放器不能播放,所以我們一般都要轉(zhuǎn)為wav格式,這樣普通的播放器就能播放了,而在iOS中直接可以使用AVAudioPlayer來(lái)播放,而不需要去調(diào)用底層的API了。關(guān)于如果將pcm轉(zhuǎn)為wav,大家可以參考我前面的博文,這里就不再介紹了。

第二個(gè)問(wèn)題是:如何變聲?還好有一個(gè)開(kāi)源軟件叫“soundtouch”,它是用c++寫(xiě)的,因此很容易集成到iOS中,而廣受好評(píng)的湯姆貓就是利用“soundtouch“來(lái)變聲的。下面介紹一下如何在iOS中編譯soundtouch:

1.  在 http://www.surina.net/soundtouch/sourcecode.html 這個(gè)網(wǎng)站下載soundtouch的源代碼,下載下來(lái)是一個(gè)壓縮包,解壓開(kāi)來(lái)的目錄結(jié)構(gòu)如下:

iOS下如何使用SoundTouch實(shí)現(xiàn)變聲并轉(zhuǎn)為wav格式進(jìn)行播放

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

iOS下如何使用SoundTouch實(shí)現(xiàn)變聲并轉(zhuǎn)為wav格式進(jìn)行播放

3.   默認(rèn)是沒(méi)有soundtouch_config.h這個(gè)頭文件的,因?yàn)樗唧w的平臺(tái)有關(guān),需要自己手工編譯生成。大家可以根據(jù)soundtouch的文檔說(shuō)明進(jìn)行編譯,如果不想自己編譯的話(huà),可以使用我編譯好的。

4.   然后將整個(gè)soundtouch下的文件全部添加到xcode中,因?yàn)槭莄++文件,所以要把相應(yīng)的.m文件修改為.mm文件以便支持c++編譯。

5.   默認(rèn)情況下,soundtouch使用的錄音數(shù)據(jù)是float類(lèi)型的,但是我們錄音數(shù)據(jù)一般都是short類(lèi)型,因此找到STTypes.h頭文件,將  #define SOUNDTOUCH_FLOAT_SAMPLES   1 這句注釋掉,將這句

#define SOUNDTOUCH_INTEGER_SAMPLES   1 打開(kāi),如下:

iOS下如何使用SoundTouch實(shí)現(xiàn)變聲并轉(zhuǎn)為wav格式進(jìn)行播放

6.  還有soundtouch和iOS都對(duì)BOOL進(jìn)行了typedef

    soundtouch:typedef int BOOL

    iOS: typedef signed char BOOL

    這樣編譯的時(shí)候有沖突,將soundtouch中也改成typedef signed char BOOL即可。

7.  變聲的時(shí)候只要使用一個(gè)頭文件soundtouch.h,將它導(dǎo)入到你的文件中,然后創(chuàng)建soundtouch對(duì)象,設(shè)置一些參數(shù):

iOS下如何使用SoundTouch實(shí)現(xiàn)變聲并轉(zhuǎn)為wav格式進(jìn)行播放

這些只是我自己設(shè)置的參數(shù),可以根據(jù)自己的需求進(jìn)行調(diào)整。

8.  調(diào)用 mSoundTouch.putSamples方法將錄音數(shù)據(jù)傳遞給soundtouch處理,有兩個(gè)參數(shù);第一個(gè)是錄音數(shù)據(jù),short *類(lèi)型,第二個(gè)是錄音數(shù)據(jù)的長(zhǎng)度。如果你的錄音數(shù)據(jù)是char *類(lèi)型的話(huà),需要強(qiáng)制轉(zhuǎn)換,例如:

char *pcmData = (char *)audioData.bytes;

int pcmSize = audioData.length;

int nSamples = pcmSize / 2;

   // 這里強(qiáng)制將char *轉(zhuǎn)為short *,注意長(zhǎng)度是原來(lái)的一般,因?yàn)橐粋€(gè)short相當(dāng)于2個(gè)char

   mSoundTouch.putSamples((short *)pcmData, nSamples);

9.   調(diào)用receiveSamples接收soundtouch處理完的數(shù)據(jù),這個(gè)方法同樣有兩個(gè)參數(shù),是存放數(shù)據(jù)的緩沖區(qū),因此我們事先要?jiǎng)?chuàng)建一個(gè)緩沖區(qū)來(lái)接收數(shù)據(jù),這個(gè)函數(shù)的返回值是實(shí)際接收到的大小。這個(gè)方法應(yīng)該在一個(gè)循環(huán)中調(diào)用,當(dāng)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];

我這個(gè)例子中,將接收到的數(shù)據(jù)存放在NSMutable中,由于NSMutable是按字節(jié)來(lái)存放的,因此大小要乘2,即numSamples*2。

10.  錄音數(shù)據(jù)變聲完后,需要在之前加上44個(gè)字節(jié)的頭部,轉(zhuǎn)為wav格式,然后保存

// 加上44個(gè)字節(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變聲的主要步驟了,附件中是完整的工程,可以直接運(yùn)行。

注意:這個(gè)工程只能運(yùn)行在真機(jī)上,同時(shí)必須是armv7以后的手機(jī)上。

運(yùn)行說(shuō)明:

1.  點(diǎn)擊“開(kāi)始說(shuō)話(huà)”,進(jìn)行錄音

2.  點(diǎn)擊“說(shuō)完了”,停止錄音

3.  錄音停止后會(huì)自動(dòng)進(jìn)行播放,播完后重新回到“開(kāi)始說(shuō)話(huà)”

關(guān)于“iOS下如何使用SoundTouch實(shí)現(xiàn)變聲并轉(zhuǎn)為wav格式進(jìn)行播放”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

ios
AI