天好轮回,代码饶过谁,一坑未平,又入一坑,坑坑相套,永无天日,这篇不是小白文,要求了解傅里叶变换的基本概念,直接上代码,注释尽量写详细。

ennnnnn,我还是先介绍几个模块吧,可能我未来相当长一段时间不会再碰python了,怕自己忘记了

wave模块

wave 模块提供了一个处理 WAV 声音格式的便利接口。它不支持压缩/解压,但是支持单声道/立体声。

  • wave.open(file, mode=None)
    如果 file 是一个字符串,打开对应文件名的文件。否则就把它作为文件类对象来处理。mode 可以为以下值:

    ‘rb’
    只读模式。

    ‘wb’
    只写模式。

    注意不支持同时读写WAV文件。

    mode 设为 ‘rb’ 时返回一个 Wave_read 对象,而 mode 设为 ‘wb’ 时返回一个 Wave_write 对象。如果省略 mode 并指定 file 来传入一个文件类对象,则 file.mode 会被用作 mode 的默认值。

    如果操作的是文件对象,当使用 wave 对象的 close() 方法时,并不会真正关闭文件对象,这需要调用者负责来关闭文件对象。

    The open() function may be used in a with statement. When the with block completes, the Wave_read.close() or Wave_write.close() method is called.

    在 3.4 版更改: 添加了对不可搜索文件的支持。

    wave.openfp(file, mode)
    同 open(),用于向后兼容。

    Deprecated since version 3.7, will be removed in version 3.9.

    exception wave.Error
    当不符合WAV格式或无法操作时引发的错误。

Wave_read对象

由 open() 返回的 Wave_read 对象,有以下几种方法:

  • Wave_read.close()
    关闭 wave 打开的数据流并使对象不可用。当对象销毁时会自动调用。

  • Wave_read.getnchannels()
    返回声道数量(1 为单声道,2 为立体声)

  • Wave_read.getsampwidth()
    返回采样字节长度。

  • Wave_read.getframerate()
    返回采样频率。

  • Wave_read.getnframes()
    返回音频总帧数。

  • Wave_read.getcomptype()
    返回压缩类型(只支持 ‘NONE’ 类型)

  • Wave_read.getcompname()
    getcomptype() 的通俗版本。使用 ‘not compressed’ 代替 ‘NONE’。

  • Wave_read.getparams()
    返回一个 namedtuple() (nchannels, sampwidth, framerate, nframes, comptype, compname),与 get*() 方法的输出相同。

  • Wave_read.readframes(n)
    读取并返回以 bytes 对象表示的最多 n 帧音频。

  • Wave_read.rewind()
    设置当前文件指针位置。

后面两个方法是为了和 aifc 保持兼容,实际不做任何事情。

  • Wave_read.getmarkers()
    返回 None。

  • Wave_read.getmark(id)
    引发错误异常。

以下两个方法都使用指针,具体实现由其底层决定。

  • Wave_read.setpos(pos)
    设置文件指针到指定位置。

  • Wave_read.tell()
    返回当前文件指针位置。

Wave_write 对象

open() 返回的 Wave_write 对象,有以下几种方法:

  • Wave_write.close()
    确保nframes正确,并在波形打开时关闭文件。在对象集合时调用此方法。如果输出流不可搜索且nframe与实际写入的帧数不匹配,则会引发异常。

  • Wave_write.setnchannels(n)
    设置声道数。

  • Wave_write.setsampwidth(n)
    设置采样字节长度为 n。

  • Wave_write.setframerate(n)
    设置采样频率为 n。

在 3.2 版更改: A non-integral input to this method is rounded to the nearest integer.

  • Wave_write.setnframes(n)
    将帧数设置为n。如果实际写入的帧数不同,则将在以后更改(如果输出流不可搜索,则此更新尝试将引发错误)。

  • Wave_write.setcomptype(type, name)
    设置压缩格式。目前只支持 NONE 即无压缩格式。

  • Wave_write.setparams(tuple)
    tuple 应该是 (nchannels, sampwidth, framerate, nframes, comptype, compname),每项的值应可用于 set*() 方法。设置所有形参。

  • Wave_write.tell()
    返回当前文件指针,其指针含义和 Wave_read.tell() 以及 Wave_read.setpos() 是一致的。

  • Wave_write.writeframesraw(data)
    写入音频数据但不更新 nframes。

在 3.4 版更改: Any bytes-like object is now accepted.

  • Wave_write.writeframes(data)
    写入音频帧并确保nframe正确。如果输出流不可搜索,则会引发错误,并且在写入数据之后写入的帧总数与先前设置的nframes值不匹配。

在 3.4 版更改: Any bytes-like object is now accepted.

注意在调用 writeframes() 或 writeframesraw() 之后再设置任何格式参数是无效的,而且任何这样的尝试将引发 wave.Error。

然后是pyArduio模块

就不介绍了,代码写详细点

# coding=gbk
import warnings
warnings.simplefilter("ignore", DeprecationWarning)#防止报警告
import pyaudio
import waveimport numpy as np
import pygame
from pygame.locals import *CHUNK = 1024#我把它理解为缓冲流wf = wave.open("1qom8-vi8uq.wav", 'rb')#以只读的方式打开"1qom8-vi8uq.wav"文件#创建播放器
p = pyaudio.PyAudio()
#打开数据流  output=True表示音频输出
stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),channels=wf.getnchannels(),#设置声道数rate=wf.getframerate(),#设置流的频率output=True)data = wf.readframes(CHUNK)#音频数据初始化
pygame.init()#pygame初始化pygame.display.set_caption('实时频域')#设置窗口标题
screen = pygame.display.set_mode((850, 400), 0, 32)#窗口大小为(850,400)
while data != '':#直到音频放完stream.write(data)#播放缓冲流的音频data = wf.readframes(CHUNK)#更新datanumpydata = np.fromstring(data, dtype=np.int16)#把data由字符串以十六进制的方式转变为数组transforamed=np.real(np.fft.fft(numpydata))#傅里叶变换获取实数部分screen.fill((0, 0, 0))#清空屏幕for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()       #这段代码防止无响应count=50#设置间隔区for n in range(0,transforamed.size,count):#从频域中的2048个数据中没隔count个数据中选取一条hight=abs(int(transforamed[n]/10000))#对这么多数据取整和绝对值pygame.draw.rect(screen,(255,255,255),Rect((20*n/count,400),(20,-hight)))#画矩形pygame.display.update()#更新屏幕stream.stop_stream()
stream.close()
#关闭流
p.terminate()

效果图

事实上,你还可以做的更炫酷,比如,更具振幅的高低来改变颜色,窗口透明之类的(不过pygame是sdl,不支持透明,但是你可以用pyQt)

python音频可视化相关推荐

  1. Python 音频处理以及可视化 Amplitude,MFCC,Mel Spectrogram, librosa 库

    利用python库 librosa库对于音频文件进行预处理,以及可视化操作. 1. Load Audio Data 导入音频 将音频文件(这里使用苹果录音文件 .m4a 格式)导入librosa,音频 ...

  2. Python+matplotlib可视化自定义轴域大小和位置

    推荐图书: <Python可以这样学>,ISBN:9787302456469,董付国,清华大学出版社,第9次印刷 图书详情(京东): 董付国老师17本Python系列图书均提供配套教学资源 ...

  3. pcm转mp3_前端音频可视化——PCM数据解决方案

    一.概述 本文的需求来自于标注团队对于音频文件的标注,需要将音频准确定位到毫秒位置进行内容标注,方便团队训练Ai模型 而产品也对标注功能提出了三项不可妥协的需求: 1.波形图必须基于音频原WAV无损格 ...

  4. 【基于pyAudioKits的Python音频信号处理项目(二)】深度学习语音识别

    pyAudioKits是基于librosa和其他库的强大Python音频工作流支持. API速查手册 通过pip安装: pip install pyAudioKits 本项目的GitHub地址,如果这 ...

  5. Python音频信号处理库函数librosa介绍

    文章目录 Python音频信号处理库函数librosa介绍(部分内容将陆续添加) 介绍 安装 综述(库函数结构) Core IO and DSP(核心输入输出功能和数字信号处理) Audio proc ...

  6. 【基于pyAudioKits的Python音频信号处理(一)】pyAudioKits安装与API速查手册

    文章目录 pyAudioKits 基本用法 创建或加载音频 来自NumPy数组 来自文件 录音 模拟 Audio对象 播放 绘制 转为NumPy数组 获取属性 保存 索引和切片 连接 合成 四则运算 ...

  7. python数据可视化利用_利用pyecharts实现python数据可视化

    **python 利用pyecharts实现python数据可视化 **web pyecharts是一种交互式图表的表达方式. pyecharts是一款将python与echarts结合的强大的数据可 ...

  8. 《Python数据可视化编程实战》——5.5 用OpenGL制作动画

    本节书摘来异步社区<Python数据可视化编程实战>一书中的第5章,第5.5节,作者:[爱尔兰]Igor Milovanović,更多章节内容可以访问云栖社区"异步社区" ...

  9. 用 Python 制作可视化报表,这也太快了!

    作者 | 小F 来源 | 法纳斯特 在数据展示中使用图表来分享自己的见解,是个非常常见的方法. 这也是Tableau.Power BI这类商业智能仪表盘持续流行的原因之一,这些工具为数据提供了精美的图 ...

最新文章

  1. Redis 主库宕机如何快速恢复?面试必问!
  2. Caffe实战二(手写体识别例程:CPU、GPU、cuDNN速度对比)
  3. java环境变量怎么配置,详解系列文章
  4. MySQL同步状态双Yes的假象及seconds_behind_master的含义
  5. impacket安装 python_安装impacket
  6. 自动空调是嵌入计算机,自动空调很鸡肋?其实是你不会用而已
  7. implode - of an array
  8. 一文看懂二叉搜索树~(又叫二叉查找树) 代码+详解(C/C++)
  9. 解决办法:更新linux时候提示“由于没有公钥,无法验证下列签名 ***”
  10. Django-天天生鲜项目-用户登录
  11. 可扩展标记语言用户界面语言--XUL的定义及标签(详细)
  12. ARM汇编中^、!、cxsf符号和movs等指令使用
  13. Android开发——错误:远程主机强迫关闭一个现有连接——解决办法
  14. [ULK11]信号(三):从信号传递到原程序恢复执行
  15. 概率图模型--最大后验概率状态推理MAP
  16. CImage图像旋转与缩放
  17. 方正科技携手华育国际 助力职业教育发展
  18. C#中的虚函数virtual
  19. 关于CSS伪类first-child的深入理解
  20. PCB和软件设计经验(1)

热门文章

  1. c 语言中双向链表逆转编程题,C/C++ 双链表之逆序的实例详解
  2. LeetCode 反转链表(C++)
  3. vue笔记+渡一教育第一章整理
  4. linux服务器 maven lombok项目无法自动打包
  5. 2012年北京师范大学新生程序设计竞赛网络赛
  6. 用js生成PDF的方案
  7. 智慧水务解决方案实现了水质实时监控
  8. 最好用的mac卸载软件App Cleaner Pro Mac中文版
  9. Python在Eclipse下的的开发插件PyDev使用教程
  10. 关于Office Word里如何在方框里打字