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检测服务器是否正常
Feb 16 Python
python定时器使用示例分享
Feb 16 Python
Python中functools模块函数解析
Mar 12 Python
基于python(urlparse)模板的使用方法总结
Oct 13 Python
《与孩子一起学编程》python自测题
May 27 Python
Python根据已知邻接矩阵绘制无向图操作示例
Jun 23 Python
利用pyuic5将ui文件转换为py文件的方法
Jun 19 Python
Python3标准库之dbm UNIX键-值数据库问题
Mar 24 Python
python 已知三条边求三角形的角度案例
Apr 12 Python
解决Pycharm双击图标启动不了的问题(JetBrains全家桶通用)
Aug 07 Python
Python3.9.0 a1安装pygame出错解决全过程(小结)
Feb 02 Python
Python捕获、播放和保存摄像头视频并提高视频清晰度和对比度
Apr 14 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中先strip_tags过滤html标签后truncate截取文章运用
2010/10/25 PHP
解析php中获取系统信息的方法
2013/06/25 PHP
Yii实现多数据库主从读写分离的方法
2014/12/29 PHP
3种方法轻松处理php开发中emoji表情的问题
2016/07/18 PHP
PHP微信开发之微信录音临时转永久存储
2018/01/26 PHP
js限制文本框输入长度两种限制方式(长度、字节数)
2012/12/19 Javascript
jqueyr判断checkbox组的选中(示例代码)
2013/11/08 Javascript
阿里巴巴技术文章分享 Javascript继承机制的实现
2016/01/14 Javascript
Webwork 实现文件上传下载代码详解
2016/02/02 Javascript
浅谈几种常用的JS类定义方法
2016/06/08 Javascript
微信小程序 Record API详解及实例代码
2016/09/30 Javascript
vue.js实现刷新当前页面的方法教程
2017/07/05 Javascript
vue webpack打包后图片路径错误的完美解决方法
2018/12/07 Javascript
[01:12:27]EG vs Secret 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
[00:18]天涯墨客三技能展示
2018/08/25 DOTA
[02:21]2018完美盛典章节片——初心
2018/12/17 DOTA
python基础教程之基本内置数据类型介绍
2014/02/20 Python
python实现基于SVM手写数字识别功能
2020/05/27 Python
Python代码块批量添加Tab缩进的方法
2018/06/25 Python
详解Python 装饰器执行顺序迷思
2018/08/08 Python
pandas把所有大于0的数设置为1的方法
2019/01/26 Python
Python requests模块实例用法
2019/02/11 Python
Python socket实现的文件下载器功能示例
2019/11/15 Python
Python+numpy实现矩阵的行列扩展方式
2019/11/29 Python
django ObjectDoesNotExist 和 DoesNotExist的用法
2020/07/09 Python
python实现三壶谜题的示例详解
2020/11/02 Python
咖啡为什么会有酸味?你喝到的咖啡為什麼是酸的?
2021/03/17 冲泡冲煮
鞋子女王塔玛拉·梅隆同名奢侈品牌:Tamara Mellon
2017/11/22 全球购物
JACK & JONES瑞典官方网站:杰克琼斯欧式风格男装
2017/12/23 全球购物
20世纪40年代连衣裙和复古服装:The Seamstress Of Bloomsbury
2018/07/24 全球购物
澳洲的UGG雪地靴超级市场:Uggs.com.au
2020/04/06 全球购物
房地产销售员的自我评价分享
2013/12/04 职场文书
爱情检讨书大全
2014/01/21 职场文书
四年级语文教学反思
2014/02/05 职场文书
2015年度团总支工作总结
2015/04/23 职场文书
使用feign服务调用添加Header参数
2021/06/23 Java/Android