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的Flask框架中web表单的教程
Apr 20 Python
Python3 XML 获取雅虎天气的实现方法
Feb 01 Python
TensorFlow实现Batch Normalization
Mar 08 Python
详解Django中六个常用的自定义装饰器
Jul 04 Python
Python 带有参数的装饰器实例代码详解
Dec 06 Python
对dataframe数据之间求补集的实例详解
Jan 30 Python
下载官网python并安装的步骤详解
Oct 12 Python
关于sys.stdout和print的区别详解
Dec 05 Python
浅谈SciPy中的optimize.minimize实现受限优化问题
Feb 29 Python
python利用appium实现手机APP自动化的示例
Jan 26 Python
python中numpy数组与list相互转换实例方法
Jan 29 Python
yolov5返回坐标的方法实例
Mar 17 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
使用 MySQL 开始 PHP 会话
2006/12/21 PHP
PHP IF ELSE简化/三元一次式的使用
2011/08/22 PHP
PHP中call_user_func_array()函数的用法演示
2012/02/05 PHP
php实现利用phpexcel导出数据
2013/08/24 PHP
php快速排序原理与实现方法分析
2016/05/26 PHP
微信公众号开发之语音消息识别php代码
2016/08/08 PHP
jQuery实现表单input中提示文字value随鼠标焦点移进移出而显示或隐藏的代码
2010/03/21 Javascript
DIV菜单层实现代码
2010/11/19 Javascript
JS文本获得焦点清除文本文字的示例代码
2014/01/13 Javascript
js跨域问题浅析及解决方法优缺点对比
2014/11/08 Javascript
JavaScript基础篇(6)之函数表达式闭包
2015/12/11 Javascript
addeventlistener监听scroll跟touch(实例讲解)
2017/08/04 Javascript
Vue-router 类似Vuex实现组件化开发的示例
2017/09/15 Javascript
JS实现的JSON数组去重算法示例
2018/04/11 Javascript
layer实现弹出层自动调节位置
2019/09/05 Javascript
Vue项目中如何使用Axios封装http请求详解
2019/10/23 Javascript
vue实现计步器功能
2019/11/01 Javascript
解决vue elementUI中table里数字、字母、中文混合排序问题
2020/01/07 Javascript
微信小程序实现页面左右滑动
2020/11/16 Javascript
基于进程内通讯的python聊天室实现方法
2015/06/28 Python
Python实现列表转换成字典数据结构的方法
2016/03/11 Python
Python连接SQLServer2000的方法详解
2017/04/19 Python
Python解决八皇后问题示例
2018/04/22 Python
python中从str中提取元素到list以及将list转换为str的方法
2018/06/26 Python
Python Django 页面上展示固定的页码数实现代码
2019/08/21 Python
Python3.7 pyodbc完美配置访问access数据库
2019/10/03 Python
Django框架HttpRequest对象用法实例分析
2019/11/01 Python
使用 Python ssh 远程登陆服务器的最佳方案
2020/03/06 Python
用HTML5中的Canvas结合公式绘制粒子运动的教程
2015/05/08 HTML / CSS
美国在线家具网站:GDFStudio
2021/03/13 全球购物
什么是触发器(trigger)? 触发器有什么作用?
2013/09/18 面试题
财务会计人员岗位职责
2013/11/30 职场文书
父亲八十大寿答谢词
2014/01/23 职场文书
技术经济专业求职信
2014/09/03 职场文书
活动主持人开场白
2015/05/28 职场文书
追悼会悼词大全
2015/06/23 职场文书