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的id()函数解密过程
Dec 25 Python
python实现数值积分的Simpson方法实例分析
Jun 05 Python
Python全局变量用法实例分析
Jul 19 Python
python和pygame实现简单俄罗斯方块游戏
Feb 19 Python
详解python实现数据归一化处理的方式:(0,1)标准化
Jul 17 Python
大家都说好用的Python命令行库click的使用
Nov 07 Python
Python numpy线性代数用法实例解析
Nov 15 Python
python从zip中删除指定后缀文件(推荐)
Dec 05 Python
浅谈python中频繁的print到底能浪费多长时间
Feb 21 Python
Python安装OpenCV的示例代码
Mar 05 Python
详解Python自动化之文件自动化处理
Jun 21 Python
python编程实现清理微信重复缓存文件
Nov 01 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设计模式 注册表模式
2012/02/05 PHP
php生成与读取excel文件
2016/10/14 PHP
PHP registerXPathNamespace()函数讲解
2019/02/03 PHP
URL编码转换,escape() encodeURI() encodeURIComponent()
2006/12/27 Javascript
js鼠标左右键 键盘值小结
2010/06/11 Javascript
JS文本框追加多个下拉框的值的简单实例
2013/07/12 Javascript
文本域光标操作的jQuery扩展分享
2014/03/10 Javascript
Javascript表单验证要注意的事项
2014/09/29 Javascript
浅谈JSON和JSONP区别及jQuery的ajax jsonp的使用
2014/11/23 Javascript
高性能JavaScript模板引擎实现原理详解
2015/02/05 Javascript
原生js实现的贪吃蛇网页版游戏完整实例
2015/05/18 Javascript
深入学习JavaScript对象
2015/10/13 Javascript
理解AngularJs指令
2015/12/10 Javascript
Highcharts入门之基本属性
2016/08/02 Javascript
基于jQuery实现Accordion手风琴自定义插件
2020/10/13 Javascript
vue元素实现动画过渡效果
2017/07/01 Javascript
详解vue+axios给开发环境和生产环境配置不同的接口地址
2019/08/16 Javascript
[55:45]DOTA2上海特级锦标赛D组败者赛 Liquid VS COL第一局
2016/02/28 DOTA
Python 流程控制实例代码
2009/09/25 Python
使用Python操作Elasticsearch数据索引的教程
2015/04/08 Python
Windows安装Python、pip、easy_install的方法
2017/03/05 Python
[原创]使用豆瓣提供的国内pypi源
2017/07/02 Python
python GUI实例学习
2017/11/21 Python
python数字类型math库原理解析
2020/03/02 Python
SpringBoot实现登录注册常见问题解决方案
2020/03/04 Python
Python PyQt5整理介绍
2020/04/01 Python
Python爬虫JSON及JSONPath运行原理详解
2020/06/04 Python
通过代码实例了解Python异常本质
2020/09/16 Python
美国最佳在线航班预订网站:LookupFare
2019/03/26 全球购物
商务专员岗位职责范本
2014/06/29 职场文书
考试作弊检讨书
2014/10/21 职场文书
工作疏忽检讨书500字
2014/10/26 职场文书
2014年四风个人对照检查及整改措施
2014/10/28 职场文书
铁路安全反思材料
2014/12/24 职场文书
pytorch中F.avg_pool1d()和F.avg_pool2d()的使用操作
2021/05/22 Python
php实现自动生成验证码的实例讲解
2021/11/17 PHP