用Python实现音频卷积,并制作一个简单的HRTF效果

作为一个刚刚入门Python的小白用户,写出这篇文章还是废了我很大的力气,不过幸运的是,在网上到处东拼西凑,我还是把它给做出来了。
废话不多说,直接开始(入门向):

音频卷积

我的Python版本是2.7.13,先安装必需的库:

pip install scipy

导入库:

from scipy.io import wavfile
from scipy.signal import fftconvolve

正经操作开始了:

file_path1 = '你的音频文件路径'
file_path2 = '你的第二个音频文件路径'
fs1, wav_data1 = wavfile.read(file_path1)
fs2, wav_data2 = wavfile.read(file_path2)  #fs里保存的是头信息,wav_data保存的就是数据,它是以数组形式存在的
temp = fftconvolve(wav_data1,wav_data2)  #将两个音频数据进行卷积
wavfile.write('temp要写入的文件路径',44100,temp)

ps:如果遇到警告信息:WavFileWarning: Chunk (non-data) not understood, skipping it. 可以清除wav文件的元数据再试

制作HRTF效果

这个东西的简介我就不发了,直接度娘就好了
核心要求就是如下:
1,确定你要卷积的hrir方位点
2,最好是把双声道的文件分割成左右声道两个文件在进行卷积

我用的HRIR数据是CIPIC的,它是把数据以三维数组的形式保存在一个.mat文件里的。
直接上源码:

#coding=utf-8
#__Version__  1.0
#Python 2.7.13
'''
Filename: fast_convolution.py
Project: hrtf制作
Author: o花间留步面馆o
FileCreated:Sunday, 22nd March 2020 14:32
Last Modified:Sunday, 23nd March 2020 1857
'''
import wave
import numpy as np
from scipy.io import wavfile
from scipy.io import loadmat
from scipy.signal import fftconvolve  #所有操作需要的库global filename_l
global filename_r
global filename_over_l
global filename_over_r      #不想删了,怕又删出问题了。。。print ("输入所有文件的同一个上级父目录:\n")
file_path = input()print ("选择你的操作系统:\n 1,Mac/linux   2,windows")
tmp = input()def ououou():global filename_lglobal filename_rglobal filename_over_lglobal filename_over_rglobal hrir_lglobal hrir_rfilename = file_path + '\\hrtf\\hrir_final.mat'hrtfdata = loadmat(filename)  #导入hrir数据hrir_l = hrtfdata['hrir_l']hrir_r = hrtfdata['hrir_r']filename_l = file_path + '\\left.wav'filename_r = file_path + '\\right.wav'filename_over_l = file_path + '\\zuo.wav'filename_over_r = file_path + '\\you.wav'def lalala():global filename_lglobal filename_rglobal filename_over_lglobal filename_over_rglobal hrir_lglobal hrir_rfilename = file_path + '/hrtf/hrir_final.mat'hrtfdata = loadmat(filename)  #导入hrir数据hrir_l = hrtfdata['hrir_l']hrir_r = hrtfdata['hrir_r']filename_l = file_path + '/left.wav'filename_r = file_path + '/right.wav'filename_over_l = file_path + '/zuo.wav'filename_over_r = file_path + '/you.wav'if tmp == 1:lalala()if tmp == 2:ououou()def project_1(n,c):file_l = wave.open(filename_l,'rb')file_r = wave.open(filename_r,'rb')params_l = file_l.getparams()params_r = file_r.getparams()nchannels_l, sampwidth_l, framerate_l, nframes_l = params_l[:4]nchannels_r, sampwidth_r, framerate_r, nframes_r = params_r[:4]str_data_l = file_l.readframes(nframes_l)  #读取byte数组str_data_r = file_r.readframes(nframes_r)file_l.close()file_r.close()wavdatal = np.fromstring(str_data_l, dtype = np.float32)wavdatar = np.fromstring(str_data_r, dtype = np.float32)  #byte数组转十进制数组hrir_a = hrir_l[n,c,:]hrir_b = hrir_r[n,c,:]  #取方位点的数据overl = fftconvolve(hrir_a,wavdatal)overr = fftconvolve(hrir_b,wavdatar)  #最重要的操作,卷积wavfile.write(filename_over_l,44100,overl)wavfile.write(filename_over_r,44100,overr)  #写出文件def project_3(n,c):fs1, wavdatal = wavfile.read(filename_l)fs2, wavdatar = wavfile.read(filename_r)  hrir_a = hrir_l[n,c, :]hrir_b = hrir_r[n,c, :]overl = fftconvolve(hrir_a,wavdatal)overr = fftconvolve(hrir_b,wavdatar)wavfile.write(filename_over_l,44100,overl)wavfile.write(filename_over_r,44100,overr)def project_2(n,c):file_l = wave.open(filename_l,'rb')file_r = wave.open(filename_r,'rb')params_l = file_l.getparams()params_r = file_r.getparams()nchannels_l, sampwidth_l, framerate_l, nframes_l = params_l[:4]nchannels_r, sampwidth_r, framerate_r, nframes_r = params_r[:4]str_data_l = file_l.readframes(nframes_l)str_data_r = file_r.readframes(nframes_r)file_l.close()file_r.close()wavdatal = np.fromstring(str_data_l, dtype = np.short)wavdatar = np.fromstring(str_data_r, dtype = np.short)hrir_a = hrir_l[n,c,:]hrir_b = hrir_r[n,c,:]overl = fftconvolve(hrir_a,wavdatal)overr = fftconvolve(hrir_b,wavdatar)wavfile.write(filename_over_l,44100,overl)wavfile.write(filename_over_r,44100,overr)def project_4(n,a):fs1, wavdatal = wavfile.read(filename_l)fs2, wavdatar = wavfile.read(filename_r)hrir_a = hrir_l[0,0,:]hrir_b = hrir_r[0,0,:]overl = fftconvolve(hrir_a,wavdatal)overr = fftconvolve(hrir_b,wavdatar)for n in range(1,20,a):hrir_a = hrir_l[n,n,:]hrir_b = hrir_r[n,n,:]overl = fftconvolve(hrir_a,overl)overr = fftconvolve(hrir_b,overr)wavfile.write(filename_over_l,44100,overl)wavfile.write(filename_over_r,44100,overr)print("选择处理音频的方案:\n 1(成败参半,32位)     2(成败参半,16位)        3(稳定性ok)    4(实验性)")
o = 0
while o <= 3:print("输入代表方案的数字:\n")x = input()if x <= 4:breako = o + 1
if x == 1:n = int(raw_input("输入一个方位点:(0-24)").strip())c = int(raw_input("再输一个:(0-24)").strip())project_1(n,c)
if x == 2:n = int(raw_input("输入一个方位点:(0-24)").strip())c = int(raw_input("再输一个:(0-24)").strip())project_2(n,c)
if x == 3:n = int(raw_input("输入一个方位点:(0-24)").strip())c = int(raw_input("再输一个:(0-24)").strip())project_3(n,c)
if x == 4:n = int(raw_input("输入一个方位点:(0-24)").strip())a = int(raw_input("输每个方位点之间的间隔:(0-20)").strip())project_4(n,a)'''
注意事项:1、要使用这个脚本,你需要将你的音频文件拆分成左,右两个单声道文件,并分别命名为left.wav和right.wav放在桌面上
2、在桌面上新建两个空文件,分别命名为zuo.wav和you.wav
3、你需要使用cipic的hrir数据,它的格式为.mat,将它放在桌面的\hrtf文件夹里并命名为hrir_final.mat
4、要运行这个脚本你还需要安装scipy库和numpy库,如果只使用方案3,4则只需要scipy库python 2.x版本可以用 pip install scipypython 3.x版本则是 pip3 install scipy   #python3.x 我还没有测试
5、最后输出的数据需要限幅,我测试的结果它的输出最高到了792db
6、输入父目录时要按照如下格式:windows: 'C:\\Adminmaster\\Desktop' #手里没有windows电脑,这样写也是网上看的,两个反斜杠转义成一个Mac&linux: '/usr/share'
7、文件的所有输出都是44100hz,请尽量使用44100hz采样的音源
8、cipic的数据需要FQ下载,用wavfile读取的音频直接就以数组形式储存在name中
8、暂时就只想到这么多了,以后想到会补充的
'''
初学Python我也就只能写出这个水平的,肯定还有很多地方需要优化,还请大佬们不吝赐教

用Python实现音频卷积,并制作一个简单的HRTF效果相关推荐

  1. Unity中用shader graph制作一个简单的传送门效果

    Unity中用shader graph制作一个简单的传送门效果 一.配置渲染管线 1.通过菜单"Asset" --> "Create" --> &q ...

  2. 使用Hprose制作一个简单的分布式应用程序

    2019独角兽企业重金招聘Python工程师标准>>> 使用Hprose制作一个简单的分布式应用程序只需要几分钟的时间.本文将用一个简单的实例来带您快速浏览使用Hprose for ...

  3. python计算器教程,用Python程序制作一个简单的计算器

    用Python程序制作一个简单的计算器 在此示例中,您将学习创建一个简单的计算器,该计算器可以根据用户的输入进行加,减,乘或除. 要理解此示例,您应该了解以下Python编程主题: 通过函数创建简单计 ...

  4. 【meng_项目】python+flask+html+css制作一个简单的生日祝福语网页

    python+flask+html+css制作一个简单的生日祝福语网页 一个py文件:     test.py 一个html文件:   birthday_index.html 一张图片:       ...

  5. Python制作一个简单的抽奖软件(二)

    Python制作一个简单的抽奖软件(二) 认识QT 因为都对 QT和tkinter都没用过,之前简单使用tkinter后发现,界面调整不太好弄.然后度娘了之后,QT是强大GUI库之一,很多人都推荐它. ...

  6. Python开发第一步:如何制作一个简单的桌面应用

    Python开发第一步:如何制作一个简单的桌面应用 前言 大家好,我是baifagg, 一个热爱Python的编程爱好者. 今天我们来学习一下, 如何用Python制作一个简单的桌面应用程序. 虽然桌 ...

  7. 数字信号 fft c源码_如何制作一个简单的人体动态识别微信小程序(附源码)

    知乎小白第一次写专栏,还请多指教. 先放成果. GitHub源码: lrioxh/HAR-applet-of-Wechat​github.com b站演示视频: 居然不需要服务器?!如何制作一个简单的 ...

  8. php怎么做考勤行事例,PHP开发制作一个简单的活动日程表Calendar

    材料取之深入PHP与JQuery开发,这本书实际上就是讲述一个活动日程表. 此文章适合从其它语言(如java,C++,python等)转到php,没有系统学习php,或者是php初学者,已经对程序有较 ...

  9. 如何用php做每天日程安排,PHP开发制作一个简单的活动日程表Calendar,日程表calendar...

    PHP开发制作一个简单的活动日程表Calendar,日程表calendar 材料取之深入PHP与JQuery开发,这本书实际上就是讲述一个活动日程表. 此文章适合从其它语言(如java,C++,pyt ...

最新文章

  1. sql server 中将由逗号“,”分割的一个字符串,转换为一个表,并应用与 in 条件...
  2. php获取地址栏id,如何解决php urldecode乱码问题
  3. 【Android 性能优化】布局渲染优化 ( GPU 过度绘制优化总结 | CPU 渲染过程 | Layout Inspector 工具 | View Tree 分析 | 布局组件层级分析 )
  4. FreeRTOS任务创建和删除
  5. 微信小程序连接本地接口(转)
  6. 获取汉字首字母,拼音,可实现拼音字母搜索----npm js-pinyin
  7. deeplab v3 ppt_「秋叶PPT」被这件事难倒的张雨绮,撕开了千万职场人最羞愧的一面...
  8. armeabi-v7a arm64-v8a armeabi x86 x86_64区别
  9. 【论文解读】异构图表示学习综述 韩家炜组
  10. window10激活
  11. http请求417错误
  12. 超简单微信登录(微信SDK接入、友盟SDK接入)
  13. 加载网页时弹出div
  14. 巨人网络18年春招java答案_巨人网络18春招Java开发笔试题,希望对大家能有帮助...
  15. 微信公众号(八)——关注时自动回复(文字 图片)
  16. MATLAB Jacobi迭代法 求解线性方程组
  17. 【论文分享】ACL 2020 神经网络的可解释性
  18. ESP32+PIO+LGVL+gui_guider
  19. 大数据薪水大概多少_入行大数据,薪资待遇到底能拿多少?
  20. JAVA游戏土行孙_挖掘机的三种形态《非人学园》土行孙快速上手指南

热门文章

  1. potplayer万能播放器下载
  2. K8S node节点not ready
  3. 铁路列车车次编码规则
  4. catch that cow(bfs)
  5. 创新指南 | 推动销售的17个可落地的集客式营销示例
  6. Android 广播 goAsync PendingResult 异步任务
  7. android n 小米5体验,体验报告系列 篇一:#原创新人#90天 MI 小米 5使用体验报告...
  8. 指南针每个方位的度数
  9. 计算机病毒英文文献,计算机病毒外文翻译翻译英文外文外文翻译计算机病毒外文翻英文文献计算机.doc...
  10. 修改mac终端命令行的前缀