音频算法之小黄人变声 附完整C代码

前面提及到《大话音频变声原理 附简单示例代码》与《声音变调算法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 < 2)
        return -1;

    char *in_file = argv[1];
    uint32_t sampleRate = 0;
    uint64_t totalSampleCount = 0;
    uint32_t channels = 0;
    short *data_in = wavRead_s16(in_file, &sampleRate, &totalSampleCount, &channels);
    if (data_in != NULL) {
        float pitchShift = 0.9f;
        size_t ms = 50;
        size_t overSampling = 4;
        size_t frameSize = sampleRate * ms / 1000;
        frameSize += frameSize % 2;
        planData pitchPlanData = {0};
        double startTime = now();
        makePlanData(frameSize, overSampling, sampleRate, &pitchPlanData);
        pitchshift(pitchShift, data_in, data_in, totalSampleCount, &pitchPlanData);
        // turn to minion pitch
        {
            totalSampleCount /= 2;
            short *samples = data_in;
            for (int i = 0; i < totalSampleCount; i++) {
                data_in[i] = samples[0];
                samples += 2;
            }
        }
        double time_interval = calcElapsed(startTime, now());
        freePlanData(&pitchPlanData);
        printf("time interval: %f ms\n ", (time_interval * 1000));
    }
    char drive[3];
    char dir[256];
    char fname[256];
    char ext[256];
    char out_file[1024];
    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 0;
}

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

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

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

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

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

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

授人以鱼不如授人以渔。

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

邮箱地址是: 
[email protected]

原文地址:https://www.cnblogs.com/cpuimage/p/9690112.html

时间: 2024-08-03 16:56:55

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

小绿人小红人和小黄人

(2016/4/14 看了昨天的锵锵三人行继续谈王小波,子东提到一个有趣的观点.路遥和王小波的对照.一个返乡农村青年为成为城市人的奋斗,一个下放青年以普通人的姿态谈自由. 两位都是我喜欢的作家.王小波更是我最喜欢的作家.子东的对照让我想起平等和自由,路遥的苦苦追求能够理解为底层人向往的平等,王小波戏谑地展示的则是一个精神贵族觉得的最可贵的东西,自由.由两者的关系又引发了以下的想象.当然,路遥追求的平等绝不是以下小红人理解的那种. ) 从前有个国家,那里的人分为两种:一种是小绿人,一种是小红人.

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

原文出处: 郭锦荣 前言 前两天我刚发布了一篇CSS3实现小黄人动画的博客,但是实现的CSS3动画是基于我在站酷网找到的一张小黄人的jpg格式图片,并自己用PS抠出需要实现动画的部分,最后才完成的动画效果.但是,其实我的初衷是想体验一下用图片做动画的赶脚,但是找不到素材,才无奈用了最笨的方法来满足自己的需求,本想勉强能看就行了.可是呢,还是抵不住自己内心的完美,于是乎,用了一个晚上用CSS3画出了小黄人再实现类似的动画效果. 正题 OK,大家看一下下面两张图有什么不同: 当然,很多人会说,明显大

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

小程序上课第三天,因为今天院里有活动,所以没去上课,第四天上午又因为要召开入党转正大会,又耽误了一上午,下午去上课,要了资料.这两天讲了一些零零碎碎的东西,做的实例有上面这个小黄人 都是用的css,基本上都是用border,transform:rotate(),animation,和一些细节做的,左边的对话框那里的小尖头也是一个重点细节 下面附上代码: 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset=&quo

Quartz2D练习 -- 小黄人

Main.storyboard <?xml version="1.0" encoding="UTF-8" standalone="no"?> <document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="5053" systemVers

css3实现小黄人

效果就像这样: 不废话,直接上代码! hrml代码: <!DOCTYPE html> <html> <head lang="zh"> <meta charset="UTF-8"> <title>纯CSS3画出小黄人并实现动画效果</title> <Link href="index.css" type="text/css" rel="styl

iOS开发 - Quartz2D绘制小黄人

Quartz2D绘制小黄人 - (void)drawRect:(CGRect)rect { // 1.上下文 CGContextRef ctx = UIGraphicsGetCurrentContext(); // 2.身体 drawBody(ctx, rect); // 3.嘴(微笑) drawMouth(ctx, rect); // 4.画眼睛 drawEyes(ctx, rect); } /** * 眼睛 */ void drawEyes(CGContextRef ctx, CGRect

小黄人

宝宝今天不开心,用CSS画了个小黄人,源码如下 html部分 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <title>小黄人</title> <link rel="stylesheet" href="main.css" /> </head> &l

小黄人这步棋,vivo怎么下?

9月13日<小黄人大眼萌>在国内首映,vivo.Uber也跟着凑起了热闹.12.13日两天,在世贸天阶,vivo联手Uber邀请大家与小黄人手机图标合影.只要上传照片上传照片至微博并@Uber优步北京@vivo智能手机,现场获得活动参与代码,在指定时间打开Uber输入,即有机会赢取小黄人神秘首映礼邀请函. 夏末秋初的凉爽日,却被小黄人"搅黄"了,"小黄人黄"(Minion Yellow)甚至还被定为2015年的流行色. 凭借着讨喜的性格.呆萌的造型.满满

【ZNDS众测】i6 双响炮蓝牙音箱-小黄人上线

娱乐双响炮蓝牙音箱在欣喜中收到,本次吸引我的是双响两个字,比较有可玩性,蓝牙音箱现在已经在市场上比较常见,基本走在挖掘新的市场,比如家庭影音,娱乐,户外等等场景,都在主打细分市场,这次双响蓝牙音箱我个人觉得在携带性与创新方面很好,蓝牙一托儿功能作为主打项,场景应用很加分,户外有手带可以带出去玩,室内现在的笔记本,平板,手机等都有蓝牙,在使用过程中,立体环绕音效绝对是生活的添加剂,接下来就看看本次产品的情况: 产品包装: 收到产品外包装做的相对比较细腻,盒子不大,文字与图案排版都比较简单明确,符合