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读写文本文件及编写简单的文本编辑器
Mar 11 Python
Python3中类、模块、错误与异常、文件的简易教程
Nov 20 Python
Python实现的直接插入排序算法示例
Apr 29 Python
python方法生成txt标签文件的实例代码
May 10 Python
python中单下划线_的常见用法总结
Jul 10 Python
Sanic框架基于类的视图用法示例
Jul 18 Python
在Python中分别打印列表中的每一个元素方法
Nov 07 Python
Python使用sorted对字典的key或value排序
Nov 15 Python
利用python计算时间差(返回天数)
Sep 07 Python
Python开发之基于模板匹配的信用卡数字识别功能
Jan 13 Python
在python3中使用shuffle函数要注意的地方
Feb 28 Python
PyQt5+python3+pycharm开发环境配置教程
Mar 24 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
实例(Smarty+FCKeditor新闻系统)
2007/01/02 PHP
laravel按天、按小时,查询数据的实例
2019/10/09 PHP
laravel 创建命令行命令的图文教程
2019/10/23 PHP
JavaScript 乱码问题
2009/08/06 Javascript
菜鸟javascript基础资料整理3 正则
2010/12/06 Javascript
CheckBoxList多选样式jquery、C#获取选择项
2013/09/06 Javascript
js导航栏单击事件背景变换示例代码
2014/01/13 Javascript
display和visibility的区别示例介绍
2014/02/26 Javascript
使用js画图之画切线
2015/01/12 Javascript
js实现浮动在网页右侧的简洁QQ在线客服代码
2015/09/04 Javascript
javascript html5实现表单验证
2016/03/01 Javascript
jQuery实现无限往下滚动效果代码
2016/04/16 Javascript
JavaScript中各种引用类型的常用操作方法小结
2016/05/05 Javascript
简单的JS轮播图代码
2016/07/18 Javascript
Bootstrap源码解读导航条(7)
2016/12/23 Javascript
在Vue中使用Compass的方法
2018/03/02 Javascript
微信小程序扫描二维码获取信息实例详解
2019/05/07 Javascript
vue quill editor 使用富文本添加上传音频功能
2020/01/14 Javascript
JS面向对象之多选框实现
2020/01/17 Javascript
Python中使用urllib2防止302跳转的代码例子
2014/07/07 Python
python 使用get_argument获取url query参数
2017/04/28 Python
python dataframe astype 字段类型转换方法
2018/04/11 Python
python 获取微信好友列表的方法(微信web)
2019/02/21 Python
PyQT5 emit 和 connect的用法详解
2019/12/13 Python
tensorflow将图片保存为tfrecord和tfrecord的读取方式
2020/02/17 Python
为您的家、后院、车库等在线购物:Spreetail
2019/06/17 全球购物
大学毕业登记表自我鉴定
2013/10/09 职场文书
临床医学专业毕业生的自我评价
2013/10/17 职场文书
中专生自我鉴定
2013/12/17 职场文书
学校后勤人员职责
2013/12/27 职场文书
中学运动会广播稿
2014/01/19 职场文书
婚庆司仪主持词
2014/03/15 职场文书
安全口号大全
2014/06/21 职场文书
小学公民道德宣传日活动总结
2015/03/23 职场文书
格列夫游记读书笔记
2015/07/01 职场文书
Elasticsearch Recovery 详细介绍
2022/04/19 Java/Android