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 相关文章推荐
在Django框架中运行Python应用全攻略
Jul 17 Python
python实现简单socket通信的方法
Apr 19 Python
快速了解python leveldb
Jan 18 Python
PyCharm代码整体缩进,反向缩进的方法
Jun 25 Python
python中pika模块问题的深入探究
Oct 13 Python
对python读取CT医学图像的实例详解
Jan 24 Python
pandas计数 value_counts()的使用
Jun 24 Python
用Python配平化学方程式的方法
Jul 20 Python
什么是Python变量作用域
Jun 03 Python
keras自定义损失函数并且模型加载的写法介绍
Jun 15 Python
Selenium webdriver添加cookie实现过程详解
Aug 12 Python
Django自带的用户验证系统实现
Dec 18 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+mysql结合Ajax实现点赞功能完整实例
2015/01/30 PHP
学习php设计模式 php实现装饰器模式(decorator)
2015/12/07 PHP
thinkphp5 URL和路由的功能详解与实例
2017/12/26 PHP
PHP使用PDO实现mysql防注入功能详解
2019/12/20 PHP
firefox firebug中文入门教程 脚本之家新年特别版
2010/01/02 Javascript
jquery EasyUI的formatter格式化函数代码
2011/01/12 Javascript
jQuery之$(document).ready()使用介绍
2012/04/05 Javascript
js实现的map方法示例代码
2014/01/13 Javascript
BootStrap使用file-input插件上传图片的方法
2016/09/05 Javascript
JavaScript实现图片轮播组件代码示例
2016/11/22 Javascript
JavaScript实现邮箱地址自动匹配功能代码
2016/11/28 Javascript
JavaScript简单验证表单空值及邮箱格式的方法
2017/01/20 Javascript
利用Javascript裁剪图片并存储的简单实现
2017/03/13 Javascript
解决AngualrJS页面刷新导致异常显示问题
2017/04/20 Javascript
兼容浏览器的js事件绑定函数(详解)
2017/05/09 Javascript
nodejs操作mysql实现增删改查的实例
2017/05/28 NodeJs
vue时间格式化实例代码
2017/06/13 Javascript
vue-cli3.0使用及部分配置详解
2018/08/29 Javascript
Element MessageBox弹框的具体使用
2020/07/27 Javascript
[54:58]完美世界DOTA2联赛PWL S2 LBZS vs Rebirth 第一场 11.25
2020/11/25 DOTA
给Python初学者的一些编程技巧
2015/04/03 Python
Java分治归并排序算法实例详解
2017/12/12 Python
使用python实现链表操作
2018/01/26 Python
pyhanlp安装介绍和简单应用
2019/02/22 Python
Python函数定义及传参方式详解(4种)
2019/03/18 Python
Django框架实现的普通登录案例【使用POST方法】
2019/05/15 Python
Python的pygame安装教程详解
2020/02/10 Python
英国高街品牌:Miss Selfridge(塞尔弗里奇小姐)
2016/09/21 全球购物
PHP如何与mysql建立链接
2013/05/05 面试题
英语翻译系毕业生求职信
2013/09/29 职场文书
征婚广告词
2014/03/17 职场文书
2014年初级职称工作总结
2014/12/08 职场文书
长江三峡导游词
2015/01/31 职场文书
大学生思想道德自我评价
2015/03/09 职场文书
2019员工保密协议书(3篇)
2019/09/23 职场文书
创业计划书之熟食店
2019/10/16 职场文书