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 命令行参数sys.argv
Sep 06 Python
Python实现导出数据生成excel报表的方法示例
Jul 12 Python
解决pycharm界面不能显示中文的问题
May 23 Python
python计算日期之间的放假日期
Jun 05 Python
Python解决两个整数相除只得到整数部分的实例
Nov 10 Python
详解Python计算机视觉 图像扭曲(仿射扭曲)
Mar 27 Python
解决Python安装时报缺少DLL问题【两种解决方法】
Jul 15 Python
Python PIL图片添加字体的例子
Aug 22 Python
python 偷懒技巧——使用 keyboard 录制键盘事件
Sep 21 Python
Django正则URL匹配实现流程解析
Nov 13 Python
python快速安装OpenCV的步骤记录
Feb 22 Python
Python如何快速找到多个字典中的公共键(key)
Apr 29 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的栏目导航程序
2006/10/09 PHP
PHP的几个常用数字判断函数代码
2012/04/24 PHP
Zend的Registry机制的使用说明
2013/05/02 PHP
laravel框架添加数据,显示数据,返回成功值的方法
2019/10/11 PHP
获取Javscript执行函数名称的方法
2006/12/22 Javascript
使用jQuery操作Cookies的实现代码
2011/10/09 Javascript
javascript检测浏览器flash版本的实现代码
2011/12/06 Javascript
解析jquery获取父窗口的元素
2013/06/26 Javascript
Jquery+Ajax+PHP+MySQL实现分类列表管理(上)
2015/10/28 Javascript
JQuery标签页效果实例详解
2015/12/24 Javascript
jQuery实现从身份证号中获取出生日期和性别的方法分析
2016/02/25 Javascript
JS实现的点击表头排序功能示例
2017/03/27 Javascript
JavaScript数据结构之广义表的定义与表示方法详解
2017/04/12 Javascript
浅谈React中的元素、组件、实例和节点
2018/02/27 Javascript
vue中axios解决跨域问题和拦截器的使用方法
2018/03/07 Javascript
react在安卓中输入框被手机键盘遮挡问题的解决方法
2018/09/03 Javascript
python技能之数据导出excel的实例代码
2017/08/11 Python
如何在sae中设置django,让sae的工作环境跟本地python环境一致
2017/11/21 Python
Python决策树和随机森林算法实例详解
2018/01/30 Python
PyQt5每天必学之创建窗口居中效果
2018/04/19 Python
在python中对变量判断是否为None的三种方法总结
2019/01/23 Python
python opencv minAreaRect 生成最小外接矩形的方法
2019/07/01 Python
Python文件路径名的操作方法
2019/10/30 Python
Python调用shell命令常用方法(4种)
2020/05/11 Python
如何通过Python实现RabbitMQ延迟队列
2020/11/28 Python
TripAdvisor西班牙官方网站:全球领先的旅游网站
2018/01/10 全球购物
工商企业管理应届生求职信
2013/11/03 职场文书
职业教育毕业生求职信
2013/11/09 职场文书
电大奖学金获奖感言
2014/08/14 职场文书
品牌推广活动策划方案
2014/08/19 职场文书
报表员工作失误检讨书范文
2014/09/19 职场文书
考试作弊检讨书范文
2015/01/27 职场文书
创业计划书之牛肉汤快餐店
2019/10/08 职场文书
解决pycharm下载库时出现Failed to install package的问题
2021/09/04 Python
详解Nginx 被动检查服务器的存活状态
2021/10/16 Servers
JavaScript 中for/of,for/in 的详细介绍
2021/11/17 Javascript