前面提及到《大话音频变声原理 附简单示例代码》与《声音变调算法PitchShift(模拟汤姆猫) 附完整C++算法实现代码

都稍微讲过变声的原理和具体实现。

大家都知道,算法从实现到最后工程应用,中间的环节和问题特别多。

尤其是编码的架构设计,好的数据结构和代码逻辑封装肯定是可复用,组件化的。

前几天写完《音频识别算法思考与阶段性小结》的时候,

我也提及到了。

会做一些算法编码优化相关的分享。

而有时候我总觉得文字表达很苍白,

所以我尽可能地把代码写得简洁易懂,

一方面是便于基础差的朋友学习。

另一方面也是为了自己在编码以及思考的时候,能更加清晰。

当然,变声算法绝大多数朋友都会选择一些开源的或者商业sdk去做二次开发。

例如:

https://www.fmod.com/

https://www.surina.net/soundtouch/

但如果仅仅停留在使用的阶段,它就是一个黑盒子。

知其然,却不知其所以然。

是远远不够的。

有时候我们是要站在巨人的肩膀上去看到更美丽的风景。

但是,我希望是一群人,而不是一个人。

也许大家也发现了,我写的大多数算法,是纯c无第三方依赖的。

是不是就会怀疑,我就只会写c语言?

不是的,我所掌握的编程语言:

主要: c,c++,python,汇编

其次:pascal,c#,js,lua,go等

编程语言只是一个工具,关键还是算法思路。

用纯c写的主要目的,是为了破除一些第三方依赖,

不要一知半解地使用黑盒子。

当然,其次的好处就是跨平台,便携,可复用。

这样,一切了然于心。

为什么不可以造轮子呢?

只要你造的轮子是有用的,

不管是用于观赏用于学习还是其他用途。

在我了解到一些音频算法的思路之后,

变声算法的思路,

我觉得它的思路非常适用于扩展到大多数音频算法实现,

而且可复用度比较高。

所以,将它梳理开源,就显得特别有意义。

而大家可以基于这个实现,进一步去改进或者学习 音频算法,

例如降噪,增益等等。

因为这个编码实现的设计是完全可以适用到音频算法应用场景的。

逻辑也非常清晰。

项目地址:

https://github.com/cpuimage/pitchshift

当然为了便于一些朋友的学习使用,

示例代码提供一个简易的实现,

模拟变声为小黄人。

int main(int argc, char *argv[]) {
printf("Audio Processing \n");
printf("blog:http://cpuimage.cnblogs.com/ \n");
printf("Pitch Shifting Using The Fourier Transform\n"); if (argc < )
return -; char *in_file = argv[];
uint32_t sampleRate = ;
uint64_t totalSampleCount = ;
uint32_t channels = ;
short *data_in = wavRead_s16(in_file, &sampleRate, &totalSampleCount, &channels);
if (data_in != NULL) {
float pitchShift = 0.9f;
size_t ms = ;
size_t overSampling = ;
size_t frameSize = sampleRate * ms / ;
frameSize += frameSize % ;
planData pitchPlanData = {};
double startTime = now();
makePlanData(frameSize, overSampling, sampleRate, &pitchPlanData);
pitchshift(pitchShift, data_in, data_in, totalSampleCount, &pitchPlanData);
// turn to minion pitch
{
totalSampleCount /= ;
short *samples = data_in;
for (int i = ; i < totalSampleCount; i++) {
data_in[i] = samples[];
samples += ;
}
}
double time_interval = calcElapsed(startTime, now());
freePlanData(&pitchPlanData);
printf("time interval: %f ms\n ", (time_interval * ));
}
char drive[];
char dir[];
char fname[];
char ext[];
char out_file[];
splitpath(in_file, drive, dir, fname, ext);
sprintf(out_file, "%s%s%s_out%s", drive, dir, fname, ext);
wavWrite_s16(out_file, data_in, sampleRate, totalSampleCount);
if (data_in) {
free(data_in);
}
printf("press any key to exit.\n");
getchar();
return ;
}

不做多解释,大家可以参阅pitchshift函数的实现,

主要实现位于文件PitchShift.h。

整个算法不到200行,逻辑非常清晰,

已经做了一定程度上的工程化优化。

当然还有很大的改进空间,

不过这份代码,更多的意义在于学习。

授人以鱼不如授人以渔。

若有其他相关问题或者需求也可以邮件联系俺探讨。

邮箱地址是: 
gaozhihan@vip.qq.com

音频算法之小黄人变声 附完整C代码的更多相关文章

  1. css3实现小黄人

    效果就像这样: 不废话,直接上代码! hrml代码: <!DOCTYPE html> <html> <head lang="zh"> <m ...

  2. 纯CSS3画出小黄人并实现动画效果

    前言 前两天我刚发布了一篇CSS3实现小黄人动画的博客,但是实现的CSS3动画是基于我在站酷网找到的一张小黄人的jpg格式图片,并自己用PS抠出需要实现动画的部分,最后才完成的动画效果.但是,其实我的 ...

  3. [置顶] 几行代码实现ofo首页小黄人眼睛加速感应转动

    最新版的ofo 小黄车的首页小黄人眼睛随重力而转动,感觉有点炫酷,学习一下吧,以下代码是在xamarin android下实现 ofo首页效果图: xamarin android实现效果: 实现思路: ...

  4. Python turtle模块小黄人程序

    讲解Python初级课程的turtle模块,简单粗暴的编写了小黄人的程序.程序还需要进一步优化.难点就是要搞清楚turtle在绘制图形过程中的方向变化. import turtle t = turtl ...

  5. 小黄人IP营销的四种玩法思维导图

    小黄人IP营销的四种玩法思维导图 ------------------------------ 本人微信公众帐号: 心禅道(xinchandao) 本人微信公众帐号:双色球预测合买(ssqyuce)

  6. CSS3实现小黄人动画

    转载请注明出处,谢谢! 每次看到CSS3动画就心痒痒想试一下,记得一个多月前看了白树哥哥的一篇博客,突然开窍,于是拿他提供的demo试了一下,感觉很棒!下图为demo提供的动画帧设计稿. 自己也想说搞 ...

  7. 静态分析第三发 so文件分析(小黄人快跑)

    本文作者:i春秋作家——HAI_ 0×00 工具 1.IDA pro 2.Android Killer 0×01 环境 小黄人快跑 下载地址http://download.csdn.net/downl ...

  8. CSS3小黄人

    CSS3实现小黄人 效果图: 代码如下,复制即可使用: <!DOCTYPE HTML> <HTML> <head> <title>CSS3实现小黄人&l ...

  9. 微信小程序相关三、css写小黄人

    小程序上课第三天,因为今天院里有活动,所以没去上课,第四天上午又因为要召开入党转正大会,又耽误了一上午,下午去上课,要了资料.这两天讲了一些零零碎碎的东西,做的实例有上面这个小黄人 都是用的css,基 ...

随机推荐

  1. 乘风破浪:LeetCode真题_010_Regular Expression Matching

    乘风破浪:LeetCode真题_010_Regular Expression Matching 一.前言 关于正则表达式我们使用得非常多,但是如果让我们自己写一个,却是有非常大的困难的,我们可能想到状 ...

  2. MSSQL SEVER执行动态SQL

    在Sql Server查询语句中使用变量表示表名.列字段名等动态查询方式. 方法一:EXEC命令(支持普通字符和Unicode字符) ); SET @sql=N'PRINT ''这条消息是动态SQL命 ...

  3. scala当中的类

    1.类的定义与创建 创建一个scala class来定义我们的一个类.类当中可以定义各种属性或者方法,或者函数都可以     class Person {       //定义一个属性,叫做name的 ...

  4. PetaPoco轻量级ORM框架 - 入门安装

    PetaPoco 是一个开源轻量级ORM,够小,够快,单文件 在GitHub上有很高的人气 1377星,几年来作者一直在更新 当前版本6.0.317 - Netstandard 2.0(同时支持.ne ...

  5. linux性能系列--网络

    一.为啥网络监控不好做?   回答:网络是所有子系统中最难监控的了.首先是由于网络是抽象的,更重要的是许多影响网络的因素并不在我们的控制范围之内.这些因素包括,延迟.冲突.阻塞等 等.由于网络监控中, ...

  6. SQLAlchemy总结

    SQL相关操作 创建一个test库 create database test; 授权一个用户 grant all privileges on *.* to 'yangjian'@'%' identif ...

  7. 【OpenCV】【MFC】图片、视频、摄像头输入响应【详细图解】

    记住新建项目后,要配置OpenCV环境!参考链接http://blog.csdn.net/zy122121cs/article/details/49180541 做工程搭建框架什么的,基本的要熟练啊. ...

  8. mongo数据库导入导出数据

    一.Mongodb导出工具mongoexport Mongodb中的mongoexport工具可以把一个collection导出成JSON格式或CSV格式的文件.可以通过参数指定导出的数据项,也可以根 ...

  9. G、CSL 的训练计划【BFS 贪心】(“新智认知”杯上海高校程序设计竞赛暨第十七届上海大学程序设计春季联赛)

    题目传送门:https://ac.nowcoder.com/acm/contest/551/G 链接:https://ac.nowcoder.com/acm/contest/551/G来源:牛客网 题 ...

  10. 【vue】饿了么项目-使用webpack打包项目

    1.vue cli给我们提供了npm run build命令打包项目,在packa.json文件中scripts对象中有build属性,当我们执行npm run build时,就执行build对应的& ...