iOS下如何使用SoundTouch实现变声并转为wav格式进行播放-创新互联

这篇文章将为大家详细讲解有关iOS下如何使用SoundTouch实现变声并转为wav格式进行播放,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

创新互联2013年开创至今,先为杭州等服务建站,杭州等地企业,进行企业商务咨询服务。为杭州企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。

首先的问题是:我们调用手机的麦克风采集到的录音数据是pcm格式的,pcm是裸数据,没有头部信息,一般播放器不能播放,所以我们一般都要转为wav格式,这样普通的播放器就能播放了,而在iOS中直接可以使用AVAudioPlayer来播放,而不需要去调用底层的API了。关于如果将pcm转为wav,大家可以参考我前面的博文,这里就不再介绍了。

第二个问题是:如何变声?还好有一个开源软件叫“soundtouch”,它是用c++写的,因此很容易集成到iOS中,而广受好评的汤姆猫就是利用“soundtouch“来变声的。下面介绍一下如何在iOS中编译soundtouch:

1.  在 http://www.surina.net/soundtouch/sourcecode.html 这个网站下载soundtouch的源代码,下载下来是一个压缩包,解压开来的目录结构如下:

iOS下如何使用SoundTouch实现变声并转为wav格式进行播放

2.  将里面所有的.h和.cpp文件拷出来,放到soundtouch目录下:

iOS下如何使用SoundTouch实现变声并转为wav格式进行播放

3.  默认是没有soundtouch_config.h这个头文件的,因为它跟具体的平台有关,需要自己手工编译生成。大家可以根据soundtouch的文档说明进行编译,如果不想自己编译的话,可以使用我编译好的。

4.  然后将整个soundtouch下的文件全部添加到xcode中,因为是c++文件,所以要把相应的.m文件修改为.mm文件以便支持c++编译。

5.  默认情况下,soundtouch使用的录音数据是float类型的,但是我们录音数据一般都是short类型,因此找到STTypes.h头文件,将  #define SOUNDTOUCH_FLOAT_SAMPLES  1 这句注释掉,将这句

#define SOUNDTOUCH_INTEGER_SAMPLES  1 打开,如下:

iOS下如何使用SoundTouch实现变声并转为wav格式进行播放

6.  还有soundtouch和iOS都对BOOL进行了typedef

  soundtouch:typedef int BOOL

  iOS: typedef signed char BOOL

  这样编译的时候有冲突,将soundtouch中也改成typedef signed char BOOL即可。

7.  变声的时候只要使用一个头文件soundtouch.h,将它导入到你的文件中,然后创建soundtouch对象,设置一些参数:

iOS下如何使用SoundTouch实现变声并转为wav格式进行播放

这些只是我自己设置的参数,可以根据自己的需求进行调整。

8.  调用 mSoundTouch.putSamples方法将录音数据传递给soundtouch处理,有两个参数;第一个是录音数据,short *类型,第二个是录音数据的长度。如果你的录音数据是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处理完的数据,这个方法同样有两个参数,是存放数据的缓冲区,因此我们事先要创建一个缓冲区来接收数据,这个函数的返回值是实际接收到的大小。这个方法应该在一个循环中调用,当receiveSamples返回为0表示接收完毕,退出循环,否则继续接收,例如:

  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];

我这个例子中,将接收到的数据存放在NSMutable中,由于NSMutable是按字节来存放的,因此大小要乘2,即numSamples*2。

10.  录音数据变声完后,需要在之前加上44个字节的头部,转为wav格式,然后保存

// 加上44个字节的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实现变声并转为wav格式进行播放”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。

网站名称:iOS下如何使用SoundTouch实现变声并转为wav格式进行播放-创新互联
浏览地址:https://www.cdcxhl.com/article40/hjjho.html

成都网站建设公司_创新互联,为您提供企业网站制作品牌网站制作做网站定制开发营销型网站建设App设计

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

绵阳服务器托管