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 相关文章推荐
利用pyinstaller或virtualenv将python程序打包详解
Mar 22 Python
Python3.4实现从HTTP代理网站批量获取代理并筛选的方法示例
Sep 26 Python
Python用csv写入文件_消除空余行的方法
Jul 06 Python
在Pycharm中项目解释器与环境变量的设置方法
Oct 29 Python
Pycharm配置远程调试的方法步骤
Dec 17 Python
python requests使用socks5的例子
Jul 25 Python
使用python获取邮箱邮件的设置方法
Sep 20 Python
Django中使用Json返回数据的实现方法
Jun 03 Python
python thrift 实现 单端口多服务的过程
Jun 08 Python
keras Lambda自定义层实现数据的切片方式,Lambda传参数
Jun 11 Python
如何利用python正则表达式匹配版本信息
Dec 09 Python
python爬虫请求库httpx和parsel解析库的使用测评
May 10 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
PHP 工厂模式使用方法
2010/05/18 PHP
php数组函数序列之in_array() 查找数组值是否存在
2011/10/29 PHP
PHP程序员必须知道的两种日志实例分析
2020/05/14 PHP
求解开jscript.encode代码的asp函数
2007/02/28 Javascript
JavaScript instanceof 的使用方法示例介绍
2013/10/23 Javascript
鼠标经过tr时,改变tr当前背景颜色
2014/01/13 Javascript
JavaScript中this详解
2015/09/01 Javascript
javascript中JSON.parse()与eval()解析json的区别
2016/05/19 Javascript
jQuery 局部div刷新和全局刷新方法总结
2016/10/05 Javascript
深入理解jquery中extend的实现
2016/12/22 Javascript
iscroll.js滚动加载实例详解
2017/07/18 Javascript
使用watch监听路由变化和watch监听对象的实例
2018/02/24 Javascript
vue列表单项展开收缩功能之this.$refs的详解
2019/05/05 Javascript
vue 关闭浏览器窗口的时候,清空localStorage的数据示例
2019/11/06 Javascript
Vue触发input选取文件点击事件操作
2020/08/07 Javascript
解决Antd Table组件表头不对齐的问题
2020/10/27 Javascript
Python通过RabbitMQ服务器实现交换机功能的实例教程
2016/06/29 Python
python 常用的基础函数
2018/07/10 Python
python实现决策树分类
2018/08/30 Python
Python3 Tkinkter + SQLite实现登录和注册界面
2019/11/19 Python
解决python 执行sql语句时所传参数含有单引号的问题
2020/06/06 Python
python文件读取失败怎么处理
2020/06/23 Python
Django项目在pycharm新建的步骤方法
2021/03/02 Python
分享CSS3中必须要知道的10个顶级命令
2012/04/26 HTML / CSS
美国玛丽莎收藏奢华时尚商店:Marissa Collections
2016/11/21 全球购物
Claire’s法国:时尚配饰、美容、珠宝、头发
2021/01/16 全球购物
优秀毕业生推荐信
2013/11/02 职场文书
境外导游求职信
2014/02/27 职场文书
物业工程部岗位职责
2015/02/11 职场文书
财政局长个人总结
2015/03/04 职场文书
新郎父母婚礼致辞
2015/07/27 职场文书
家属联谊会致辞
2015/07/31 职场文书
2016中秋节晚会开场白
2015/11/26 职场文书
html5 录制mp3音频支持采样率和比特率设置
2021/07/15 Javascript
《英雄联盟》2022日蚀、月蚀皮肤演示 黑潮亚索曝光
2022/04/13 其他游戏
mysql sock 文件解析及作用讲解
2022/07/15 MySQL