录一段音频,把它的音高改变50次并把每一个新的音频匹配到键盘的一个键位,你就能把电脑变成一架钢琴!

一段音频可以被编码为一组数值的数组(或者列表),像这样:

我们可以在数组中每隔一秒拿掉一秒的值来将这段音频的速度变成两倍。

如此我们不仅将音频的长度减半了,而且我们还将它的频率翻倍了,这样使得它拥有比原来更高的音高(pitch)。

相反地,假如我们将数组中每个值重复一次,我们将得到一段更慢,周期更长,即音高更低的音频:

这里提供一个可以按任意系数改变音频速度的任意简单的Python函数:

import numpy as np

def speedx(sound_array, factor):

""" 将音频速度乘以任意系数`factor` """

indices = np.round( np.arange(0, len(snd_array), factor) )

indices = indices[indices < len(snd_array)].astype(int)

return sound_array[ indices.astype(int) ]

这个问题更困难的地方在于改变音频长度的同时保持它的音高(变速,音频拉伸(sound stretching)),或者在改变音频的音高的同时保持它的长度(变调(pitch shifting))。

变速

变速可以通过传统的相位声码器(phase vocoder,感兴趣的朋友可以读一下维基百科的页面)来实现。首先将音频分解成重叠的比特,然后将这些比特重新排列使得他们重叠得更多(将缩短声音的长度)或者更少(将拉伸音频的长度),如下图所示:

困难之处在于重新排列的比特可能很严重的互相影响,那么这里就需要用到相位变换来确保它们之间没有影响。这里有一段Python代码,取自这个网页(打不开的话,您懂的。——译者注):

def stretch(sound_array, f, window_size, h):

""" 将音频按系数`f`拉伸 """

phase = np.zeros(window_size)

hanning_window = np.hanning(window_size)

result = np.zeros( len(sound_array) /f + window_size)

for i in np.arange(0, len(sound_array)-(window_size+h), h*f):

# 两个可能互相重叠的子数列

a1 = sound_array[i: i + window_size]

a2 = sound_array[i + h: i + window_size + h]

# 按第一个数列重新同步第二个数列

s1 = np.fft.fft(hanning_window * a1)

s2 = np.fft.fft(hanning_window * a2)

phase = (phase + np.angle(s2/s1)) % 2*np.pi

a2_rephased = np.fft.ifft(np.abs(s2)*np.exp(1j*phase))

# 加入到结果中

i2 = int(i/f)

result[i2 : i2 + window_size] += hanning_window*a2_rephased

result = ((2**(16-4)) * result/result.max()) # 归一化 (16bit)

return result.astype('int16')

变调

一旦你实现了变速以后,变调就不难了。如果需要一个更高的音高,可以先将这段音频拉伸并保持音高不变,然后再加快它的速度,如此最后得到的音频将具有原始音频同样的长度,更高的频率,即更高的音高。

把一段音频的频率翻倍将把音高提高一个八度,也就是12个半音。因此,要将音高提高n个半音的话,我们需要将频率乘上系数2^(n/12):

linux 虚拟钢琴程序,用Python制作简单的钢琴程序的教程相关推荐

  1. python做好的程序如何变成小程序-使用python编写简单的小程序编译成exe跑在win10上...

    每天的工作其实很无聊,早知道应该去IT公司闯荡的.最近的工作内容是每逢一个整点,从早7点到晚11点,去查一次客流数据,整理到表格中,上交给素未蒙面的上线,由他呈交领导查阅. 人的精力毕竟是有限的,所以 ...

  2. python制作简单软件_用Python制作简单的钢琴程序的教程

    录一段音频,把它的音高改变50次并把每一个新的音频匹配到键盘的一个键位,你就能把电脑变成一架钢琴! 一段音频可以被编码为一组数值的数组(或者列表),像这样: 我们可以在数组中每隔一秒拿掉一秒的值来将这 ...

  3. python简易程序教程_用Python制作简单的钢琴程序的教程

    录一段音频,把它的音高改变50次并把每一个新的音频匹配到键盘的一个键位,你就能把电脑变成一架钢琴! 一段音频可以被编码为一组数值的数组(或者列表),像这样: 我们可以在数组中每隔一秒拿掉一秒的值来将这 ...

  4. 利用Python制作简单的小程序:IP查看器

    前言 说实话,查看电脑的IP,也挺无聊的,但是够简单,所以就从这里开始吧.IP地址在操作系统里就可以直接查看.但是除了IP地址,我们也想通过IP获取地理地址和网络运营商情况.IP地址和地理地址并没有固 ...

  5. python输入输出拓展: 制作简单的exe程序(温度转换器)

    制作简单的exe程序 为了防止代码被盗,需要对代码进行打包.这里,就需要制作exe程序. 准备工作: 1. 安装第三方模块 pyinstaller 2. . 阿里巴巴矢量图标库(www.iconfon ...

  6. 用python制作简单的可视化地图

    用python制作简单的可视化地图,代码如下: from pyecharts.charts import Bar # 导入pyecharts工具包,调用Bar工具bar1 = Bar() bar1.a ...

  7. 如何用Python制作简单又好看的词云?来瞅瞅吧~

    今天教大家如何用Python制作简单的词云,文中有非常详细的介绍及代码示例,对于正在学习Python的小伙伴们也能看的懂,需要的小伙伴可以参考下. 一.准备 词云制作所必需的三个包: 安装:pip i ...

  8. 使用python制作zip口令破解程序

    使用python制作zip口令破解程序 一.如何用python操作zip文件 python标准库中有一个叫zipfile.py的文件,在程序中导入它 import zipfile 一般情况下,它的语法 ...

  9. python打开是什么颜色-python实现简单颜色识别程序

    本文实例为大家分享了python实现简单颜色识别程序的具体代码,供大家参考,具体内容如下 import numpy as np import cv2 font= cv2.FONT_HERSHEY_SI ...

  10. python识别ppt文件格式 ——(专栏:基于python编写简单office阅卷程序③)

    ● 研二在读学生,非工科非计算机专业,故代码简陋初级勿喷,本文仅为记录和快乐分享. ○ 感谢肯定,感谢点赞收藏分享,转载请注明本页出处即可. ____Ⓙ即刻@王昭没有君 本文仅为笔者摸索总结-欢迎订正 ...

最新文章

  1. C语言图书管理系统注册功能,图书管理系统的c语言源程序
  2. java pca资料整理
  3. 使用Spring3+Quartz实现定时任务
  4. 【贪心】畜栏预定(ybtoj 贪心-1-3)
  5. mysql80连接不上本地服务器_小白教程:ubuntu服务器安装jupyter notebook, 并能够实现本地远程连接
  6. java 程序是由什么组成的 java_【问答题】一个典型的JAVA程序结构是由什么组成。...
  7. c语言输出最大的数ns流程图_怎么将100至200中全部的素数用NS流程 – 手机爱问...
  8. arcgis制作分幅图层,并对分幅图进行编号
  9. office excel 打开csv文件乱码问题解决
  10. VS2019安装教程(C语言)
  11. Java语言程序设计与数据结构(基础篇)梁勇第一章书中例题
  12. python标准库math中sin函数的参数单位是角度吗_弧度 - math.h中的三角函数,参数是弧度,不是角度...
  13. 【Java核心技术大会 PPT分享】林子熠:GraalVM的静态编译和静态分析技术
  14. 生物传感器相关概念简述(一)
  15. 【Vue2】vue2全内容整理
  16. java ladp_OpenLDAP源码安装及配置管理
  17. 因为锁的问题,我们被扣了1万
  18. 实验室信息管理系统(LIMS)的应用流程
  19. Docker的安装和配置
  20. 【GStreamer 】5-2 USB相机转RTSP网络视频流优化

热门文章

  1. 聚合数据--汇率接口调用
  2. 悉尼大学COMP5216Assignment2课业解析
  3. zabbix3.0 之短信报警配置
  4. 数学建模常识及论文写作方法
  5. win10 hao123劫持html文件,Win10 edge浏览器主页被hao123劫持怎么解决?
  6. 内核编程初学者给“楚狂人”的一封信
  7. oracle11g64位怎么用sql,PLSQL连接Oracle11g64位
  8. 深入理解JNINativeInterface函数<一>
  9. 紫罗兰永恒花园rust简谱_【口琴谱/简谱】エイミー(紫罗兰永恒花园外传主题曲)...
  10. CZ1206计算机在线,若按CZ-1206科学计算器的键后,再依次按键,则显示的结果是()...