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自动格式化json文件的方法
Mar 11 Python
在Python中使用成员运算符的示例
May 13 Python
基于asyncio 异步协程框架实现收集B站直播弹幕
Sep 11 Python
Python2和Python3中print的用法示例总结
Oct 25 Python
pyinstaller打包opencv和numpy程序运行错误解决
Aug 16 Python
opencv实现简单人脸识别
Feb 19 Python
Python类中方法getitem和getattr详解
Aug 30 Python
python rsa实现数据加密和解密、签名加密和验签功能
Sep 18 Python
python3获取url文件大小示例代码
Sep 18 Python
python使用matplotlib绘制折线图的示例代码
Sep 22 Python
python二维图制作的实例代码
Dec 03 Python
python编程的核心知识点总结
Feb 08 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
PHP4 与 MySQL 数据库操作函数详解
2006/10/09 PHP
用PHP编写PDF文档生成器
2006/10/09 PHP
PHP中防止SQL注入实现代码
2011/02/19 PHP
PHP下使用CURL方式POST数据至API接口的代码
2013/02/14 PHP
Laravel中使用Queue的最基本操作教程
2017/12/27 PHP
jquery实现按Enter键触发事件示例
2013/09/10 Javascript
Jquery getJSON方法详细分析
2013/12/26 Javascript
原生js配合cookie制作保存路径的拖拽
2015/12/29 Javascript
JS实现的图片预览插件与用法示例【不上传图片】
2016/11/25 Javascript
bootstrap table 数据表格行内修改的实现代码
2017/02/13 Javascript
关闭Vue计算属性自带的缓存功能方法
2018/03/02 Javascript
vue-cli扩展多模块打包的示例代码
2018/04/09 Javascript
Node.js文件编码格式的转换的方法
2018/04/27 Javascript
微信小程序自定义对话框弹出和隐藏动画
2018/07/19 Javascript
微信小程序全局变量功能与用法详解
2019/01/22 Javascript
Vue使用JSEncrypt实现rsa加密及挂载方法
2020/02/07 Javascript
js实现弹窗效果
2020/08/09 Javascript
Antd-vue Table组件添加Click事件,实现点击某行数据教程
2020/11/17 Javascript
[01:08]2014DOTA2展望TI 剑指西雅图LGD战队专访
2014/06/30 DOTA
python循环监控远程端口的方法
2015/03/14 Python
Python爬虫爬取新浪微博内容示例【基于代理IP】
2018/08/03 Python
python3实现爬取淘宝美食代码分享
2018/09/23 Python
Django利用cookie保存用户登录信息的简单实现方法
2019/05/27 Python
CSS3 Calc实现滚动条出现页面不跳动问题
2017/09/14 HTML / CSS
伦敦最有品味的百货:Liberty London
2016/11/12 全球购物
Zavvi美国:英国娱乐之家
2017/03/19 全球购物
南京迈特望C/C++面试题
2012/07/09 面试题
什么是继承
2013/12/07 面试题
品质主管的岗位职责
2013/12/04 职场文书
实习会计求职自荐信范文
2014/03/10 职场文书
五心教育心得体会
2014/09/04 职场文书
放飞理想演讲稿
2014/09/09 职场文书
领导干部民主生活会自我剖析材料范文
2014/09/20 职场文书
浅谈JS和Nodejs中的事件驱动
2021/05/05 NodeJs
PostgreSQL基于pgrouting的路径规划处理方法
2022/04/18 PostgreSQL
java中如何截取字符串最后一位
2022/07/07 Java/Android