关于音频变声算法,这个是一个很多人特别感兴趣的话题。

当然也有不少开源算法可以参阅学习,有基于时域,也有基于频域的算法。

最终算法想要达到的目的是一致。

最近也有不少网友问过关于变声算法的一些细节问题,邮件询问我。

要给出一个比较合理或者说通俗易懂的解释,看似简单,其实还蛮难的。

按照大概的一个逻辑思路,稍微理一理,所以这个主题必须加上“大话”这个前缀。

也不打算讲特别高深的,当然也是因为讲不来。

之于图像算法领域,非常重要的算法是高斯模糊,

当然也可以认为是卷积,高斯模糊是卷积的一种特例,这里就不展开了。

而之于音频,也许你也猜到了,基于时间的,毫无疑问,就是重采样算法。

音频采样率是指录音设备在一秒钟内对声音信号的采样次数,

采样频率越高声音的还原就越真实越自然。

在当今的主流采集卡上,采样频率一般共分为22.05KHz、44.1KHz、48KHz三个等级,

22.05KHz只能达到FM广播的声音品质,

44.1KHz则是理论上的CD音质界限,48KHz则更加精确一些。

看到这里,也许大多数人还是没法理解采样频率大概是什么意思。

换个角度来说的话,就是假设一个人说“你好”,花了20毫秒,而机器在这20毫秒内,

采集的数据多少就可以理解为采样率高低。

也就是说,20毫秒内,采集到的数据量就是可以大概认为目前的采样率,数据量越大,精度越高,采样率越高。

那么,我们再换一个思路,想一个问题。

如果在同样的速率的情况下,

一个人的语速快,一个人的语速慢,那也可能造成采样数据分布不一致。

这里就可以展开一个音频算法,就是变速。

嗯,是的,就是变速。

从原理上来讲的话,其实变速就是在同样的采样率环境下,对采样数据进行拉伸或压缩。

从算法的角度上来说的话,可以认为是插值或抽值。

如果你让一个人讲话的速度变得更快怎么做,

很明显,就是在同样的采样率下,抽掉一些样本。

反之,降速则是插入一些样本。

最终决定变速效果的就是插入样本和抽离样本的权重计算。

例如原来采样到的数据是

1234

加速的时候,抽离样本 1 和 4

23

降速的时候,增加样本

11223344

当然只是举个例子,便于大家理解这个概念逻辑。

看到这里,肯定有人会问,

那声音的大小呢?或者说信号的强弱呢?

其实也就是提升音量和降低音量,我想这个应该不用解释。

变速是时域变,空间不变。

而音量则反之,时域不变,空间变。

可以简单粗暴地理解,就是线性拉伸。

例如原来采样到的数据是

1234

每个样本+4,直接拉伸为

5678

也有采用乘法进行拉伸的,

例如 乘以2

2468

上面是增大音量,降低音量反之就是减和除。

而最终不管变速还是音量调节,

最终算法要做的事情就是确定对应位置的对应权重。

当然也要看最终想要达到什么样的效果,适配权重。

饶了这么一大圈,还是没有说到变声的问题。

其实,变声就是变速+音量调节。

以上变速也好,音量调节也好,相对而言都是线性拉伸,

直接的加减乘除然后插值抽值就能达到的。

而变声的概念其实也是类似的,

就是在在同一时域内同时调节对应时域的音量权重。

换言之就是在同一个采样率内,同时控制语速和音量在一个特定的权重内。

其实就是一个时域和空间的二维拉伸。

理解这个逻辑确实有点绕。

用采样算法来做一个简单的示例。

这个示例中的采样函数是:

void resampler(char *in_file, char *out_file) {//音频采样率

uint32_t in_sampleRate = 0;//总音频采样数

uint64_t totalSampleCount = 0;

int16_t*data_in = wavRead_int16(in_file, &in_sampleRate, &totalSampleCount);

uint32_t out_sampleRate= in_sampleRate * 2;

uint32_t out_size= (uint32_t) (totalSampleCount * ((float) out_sampleRate /in_sampleRate));

int16_t*data_out = (int16_t *) malloc(out_size * sizeof(int16_t));//如果加载成功

if (data_in != NULL && data_out !=NULL) {

resampleData(data_in, in_sampleRate, (uint32_t) totalSampleCount, data_out, out_sampleRate);

wavWrite_int16(out_file, data_out, out_sampleRate, (uint32_t) out_size);free(data_in);free(data_out);

}else{if (data_in) free(data_in);if (data_out) free(data_out);

}

}

让我们稍微变通一下,设一个采样速率,用来调节声音的速度,同时保证采样率不变。

void resampler(char *in_file, char *out_file) {//音频采样率

uint32_t in_sampleRate = 0;//总音频采样数

uint64_t totalSampleCount = 0;

int16_t*data_in = wavRead_int16(in_file, &in_sampleRate, &totalSampleCount);float speed = 0.88;//增加一个速度权重

uint32_t out_sampleRate = in_sampleRate *speed;

uint32_t out_size= (uint32_t) (totalSampleCount * ((float) out_sampleRate /in_sampleRate));

int16_t*data_out = (int16_t *) malloc(out_size * sizeof(int16_t));//如果加载成功

if (data_in != NULL && data_out !=NULL) {

resampleData(data_in, in_sampleRate, (uint32_t) totalSampleCount, data_out, out_sampleRate);//out_sampleRate改为输出一样的采样率in_sampleRate

wavWrite_int16(out_file, data_out, in_sampleRate, (uint32_t) out_size);free(data_in);free(data_out);

}else{if (data_in) free(data_in);if (data_out) free(data_out);

}

}

修改后是这个样子的。

有心的朋友发现了。out_size数值有可能增大或缩小了。

以上示例代码,就是一个简单的变速算法。

变速就是这么一个原理,音量增大降低就不做示例了。

而变声是一个什么算法呢?

说白了,就是变速的同时保证out_size还是原来的totalSampleCount。

那要怎么保证呢?

答案就是插值,如果简单粗暴一点,补0或者删0即可。

当然这样做的话,可能会导致音量不一致,最终发声不对的情况。

这肯定是不科学的,最终的插值时候的权重和对应的内容,产生的效果就看各家本领了。

以上原理,也说得差不多了,具体怎么实现的话,

大家自行参阅相关的开源代码,再去理解一下。

这篇文章中的sin和cos 没有在有效区间内,所以fastsin fastcos计算的结果是有问题的。

详情大家还是参阅作者原算法吧。

当然,后面有时间我会放出,

简单清晰的变声算法的完整c代码和对应的示例代码。

在对应的github 项目fftResample上,我也做了算法逻辑上的修正。

发表过的文章一般很少进行二次编辑了,

关于后期的一些修正和变更,大家还是关注一下github项目的更新比较直接一点。

具体变声的实现原理,

如上所述,希望通过这篇文章,

大家对音频变声算法能有比较直观的理解和认识。

以上,权当抛砖引玉。

独乐乐不如一起玩乐。

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

邮箱地址是:

gaozhihan@vip.qq.com

java声音变音代码实现_大话音频变声原理 附简单示例代码相关推荐

  1. Python爬虫原理与简单示例代码

    链接 链接 爬取知乎热榜话题: 链接 BeautifulSoup的使用1: url = 'http://www.cntour.cn/'strhtml = requests.get(url)soup = ...

  2. Unity 简单示例代码和向导/Unity Aplication Block

    Unity 简单示例代码和向导 关于Unity 的说明和下载地址,请访问[微软控制反转和依赖注入容器Unity 1.0发布] http://forum.entlib.com/Default.aspx? ...

  3. java文字手写识别_【手写文字识别】-JavaAPI示例代码

    手写文字识别-JavaAPI示例代码 不知不觉手写文字识别百度已经开始邀测了.需要的小伙伴去申请了哦.申请方式加入文字识别群找PM.或者工单提交申请.都要说明自己的APPID哦. 接口地址:https ...

  4. java人体识别_【人体分析-人像分割】JavaAPI示例代码

    接口能力: 对于输入的一张图片(可正常解码,且长宽比适宜),识别人体的轮廓范围,与背景进行分离,适用于拍照背景替换.照片合成.身体特效等场景.输入正常人像图片,返回分割后的二值结果图和分割类型(目前仅 ...

  5. java图片放大_【图像处理-图像无损放大】JavaAPI示例代码

    属于内测接口,需要申请哦. 接口说明:http://ai.baidu.com/docs#/ImageProcessing-API/815af37c 需要用到的第三方jar com.alibaba fa ...

  6. 一行python代码能干_几个小例子告诉你, 一行Python代码能干哪些事

    首先你要了解一下Python之禅,一行代码输出"The Zen of Python": python -c "import this" "" ...

  7. java for遍历hashmap_Java 使用for和while循环遍历HashMap的方法及示例代码

    1、使用entrySet()遍历 1) 使用while实现public static void printMap(Map mp) { Iterator it = mp.entrySet().itera ...

  8. python怎么换背景颜色_用opencv给图片换背景色的示例代码

    图像平滑 模糊/平滑图片来消除图片噪声 OpenCV函数:cv2.blur(), cv2.GaussianBlur(), cv2.medianBlur(), cv2.bilateralFilter() ...

  9. JAVA三维可视化组件:Matplot 3D for JAVA(V3.0) 一个纯JAVA开发的科学数据可视化组件包 类似 Python 的matplotlib(含示例代码)

    目录 概述 组件下载及项目地址 效果展示和示例代码 概述 Matplot3D for JAVA(V3.0) 是一个基于JAVA SE 1.8环境开发的三维图形图表组件. 组件由纯JAVA SE 实现( ...

  10. 支持向量机python代码_用TensorFlow实现多类支持向量机的示例代码

    这篇文章主要介绍了用TensorFlow实现多类支持向量机的示例代码,现在分享给大家,也给大家做个参考.一起过来看看吧 本文将详细展示一个多类支持向量机分类器训练iris数据集来分类三种花. SVM算 ...

最新文章

  1. 理解 IntelliJ IDEA 的项目配置和Web部署
  2. oracle 查询空值异常,Oracle中的NULL
  3. NeurIPS 2019最佳论文出炉,今年增设“新方向奖”,微软华人学者获经典论文奖...
  4. bobo老师机器学习笔记1.1 - 什么是机器学习
  5. Tomcat 最新版安装与使用手册,tomcat更改端口号方法,tomcat控制台乱码问题解决方法
  6. 关于python pdb的描述_The python debugger(PDB)的简介
  7. 创业感悟:技术兄弟为什么一直没有起来(1)
  8. 第9章 中断和动态时钟显示
  9. 计算机网络的概述发展填空题,计算机网络安全概述填空题.doc
  10. 页面可用性之浏览器默认字体与CSS 中文字体
  11. lfs库下载_git-lfs插件
  12. combus通讯_COM口,串行通讯端口,RS-232接口 基础知识
  13. getParameterValues中文乱码
  14. 《炬丰科技-半导体工艺》用于高效显示和通信的无磷白光 LED
  15. 聊一聊丘丘等级及其图标显示的实现算法
  16. android二维码图片生成模糊的问题
  17. 震坤行:以成就客户为导向,用专业打造数字化供应链采购流程
  18. 【Qtree】Query on a tree系列LCT解法
  19. ICDsoft主机半价优惠码推荐
  20. 查看ip地址 通过域名

热门文章

  1. Xposed插件Android.EagleEye
  2. 来阿里三年,他从宠妻狂魔到正义战士
  3. 计算机基础知识还有那些,关于电脑基础知识有哪些
  4. 外置硬盘一插就卡_为什么电脑一插移动硬盘就卡死了?
  5. 【Swift】文档分享到其他应用
  6. Zabbix通过SNMP协议监控H3C交换机
  7. R语言——矩阵中删除缺省值可用的函数
  8. MFCC和语谱图的关系
  9. 5G注册流程分级详解
  10. 【Matplotlib绘制图像目录】Python数据可视化之美