[项目总结]在ios中使用soundtouch库实现变声

这篇文章是项目总结了。

做了段时间的项目,过程中也遇到了很多麻烦,但是好在终于都解决了,这里是这里是项目之后凭着记忆总结出来,大家有遇到同样的问题,希望能参考了,但是我记忆可能不太好了,要是实践中有什么问题可以直接给我留言,或者到weibo.com/yarin上找我了。

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

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

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

过程大概如下:

首先下载soundtouch开源苦,这个可以到官方网站去找了,http://www.surina.net/soundtouch/。

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

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

下面我们要修改音频文件主要调整的几个函数如下了:

 
  1. mSoundTouch.setSampleRate(sampleRate);//设置声音的采样频率 
  2. mSoundTouch.setChannels(channels);//设置声音的声道 
  3. m_SoundTouch.setTempoChange(tempoDelta); //这个就是传说中的变速不变调 
  4. m_SoundTouch.setPitchSemiTones(pitchDelta);//设置声音的pitch 
  5. mSoundTouch.setRateChange(rateDelta);//设置声音的速率 
  6. // quick是一个bool变量,USE_QUICKSEEK具体有什么用我暂时也不太清楚。 
  7. mSoundTouch.setSetting(SETTING_USE_QUICKSEEK, quick); 
  8. // noAntiAlias是一个bool变量,USE_AA_FILTER具体有什么用我暂时也不太清楚。 
  9. 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. #if !(INTEGER_SAMPLES || FLOAT_SAMPLES) 
  2.     
  3.     /// Choose either 32bit floating point or 16bit integer sampletype 
  4.     /// by choosing one of the following defines, unless this selection  
  5.     /// has already been done in some other file. 
  6.      
  7.     /// Notes: 
  8.     /// - In Windows environment, choose the sample format with the 
  9.     ///   following defines. 
  10.     /// - In GNU environment, the floating point samples are used by  
  11.     ///   default, but integer samples can be chosen by giving the  
  12.     ///   following switch to the configure script: 
  13.     ///       ./configure --enable-integer-samples 
  14.     ///   However, if you still prefer to select the sample format here  
  15.     ///   also in GNU environment, then please #undef the INTEGER_SAMPLE 
  16.     ///   and FLOAT_SAMPLE defines first as in comments above. 
  17.     #define INTEGER_SAMPLES     1    //< 16bit integer samples 
  18.     //#define FLOAT_SAMPLES       1    //< 32bit float samples 
  19.   
  20.  #endif 

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

 
  1. mSoundTouch.setChannels(2);//1则为单声道 

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

附件已经上传,下载之后请将zip后缀去掉,!正确的后最应该是“.tar.gz”.




本文转自 yarin 51CTO博客,原文链接:http://blog.51cto.com/yarin/640398,如需转载请自行联系原作者

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/279346.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Myeclipse优化配置

2019独角兽企业重金招聘Python工程师标准>>> 作为企业级开发最流行的工具&#xff0c;用Myeclipse开发java web程序无疑是最合适的&#xff0c;java web前端采用jsp来显示&#xff0c;myeclipse默认打开jsp的视图有卡顿的现象&#xff0c;那么如何更改jsp默认的打开…

Java多线程之静态代理

1 package org.study2.javabase.ThreadsDemo.staticproxy;2 3 /**4 * Date:2018-09-18 静态代理 设计模式5 * 1、真实角色6 * 2、代理角色&#xff1a;持有真实角色的引用7 * 3、二者实现相同的接口8 * 举例说明&#xff1a;Couple类和Company类都实现了Marry&#xff0c;…

Google在Android P中隐藏了真棒的按应用自动旋转功能

Historically, when you turn your phone on its side, the screen rotates. To keep this from happening, you can lock the orientation. But with Android P, Google included a way to have to the best of both worlds. 从历史上看&#xff0c;当您将手机侧放时&#xff…

python 位置参数、默认参数、可变参数位置关系_python的位置参数、默认参数、关键字参数、可变参数区别...

一、位置参数调用函数时根据函数定义的参数位置来传递参数#!/usr/bin/env python#codingutf-8defprint_hello(name, sex):sex_dict {1: u先生, 2: u女士}print hello %s %s, welcome to python world! %(name, sex_dict.get(sex, u先生))#两个参数的顺序必须一一对应&#xff0…

2015年终总结

2019独角兽企业重金招聘Python工程师标准>>> 2015年终总结 用勇气改变可以改变的事情&#xff0c;用胸怀接受不可以改变的事情&#xff0c;然后用智慧分辨两者的不同&#xff01; 短信平台sms 影像系统fastfile 统一信任中心uts(单点登录&#xff09; 简历增加 总结…

笔记本本地连接显示电缆拔出_没有安全电缆槽的笔记本电脑如何固定?

笔记本本地连接显示电缆拔出Historically laptops included a slot in the side for attaching security cables–as seen in the photo here–but increasingly more slender laptops like ultrabooks are omitting the lock-slot from their case design. How do you properl…

JMeter中添加dubbo相关插件异常问题解决

从网上下载了一个dubbo的插件&#xff0c;然后放到JMeter的/lib/ext目录下&#xff1a; 然后启动直接异常 发现启动不了&#xff0c;然后下载了一个全新的JMeter3.2将dubbo插件放到同样的目录&#xff0c;启动&#xff0c;没有问题&#xff1a; 那应该不是JMeter本身的问题 通过…

向量空间余弦相似度

设向量a和向量b 则a•b|a||b|cos,|a|和|b|分别为两向量的模 cos即为两向量的余弦值&#xff0c;所以cosa•b/|a||b| 距离和相似性度量: http://blog.sina.com.cn/s/blog_6045a9da01011nk7.html 转载于:https://www.cnblogs.com/lsai/p/3715948.html

linux提升文件夹权限命令_Linux常用命令_(文件权限)

Linux权限管理&#xff1a;二、权限管理1、3种基本权限在Linux中&#xff0c;将使用系统资源的人员分为4类&#xff1a;超级用户、文件或目录的属主、属主的同组人和其他人员。超级用户拥有对Linux系统一切操作权限&#xff0c;对 于其他3类用户都要指定对文件和目录的访问权限…

Servlet异常

一、http status 404 解决办法&#xff1a;检查web.xml中的配置文件&#xff0c;发现jsp页面的提交路径action和web.xml中的路径不匹配&#xff0c;将其修改过来。转载于:https://www.cnblogs.com/ltfxy/p/9671256.html

disk genius_如何预约Apple Store商店或Genius Bar

disk geniusMaybe you have a cracked iPhone screen or your MacBook Pro isn’t charging properly. Whatever your issue, there’s an app for that! If you need tech support or repairs for your Apple device, it’s easy to set up a service appointment right from …

[置顶] C#中通过调用webService获取上网IP地址的区域的方法

最近在开发项目的过程中需要获取用户查询时的IP地址的区域&#xff0c;以用来做统计分析用。经过一番查阅资料&#xff0c;然后写了个测试程序&#xff0c;很快就搞定了这个功能。 现在分享下我的实现方法&#xff0c;大家如果有更好的实现&#xff0c;欢迎提出哦。 首先我找到…

hashmap 存取原理图_HashMap底层实现原理

HashMap底层原理总结&#xff0c;几个Hash集合之间的对比。HashMap底层存储结构HashMap是一个用于存储Key-Value键值对的集合&#xff0c;每一个键值对也叫做一个Entry。这些Entry分散存储在一个数组当中&#xff0c;这个数组就是HashMap的主干。1234567* The table, initializ…

LVM逻辑卷创建管理

在虚拟机中再次添加三张硬盘 1、查看添加的硬盘 [rootrhel-02 ~]# fdisk -l 2、添加分区 [rootrhel-02 ~]# fdisk /dev/sdb 查看分区并保存 3、将物理硬盘分区初始化为物理卷&#xff0c;以便LVM使用 如果没安装LVM的话先去安装 [rootrhel-02 ~]# yum install lvm2 安装完成…

Start DWM manually on Windows 7 and vista

方法一&#xff1a; 1. 检查两处注册表项及键值是否与下列数值一致 HKEY-Current-User\Software\Microsoft\Windows\DWM\Composition 键值改为 1 HKEY-Current-User\Software\Microsoft\Windows\DWM\CompositionPolicy 键值改为2 2. 打开运行&#xff08;可能要用到管理员模式启…

java启动mysq服务_Java Web开发——MySQL数据库的安装与配置

MySQL是一个关系型数据库管理系统&#xff0c;由瑞典MySQL AB 公司开发&#xff0c;目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一&#xff0c;在 WEB 应用方面&#xff0c;MySQL是最好的 RDBMS (Relational Database Management System&#xff0c;关系…

小程序如何获得手机号码_获得小型企业电话号码的最佳方法

小程序如何获得手机号码Lots of small businesses use their personal cellphones when making work related phone calls. Some may even be using old landlines for their calling needs. While it makes sense to use your cellphone, and it can be scary to make a chang…

空间数据索引RTree完全解析及Java实现

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/MongChia1993/article/details/69941783第一部分 空间数据的背景介绍 空间数据的建模 基于实体的模型&#xff08;基于对象&#xff09;Entity-based models (or object base…

Android 中的ORM框架

在android 中&#xff0c;内置了sqlite数据库&#xff0c;java web 中&#xff0c;用惯了Hibernate &#xff0c;想找找android中是否也有类似的orm框架&#xff0c;后来在开源中国看到了orman&#xff0c;这是一个很不错的框架。 这个可以帮我们快捷方便的实现数据库的CURD操作…

android页面布局 如何让中间的listview填充剩余部分_谷歌驾驶设计—界面设计布局...

本节提供了可在不同屏幕尺寸范围内缩放的屏幕布局的设计指南。此处定义的padding和keyline值用于Components&#xff0c;Media规范、Notification Center规范和Dialer规范中。指南概览&#xff08;TL&#xff1a;DR&#xff09;&#xff1a;基于适当的屏幕尺寸类别的基本布局使…