在ios中使用soundtouch库实现变声

要在ios中实现一个变声技术,而且又要要求能在iphone 3g上也能运行,所以自带的一些api就显得比较麻烦,因此决定使用soundtouch开源库,该库可以实现变声效果,包括可以调节声音的频率而不改变声音的长度,大家可以使用openal试试,改变频率之后,声音就会变短了。

呵呵,有了这个库,其实我们就可以山寨一个talkingtom了,记住我不是叫大家去山寨,这里只是谈谈学习的技术。还是要创新才好啊。

SoundTouch是一个开源的音频处理库,主要实现包含变速、变调、变速同时变调等三个 功能模块,能够对媒体流实时操作,也能对音频文件操作。采用32位浮点或者16位定点,支持单声道或者双声道,采样率范围为8k~48k。

过程大概如下:

首先下载soundtouch开源库,这个可以到 官方网站去找了。

下载之后解压,将“soundtouch/source/SoundTouch”中的文件全部拷贝到要添加的ios项目中,暂时记不清出要不要修改其他的参数了,如果又任何错误则欢迎讨论,应该是可以直接编译的,加入之后如下图。



因为soundtouch是一个c++编写的开源库,所以要在ios中使用,就要和object-c混编了,该改后缀名的就改了吧。

下面我们要修改音频文件主要调整的几个函数如下了:
?
1
2
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的例子了,但是不知道能不能上传,好像有点儿大,如果不能上传就到http://weibo.com/yarin上找我吧。

最后需要注意的两个问题:

已开始我编译出来,声音很奇怪也有噪音很大,还是花了很多时间来找原因,但是都无果,突然想起前面我们说过,它同时支持32位浮点和16位定点,默认时采用32位浮点的,我将其改为16位定点数的,哈哈,对了,效果很好,更改方式在STTypes.h文件中找到FLOAT_SAMPLES宏,注释掉,并打开INTEGER_SAMPLES宏,如下:
?
1
2
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

另外一个问题就是在模拟器上测试都完全无误了,这个时候放到真机设备上,直接报错,退出程序,又一个花了我不少时间的问题,最终发现,在真机上需要将声道改变为单声道,如下,在自己设置的时候使用:
?
1
mSoundTouch.setChannels(2); //1则为单声道

大功告成,当然了如果你要继续了解soundtouch库,那么这里(http://blog.csdn.net/leilu2008/article/details/6540575)又一系列的参考资料。

附件下载 SpeakHere.tar.gz


转自:http://www.oschina.net/question/163910_28228

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值