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之import机制详解
Jul 03 Python
Django中传递参数到URLconf的视图函数中的方法
Jul 18 Python
Python基于QRCode实现生成二维码的方法【下载,安装,调用等】
Jul 11 Python
Python中turtle作图示例
Nov 15 Python
Python 3.6 读取并操作文件内容的实例
Apr 23 Python
破解安装Pycharm的方法
Oct 19 Python
在Python 中实现图片加框和加字的方法
Jan 26 Python
Python数据类型之Dict字典实例详解
May 07 Python
python程序 线程队列queue使用方法解析
Sep 23 Python
Selenium及python实现滚动操作多种方法
Jul 21 Python
Python使用xpath实现图片爬取
Sep 16 Python
基于Python的EasyGUI学习实践
May 07 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目录操作实例代码
2014/02/21 PHP
ThinkPHP中ajax使用实例教程
2014/08/22 PHP
php遍历树的常用方法汇总
2015/06/18 PHP
PHP aes (ecb)解密后乱码问题
2015/06/22 PHP
PHP简单判断字符串是否包含另一个字符串的方法
2016/03/25 PHP
PHP5.3连接Oracle客户端及PDO_OCI模块的安装方法
2016/05/13 PHP
php简单计算权重的方法示例【适合抽奖类应用】
2019/06/10 PHP
推荐:极酷右键菜单
2006/11/29 Javascript
ImageFlow可鼠标控制图片滚动
2008/01/30 Javascript
jquery下onpropertychange事件的绑定方法
2010/08/01 Javascript
JS运行耗时操作的延时显示方法
2010/11/19 Javascript
到处都是jQuery选择器的年代 不了解它们的性能,行吗
2012/06/18 Javascript
js过滤HTML标签以及空格的思路及代码
2013/05/24 Javascript
浅谈jQuery中对象遍历.eq().first().last().slice()方法
2014/11/26 Javascript
jQuery选择器源码解读(四):tokenize方法的Expr.preFilter
2015/03/31 Javascript
JavaScript中函数表达式和函数声明及函数声明与函数表达式的不同
2015/11/15 Javascript
js仿3366小游戏选字游戏
2016/04/14 Javascript
jQuery如何解决IE输入框不能输入的问题
2016/10/08 Javascript
mui开发中获取单选按钮、复选框的值(实例讲解)
2017/07/24 Javascript
解决webpack多页面内存溢出的方法示例
2019/10/08 Javascript
Vue使用Three.js加载glTF模型的方法详解
2020/06/14 Javascript
javascript实现贪吃蛇小练习
2020/07/05 Javascript
vue-cli 关闭热更新操作
2020/09/18 Javascript
python 测试实现方法
2008/12/24 Python
python实现解数独程序代码
2017/04/12 Python
Python开发微信公众平台的方法详解【基于weixin-knife】
2017/07/08 Python
几种实用的pythonic语法实例代码
2018/02/24 Python
selenium+python实现自动化登录的方法
2018/09/04 Python
自学python的建议和周期预算
2019/01/30 Python
Python进阶之全面解读高级特性之切片
2019/02/19 Python
PyCharm无法识别PyQt5的2种解决方法,ModuleNotFoundError: No module named 'pyqt5'
2020/02/17 Python
Python基于百度AI实现OCR文字识别
2020/04/02 Python
项目开发计划书
2014/01/09 职场文书
2015年度信用社工作总结
2015/05/04 职场文书
python 多态 协议 鸭子类型详解
2021/11/27 Python
深入理解pytorch库的dockerfile
2022/06/10 Python