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中time模块和datetime模块的用法示例
Feb 28 Python
Python实现的密码强度检测器示例
Aug 23 Python
基于Python的文件类型和字符串详解
Dec 21 Python
python实现抽奖小程序
Apr 15 Python
Falsk 与 Django 过滤器的使用与区别详解
Jun 04 Python
对Pytorch中nn.ModuleList 和 nn.Sequential详解
Aug 18 Python
python连接、操作mongodb数据库的方法实例详解
Sep 11 Python
Python中用pyinstaller打包时的图标问题及解决方法
Feb 17 Python
浅谈Python中的模块
Jun 10 Python
Python 操作 MySQL数据库
Sep 18 Python
pyqt5实现井字棋的示例代码
Dec 07 Python
再谈python_tkinter弹出对话框创建
Mar 20 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也能干大事 随机函数
2015/04/14 PHP
详谈php中 strtr 和 str_replace 的效率问题
2017/05/14 PHP
Laravel 的数据库迁移的方法
2017/07/31 PHP
PHP中in_array的隐式转换的解决方法
2018/03/06 PHP
php 获取xml接口数据的处理方法
2018/05/31 PHP
laravel 执行迁移回滚示例
2019/10/23 PHP
JSON 数据格式介绍
2012/01/13 Javascript
js验证是否为数字的总结
2013/04/14 Javascript
JS实现清除指定cookies的方法
2014/09/20 Javascript
jQuery前端框架easyui使用Dialog时bug处理
2014/12/05 Javascript
JS实现屏蔽shift,Ctrl,alt等功能键的方法
2015/06/01 Javascript
深入分析JSON编码格式提交表单数据
2015/06/25 Javascript
AngularJS中的JSONP实例解析
2016/12/01 Javascript
vue实现app页面切换动画效果实例
2017/05/23 Javascript
angularjs+bootstrap实现自定义分页的实例代码
2017/06/19 Javascript
vue element自定义表单验证请求后端接口验证
2019/12/11 Javascript
js实现点击生成随机div
2020/01/16 Javascript
Python中实现对Timestamp和Datetime及UTC时间之间的转换
2015/04/08 Python
浅谈Python的Django框架中的缓存控制
2015/07/24 Python
Python深入06——python的内存管理详解
2016/12/07 Python
Python实现的爬取百度贴吧图片功能完整示例
2019/05/10 Python
使用python将最新的测试报告以附件的形式发到指定邮箱
2019/09/20 Python
Python绘图之二维图与三维图详解
2020/08/04 Python
K近邻法(KNN)相关知识总结以及如何用python实现
2021/01/28 Python
红色康乃馨酒店:Red Carnation Hotels
2017/06/22 全球购物
英国皇室御用百货:福南梅森(Fortnum & Mason)
2017/12/03 全球购物
新英格兰最大的特色礼品连锁店:The Paper Store
2018/07/23 全球购物
衰败城市英国官网:Urban Decay英国
2020/04/29 全球购物
Java里面如何把一个Array数组转换成Collection, List
2013/07/26 面试题
求职信格式要求
2014/05/23 职场文书
现场活动策划方案
2014/08/22 职场文书
故意伤害罪辩护词
2015/05/21 职场文书
入党函调证明材料
2015/06/19 职场文书
MATLAB 如何求取离散点的曲率最大值
2021/04/16 Python
MySQL 表空间碎片的概念及相关问题解决
2021/05/07 MySQL
golang中字符串MD5生成方式总结
2021/07/04 Golang