python 实现音频叠加的示例


Posted in Python onOctober 29, 2020

如果你有两条音频合成为一条音频(叠加,不是拼接)的需求,以下代码可以直接使用,需要修改的地方我已经标出来了,有三处需要修改你的本地音频的地址:输入音频1,输入音频2,输出音频3。

python3.8:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import os
import wave
import numpy as np
import pyaudio
import librosa
import soundfile as sf
import scipy.signal as signal
import struct
# ok,音频叠加!我这里4.wav和5.wav都是5s的音频,还没有测试时长不同的音频!
# 参考文档:https://www.cnblogs.com/xingshansi/p/6799994.html
x,_ = librosa.load('D:/4.wav', sr=16000) #需要修改的地方:音频1
sf.write('t1.wav',x,16000)
y,_ = librosa.load('D:/5.wav', sr=16000) #需要修改的地方:音频2
sf.write('t2.wav',y,16000)
f1 = wave.open('t1.wav', 'rb')
f2 = wave.open('t2.wav', 'rb')
 
# 音频1的数据
params1 = f1.getparams()
nchannels1, sampwidth1, framerate1, nframes1, comptype1, compname1 = params1[:6]
print(nchannels1, sampwidth1, framerate1, nframes1, comptype1, compname1)
f1_str_data = f1.readframes(nframes1)
f1.close()
f1_wave_data = np.frombuffer(f1_str_data, dtype=np.int16)
 
# 音频2的数据
params2 = f2.getparams()
nchannels2, sampwidth2, framerate2, nframes2, comptype2, compname2 = params2[:6]
print(nchannels2, sampwidth2, framerate2, nframes2, comptype2, compname2)
f2_str_data = f2.readframes(nframes2)
f2.close()
f2_wave_data = np.frombuffer(f2_str_data, dtype=np.int16)
 
# 对不同长度的音频用数据零对齐补位
if nframes1 < nframes2:
    length = abs(nframes2 - nframes1)
    temp_array = np.zeros(length, dtype=np.int16)
    rf1_wave_data = np.concatenate((f1_wave_data, temp_array))
    rf2_wave_data = f2_wave_data
elif nframes1 > nframes2:
    length = abs(nframes2 - nframes1)
    temp_array = np.zeros(length, dtype=np.int16)
    rf2_wave_data = np.concatenate((f2_wave_data, temp_array))
    rf1_wave_data = f1_wave_data
else:
    rf1_wave_data = f1_wave_data
    rf2_wave_data = f2_wave_data
 
# ================================
# 合并1和2的数据
new_wave_data = rf1_wave_data + rf2_wave_data
new_wave_data = new_wave_data*1.0/(max(abs(new_wave_data)))#wave幅值归一化
new_wave = new_wave_data.tostring()
 
p = pyaudio.PyAudio()
CHANNELS = 1
FORMAT = pyaudio.paInt16
 
# 写文件
framerate = 44100
time = 10
 
# 产生10秒44.1kHz的100Hz - 1kHz的频率扫描波。没用!
t = np.arange(0, time, 1.0/framerate)
wave_data = signal.chirp(t, 100, time, 1000, method='linear') * 10000
wave_data = wave_data.astype(np.short)
 
# 打开WAV文档
f = wave.open(r"D:\6.wav", "wb") # 需要修改的地方:输出音频
 
# 配置声道数、量化位数和取样频率
nchannels = 1 #单通道为例
sampwidth = 2
data_size = len(new_wave_data)
framerate = 16000 # 设置为44100就是1s,设置为8000就是10s,只有16000才是5s是对的。这里还没搞懂!
nframes = data_size
comptype = "NONE"
compname = "not compressed"
f.setparams((nchannels, sampwidth, framerate, nframes, comptype, compname))
# 将wav_data转换为二进制数据写入文件
# f.writeframes(new_wave)
for v in new_wave_data:
    f.writeframes(struct.pack('h', int(v * 64000 / 2)))
f.close()
 
# 实现录音,暂时用不到。
def record(re_frames, WAVE_OUTPUT_FILENAME):
    print("开始录音")
    wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
    wf.setnchannels(CHANNELS)
    wf.setsampwidth(p.get_sample_size(FORMAT))
    wf.setframerate(RATE)
    wf.writeframes(re_frames)
    wf.close()
    print("关闭录音")

以上就是python 实现音频叠加的示例的详细内容,更多关于python 音频叠加的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python基础教程之udp端口扫描
Feb 10 Python
深入分析在Python模块顶层运行的代码引起的一个Bug
Jul 04 Python
Python入门篇之数字
Oct 20 Python
python开发之IDEL(Python GUI)的使用方法图文详解
Nov 12 Python
对Python 获取类的成员变量及临时变量的方法详解
Jan 22 Python
Python中按值来获取指定的键
Mar 04 Python
Django中Middleware中的函数详解
Jul 18 Python
快速解决docker-py api版本不兼容的问题
Aug 30 Python
Python中断多重循环的思路总结
Oct 04 Python
python实现凯撒密码、凯撒加解密算法
Jun 11 Python
PyCharm 2020.1版安装破解注册码永久激活(激活到2089年)
Sep 24 Python
python中uuid模块实例浅析
Dec 29 Python
详解python的super()的作用和原理
Oct 29 #Python
Python生成pdf目录书签的实例方法
Oct 29 #Python
利用python清除移动硬盘中的临时文件
Oct 28 #Python
python实现一个简单RPC框架的示例
Oct 28 #Python
pycharm永久激活超详细教程
Oct 29 #Python
linux mint中搜狗输入法导致pycharm卡死的问题
Oct 28 #Python
浅谈Python __init__.py的作用
Oct 28 #Python
You might like
mysql4.1以上版本连接时出现Client does not support authentication protocol问题解决办法
2007/03/15 PHP
php下判断数组中是否存在相同的值array_unique
2008/03/25 PHP
php多重接口的实现方法
2015/06/20 PHP
PHP实现通过get方式识别用户发送邮件的方法
2015/07/16 PHP
执行iframe中的javascript方法
2008/10/07 Javascript
网页前台通过js非法字符过滤代码(骂人的话等等)
2010/05/26 Javascript
Document对象内容集合(比较全)
2010/09/06 Javascript
Textarea与懒惰渲染实现代码
2012/01/04 Javascript
jQuery隔行变色与普通JS写法的对比
2013/04/21 Javascript
jQuery中获取Radio元素值的方法
2013/07/02 Javascript
js获取IP地址的方法小结
2014/07/01 Javascript
node.js调用C++开发的模块实例
2015/07/03 Javascript
Bootstrap+jfinal实现省市级联下拉菜单
2016/05/30 Javascript
jQuery手指滑动轮播效果
2016/12/22 Javascript
EasyUI学习之DataGird分页显示数据
2016/12/29 Javascript
js cookie实现记住密码功能
2017/01/17 Javascript
实现微信小程序的wxml文件和wxss文件在webstrom的支持
2017/06/12 Javascript
Vue.js 点击按钮显示/隐藏内容的实例代码
2018/02/08 Javascript
layer弹出层扩展主题的方法
2019/09/11 Javascript
javascript实现京东快递单号的查询效果
2020/11/30 Javascript
Python中使用tarfile压缩、解压tar归档文件示例
2015/04/05 Python
python比较2个xml内容的方法
2015/05/11 Python
python基础教程之匿名函数lambda
2017/01/17 Python
python交互界面的退出方法
2019/02/16 Python
Python同步遍历多个列表的示例
2019/02/19 Python
Python字典推导式将cookie字符串转化为字典解析
2019/08/10 Python
OpenCV实现机器人对物体进行移动跟随的方法实例
2020/11/09 Python
python爬虫scrapy框架之增量式爬虫的示例代码
2021/02/26 Python
美国最大和最受信任的二手轮胎商店:Bestusedtires.com
2020/06/02 全球购物
初中生学习的自我评价
2013/11/14 职场文书
法学专业自我鉴定
2014/02/05 职场文书
奥巴马英文演讲稿
2014/05/15 职场文书
承德避暑山庄导游词
2015/02/03 职场文书
2015年机械设备管理工作总结
2015/05/04 职场文书
入党函调证明材料
2015/06/19 职场文书
MySQL 数据类型详情
2021/11/11 MySQL