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中的map()函数和reduce()函数的用法
Apr 27 Python
python自定义类并使用的方法
May 07 Python
python生成随机密码或随机字符串的方法
Jul 03 Python
深入理解python中的闭包和装饰器
Jun 12 Python
python3实现基于用户的协同过滤
May 31 Python
Python爬取商家联系电话以及各种数据的方法
Nov 10 Python
python3.6数独问题的解决
Jan 21 Python
使用Python实现文字转语音并生成wav文件的例子
Aug 08 Python
解决pytorch GPU 计算过程中出现内存耗尽的问题
Aug 19 Python
python检测服务器端口代码实例
Aug 31 Python
pytorch cuda上tensor的定义 以及减少cpu的操作详解
Jun 23 Python
基于python爬取梨视频实现过程解析
Nov 09 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
重新封装zend_soap实现http连接安全认证的php代码
2011/01/12 PHP
codeigniter教程之多文件上传使用示例
2014/02/11 PHP
PHP实现上传多文件示例代码
2017/02/20 PHP
php获取linux命令结果的实例
2017/03/13 PHP
CodeIgniter框架钩子机制实现方法【hooks类】
2018/08/21 PHP
php统计数组不同元素的个数的实例方法
2019/09/26 PHP
对xmlHttp对象方法和属性的理解
2011/01/17 Javascript
基于jquery实现状态限定编辑的代码
2012/02/11 Javascript
jquery ajax请求方式与提示用户正在处理请稍等
2014/09/01 Javascript
JavaScript函数的一些注意要点小结及js匿名函数
2015/11/10 Javascript
鼠标悬停小图标显示大图标
2016/01/22 Javascript
阻止表单提交按钮多次提交的完美解决方法
2016/05/16 Javascript
jQuery仿京东商城楼梯式导航定位菜单
2016/07/25 Javascript
jQuery学习笔记之入门
2016/12/14 Javascript
尝试自己动手用react来写一个分页组件(小结)
2018/02/09 Javascript
使用vue-router设置每个页面的title方法
2018/02/11 Javascript
JavaScript实现shuffle数组洗牌操作示例
2019/01/03 Javascript
axios异步提交表单数据的几种方法
2019/08/11 Javascript
用Node写一条配置环境的指令
2019/11/14 Javascript
使用vue重构资讯页面的实例代码解析
2019/11/26 Javascript
JavaScript find()方法及返回数据实例
2020/04/30 Javascript
Django项目中model的数据处理以及页面交互方法
2018/05/30 Python
DataFrame:通过SparkSql将scala类转为DataFrame的方法
2019/01/29 Python
python简单实现矩阵的乘,加,转置和逆运算示例
2019/07/10 Python
Python实现基于socket的udp传输与接收功能详解
2019/11/15 Python
使用Python三角函数公式计算三角形的夹角案例
2020/04/15 Python
HTML5和以前HTML4的区别整理
2013/10/20 HTML / CSS
实习求职信
2013/12/01 职场文书
商务日语专业的自荐信
2014/05/23 职场文书
2014年销售员工作总结
2014/12/01 职场文书
先进班组事迹材料
2014/12/25 职场文书
食品安全主题班会
2015/08/13 职场文书
2016年大学生暑假爱心支教活动策划书
2015/11/26 职场文书
2016年三八节红领巾广播稿
2015/12/17 职场文书
小学美术教学反思
2016/02/17 职场文书
利用Python实现Picgo图床工具
2021/11/23 Python