import pyaudio  #导入库
import wave #导入wav音频库
import sys
from PyQt5.QtWidgets import QApplication, QWidget,QFileDialog
from pya import Ui_Form
import numpy as np
import matplotlib.pyplot as plt class Win(QWidget,Ui_Form):
def __init__(self):
super(Win, self).__init__()
self.setupUi(self)
plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体 SimHei为黑体
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号 def dakaiwenjian(self):
r = QFileDialog.getOpenFileName(self, '请选择要打开的文件', '.\\', 'WAV(*.wav)',
'WAV(*.wav)')
self.lineEdit.setText(r[0]) wf = wave.open(r[0], 'rb') # 只读方式打开wav文件
#只读模式: ‘r’, ‘rb’ ;只写模式: ‘w’, ‘wb’;注意:不能同时完成读/写操作 params = wf.getparams() #读取格式信息
#返回的是一个元组(tuple):声道数, 量化位数(byte单位), 采样频率, 采样点数, 压缩类型, 压缩类型的描述
# wave模块只支持非压缩的数据,因此可以忽略最后两个信息
print('声道数:',params[0])
print('量化位数:', params[1]) #量化位数(byte单位)
#量化位数是对模拟音频信号的幅度轴进行数字化,它决定了模拟信号数字化以后的动态范围
#常用于表示声卡性能的两个参数是采样频率、和模拟量转换成数字量之后的数据位数(简称量化位数)。采样频率决定了频率响应范围,在计算机多媒体音频处理中,标准的采样频率为:11.025kHz(语音效果)、22.05kHz(音乐效果)、44.1kHz(高保真效果)。量化位数越多,声音的质量越高。目前声卡的最高采样频率为44.1KHz。对声波每次采样后存储、记录声音振幅所用的位数称为采样位数,16位声卡的采样位数就是16。量化位数决定了音乐的动态范围,量化位数有8位和16位两种。8位声卡的声音从最低音到最高音只有256个级别,16位声卡有65536个高低音级别
#采样位数和采样率都是时域中的参数。一段音频(声波)的变化曲线,从时域上看,其横轴表示时间t,纵轴表示幅度v(一般是电压)。那么,采样率44.1K表示每秒钟采样44100个点,也就是横轴上每隔(1/44100)秒采集一个点;而采到的每个点都用一个数值来表示其幅度(电压)。假设整个音频信号的变化幅度范围是-5V~+5V的话,我们将-5V~+5V分成65536份,那么采到的这些点的数值n(16位),转换成电压,就是(n*10/65536)-5V。因此,采样位数分解的是音频电压的幅度!当然上面只是一个例子而已。对于某些A/D转换器来说,采集到的点的幅度值可能用补码来表示,那么换算成电压的公式就会不同,但将-5V~+5V这10V的变化范围分成了65536份这一点来说,是一样的
#量化位数分为8位,16位,24位三种
print('采样频率:', params[2])
#每秒钟采集数据的次数
#频率一般有11025Hz(11kHz) ,22050Hz(22kHz)和44100Hz(44kHz) 三种
print('采样点数:', params[3])
#采样点数决定了每次传到pc内的数据量。比如点数设为1000,pc内会开辟初始大小1000的buffer(buffer大小可以自己改), 板卡就每采1000点往pc传一次
# [返回的是文件的总采样点数] # getnchannels, getsampwidth, getframerate, getnframes等方法可以单独返回WAV文件的特定的信息
print(wf.getnchannels()) #声道数
print(wf.getsampwidth()) #量化位数(采样大小,采样宽度):波每一个时刻都有一个对应的能量值,在计算机中用整数存储。通常使用16bit有符号整数存储,采样大小是16bit
framerate=wf.getframerate() #采样频率
nframes=wf.getnframes() #采样点数--总帧数
#[返回的是文件的总采样点数]
print('采样点数:',nframes) data = wf.readframes(nframes) # 读取数据
# 从流的当前指针位置一次读出音频的n个帧,并且指针后移n个帧,返回一个字节数组--返回的是二进制数据(一大堆bytes),在Python中用字符串表示二进制数据
#【返回的是二进制形式的字符串】
#传递一个参数指定需要读取的长度(以取样点为单位)
#wf.close() #关闭文件
wave_data = np.frombuffer(data, dtype=np.short) #将波形数据转换为列表【矩阵】
#[0 0 0 ... 0 0 0]
#通过fromstring函数将字符串转换为列表,通过其参数dtype指定转换后的数据格式,由于我们的声音格式是以两个字节表示一个取样值,因此采用short数据类型转换
wave_data.shape = -1, 2 #修改矩阵的维度
#-1 表示行数未知; 2 表示2列
#声音文件是双声道的,因此它由左右两个声道的取样交替构成:LRLRLRLR....LR(L表示左声道的取样值,R表示右声道取样值)。修改wave_data的sharp之后:
# [[0 0] [0 0] ... [0 0] [0 0] [0 0]]
wave_data = wave_data.T #将其转置--行列转换
time = np.arange(0, nframes) * (1.0 / framerate) #取样时间--单位:秒
# 1.0 / framerate 每个点的时间
# np.arange(0, nframes) 产生一个一维矩阵--传递给pc数据中的第几个数据 # 绘制波形
plt.subplot(2,1,1)
plt.plot(time, wave_data[0]) #画左声道
plt.subplot(2,1,2)
plt.plot(time, wave_data[1], c="g") #画右声道
plt.xlabel("time (seconds--秒)")
plt.show() def bofan(self):
pass if __name__ == '__main__':
app = QApplication(sys.argv)
demo = Win()
demo.show()
sys.exit(app.exec_())

上面实例下载:

链接:https://pan.baidu.com/s/1DaDhI1gC4ul2Hblm7tPAFg   提取码:opy5

写.wav音频文件

import wave
import struct
import math def write_frame(time,freq,framerate,file,wave=0.4,sampwidth=2):
#time 持续时间; freq 频率; framerate采样频率; file 音频文件; wave 音量; sampwidth 采样深度
t=0#时刻
step=1.0/framerate #每帧间隔时长
fw=2.0*math.pi*freq #频率控制参数
wave=wave*(math.pow(2,sampwidth*8-1)-1)#音量控制
while t<=time:
v=int(math.sin(t*fw)*wave) #对波采样 math.sin(t*fw)产生freq频率的正弦波
t+=step#更新时刻
#最后这里是与sampwidth的值有关的,下面语句当前仅当sampwidth=2时成立,详细信息参考struct.pack()
file.writeframesraw(struct.pack("h",v)) #写入文件 struct.pack("h",v)将有符号整数v转化成16比特2进制 tw=wave.open("./two_tigers.wav","w") #打开或创建./two_tigers.wav
tw.setnchannels(1) #设置声道数 1
tw.setframerate(8000)#设置帧率 8000
tw.setsampwidth(2)#设置采样宽度2B 16bit #写入声音
#1 2 3 1 1 2 3 1
write_frame(time=0.5, freq=256, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.5, freq=288, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.5, freq=320, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.5, freq=256, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.5, freq=256, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.5, freq=288, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.5, freq=320, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.5, freq=256, framerate=8000, file=tw, wave=0.4, sampwidth=2) #3 4 5 - 3 4 5 -
write_frame(time=0.5, freq=320, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.5, freq=341.33, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.5, freq=384, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.25, freq=0, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.5, freq=320, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.5, freq=341.33, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.5, freq=384, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.25, freq=0, framerate=8000, file=tw, wave=0.4, sampwidth=2) #56 54 3 1 - 56 54 3 1 -
write_frame(time=0.25, freq=384, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.25, freq=426.67, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.25, freq=384, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.25, freq=341.33, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.5, freq=320, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.5, freq=256, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.25, freq=384, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.25, freq=426.67, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.25, freq=384, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.25, freq=341.33, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.5, freq=320, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.5, freq=256, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.25, freq=0, framerate=8000, file=tw, wave=0.4, sampwidth=2) #2 6(低音) 1 - 2 6(低音) 1 -
write_frame(time=0.5, freq=288, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.5, freq=144, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.5, freq=256, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.25, freq=0, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.5, freq=288, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.5, freq=144, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.5, freq=256, framerate=8000, file=tw, wave=0.4, sampwidth=2) tw.close()

python---wav音频的更多相关文章

  1. python 读取wav 音频文件的两种方式

    python 中,常用的有两种可以读取wav音频格式的方法,如下所示: import scipy from scipy.io import wavfile import soundfile as sf ...

  2. Windows Phone 8初学者开发—第21部分:永久保存Wav音频文件

    原文 Windows Phone 8初学者开发—第21部分:永久保存Wav音频文件 第21部分:永久保存Wav音频文件 原文地址:http://channel9.msdn.com/Series/Win ...

  3. Windows Phone 8初学者开发—第20部分:录制Wav音频文件

    原文 Windows Phone 8初学者开发—第20部分:录制Wav音频文件 原文地址:http://channel9.msdn.com/Series/Windows-Phone-8-Develop ...

  4. S3C2416裸机开发系列19_Fatfs播放录像wav音频文件

    S3C2416裸机开发系列19 Fatfs播放录像wav音频文件 国际象棋男孩    1048272975 多媒体资源,一般都是以文件的形式存储在固化存储器中.Fatfs所支持的fat32为windo ...

  5. 使用FlashWavRecorder实现浏览器录制wav音频和上传音频文件,兼容IE8以上浏览器

    前言:本项目基于github开源插件实现,该插件使用flash实现,兼容IE8以上浏览器 感谢michalstocki的分享该项目,github项目地址:https://github.com/mich ...

  6. C语言解析WAV音频文件

    C语言解析WAV音频文件 代码地址: Github : https://github.com/CasterWx/c-wave-master 目录 前言 了解WAV音频文件 什么是二进制文件 WAV的二 ...

  7. 用 Qt 的 QAudioOutput 类播放 WAV 音频文件

    用 Qt 的 QAudioOutput 类播放 WAV 音频文件 最近有一个项目,需要同时控制 4 个声卡播放不同的声音,声音文件很简单就是没有任何压缩的 wav 文件. 如果只是播放 wav 文件, ...

  8. 解析WAV音频文件----》生成WAV音频文件头

    前言:请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i WAV音频文件介绍: WAV文件是在PC机平台上很常见的.最经典的多媒体音频文件,最早于1991年8月出现在Windows3.1操作系统 ...

  9. 介绍几个python的音频处理库

    一.eyeD3 直接在google上搜索python mp3 process ,推荐比较多的就是这个第三方库了.先来看看官方介绍吧. About eyeD3 is a Python tool for ...

  10. 带有Python的音频处理(附带源码)

    由于博客播放不了音频,所以音频将以视频形式展现.公众号也正在进行抽书 音频素材请点击这里进行观看 往下拉就是文章地址 有时,在进行编程时,我们需要进行一些音频处理.编程中最常用的音频处理任务包括–加载 ...

随机推荐

  1. 浅谈Web图像优化

    前端优化有很多,图像优化也是其中的一部分.无论是渐进增强还是优雅降级,图像优化成为了开发上不可忽视的一部分. 知其然,须知其所以然 图像优化的前提是需要了解图像的基本原理.常规的图像格式分为矢量图和位 ...

  2. 论文阅读 | BadNets: Identifying Vulnerabilities in the Machine Learning Model Supply Chain

    BadNets: 识别机器学习模型供应链中的漏洞 摘要 基于深度学习的技术已经在各种各样的识别和分类任务上取得了最先进的性能.然而,这些网络通常训练起来非常昂贵,需要在许多gpu上进行数周的计算;因此 ...

  3. excel经典图表

    柱形图: 点击图表,选择数据,添加列 选择展示的列区域数据,编辑水平分类轴,选择按年份统计 效果图: 更改图表类型: 折线图或面积图: 饼图或圆环图: 散点图或气泡图: 组合图: 更改原有图表为组合图 ...

  4. Spring使用注解实现AOP

    一.AspectJ概述 AspectJ是一个面向切面的框架,它扩展了Java语言.定义了AOP语法,能够在编译期提供代码的织入,它提供了一个专门的编译期用来生成遵守字节编码规范的Class文件. @A ...

  5. 非旋(fhq)Treap小记

    前置知识:二叉搜索树 以下摘自 ↑: 二叉搜索树每次操作访问O(深度)个节点. 在刻意构造的数据中,树的形态会被卡成一条链,于是复杂度爆炸 它的复杂度与直接暴力删除类似. 但二叉搜索树扩展性强.更复杂 ...

  6. JavaScript处理股票数据

    1, 先使用Ajax发送异步请求到:http://hq.sinajs.cn/list=s_sh000001 2, 然后用[,]切割成数组https://www.w3school.com.cn/js/j ...

  7. java中接口知识点大总结

    接口的确很不好理解!!!!!那我来好好总结一下: 首先要理解接口是一个独立存在的,和类是不一样的东西,所以,直接用接口的定义是: 访问权限控制符 interface 接口名 [extends  接口列 ...

  8. vue cli更新

    关于旧版本 Vue CLI 的包名称由 vue-cli 改成了 @vue/cli. 如果你已经全局安装了旧版本的 vue-cli (1.x 或 2.x),你需要先通过 npm uninstall vu ...

  9. 2018最新版 手机号、验证码正则表达式 jq + 小程序

    HTML: <!-- 表单 --> <input class="weui-input" id="tel" type="tel&quo ...

  10. 原生js和css写虚拟键盘

    代码来源忘记是哪个大神的了,抱歉抱歉 放上源码: <!-- 虚拟键盘 --> <!DOCTYPE html> <html> <head> <met ...