python pyaudio实时读取音频数据并展示波形图

python pyaudio实时读取音频数据并展示波形图

下面代码可以驱动电脑接受声音数据,并实时展示音波图:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import pyaudio
import wave
import os
import operator
from functools import reduceclass SubplotAnimation(animation.TimedAnimation):def __init__(self, static=False, path=None):"""音频波形动态显示,实时显示波形:param static: 是否为静态模式:param path:   wav 文件路径"""self.static = staticif static and os.path.isfile(path):self.stream = wave.open(path)# 采样频率self.rate = self.stream.getparams()[2]self.chunk = self.rate / 2self.read = self.stream.readframeselse:self.rate = 8000  # 采样率self.chunk = 200  # 语音块大小self.deviceindex = 0  # 录音设备编号p = pyaudio.PyAudio()# frames_per_buffer=self.chunk 设置音频流的缓冲区大小,即每次从音频设备读取的数据块的大小self.stream = p.open(format=pyaudio.paInt16, channels=1, rate=self.rate,input_device_index=self.deviceindex,input=True, frames_per_buffer=self.chunk)self.read = self.stream.readself.chunknum = 40  # 同屏显示语音块的数量self.voicedatas = []self.zero = [0 for i in range(self.chunk)]for index in range(self.chunknum):self.voicedatas.insert(0, self.zero)# 定义波形显示图的横纵坐标大小及类别并选用读取实时音频数据方式显示,设定更新间隔def start(self):fig = plt.figure()ax1 = fig.add_subplot(1, 1, 1)ax1.set_xlabel("t")ax1.set_ylabel("x")ax1.set_xlim(0, 1.0 * (self.chunknum * self.chunk - 1) / self.rate)ax1.set_ylim(-16000, 16000)self.line1, = ax1.plot([], [], lw=2)# 更新间隔/msinterval = int(1000 * self.chunk / self.rate)animation.TimedAnimation.__init__(self, fig, interval=interval, blit=True)# 初始化绘图,l.set_data([], []) 将绘图数据清空,使得动画开始时图像为空白状态def _init_draw(self):lines = [self.line1]for l in lines:l.set_data([], [])def new_frame_seq(self):return iter(range(self.chunk))def _draw_frame(self, framedata):if self.static:# 读取静态wav文件波形y = np.fromstring(self.read(self.chunk / 2 + 1), dtype=np.int16)[:-1]else:# 实时读取声频data = np.fromstring(self.read(self.chunk, exception_on_overflow=False), dtype=np.int16)data = data.tolist()self.voicedatas.append(data)self.voicedatas.pop(0)y = reduce(operator.add, self.voicedatas)  # 将 self.voicedatas 中的 40 个列表数据全部放在 1 个列表中x = np.linspace(0, 1.0 * (self.chunknum * self.chunk - 1) / self.rate, self.chunknum * self.chunk)# 画波形图self.line1.set_data(x, y)ani = SubplotAnimation()
ani.start()
plt.show()

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/196858.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面试官:说说synchronized与ReentrantLock的区别

程序员的公众号:源1024,获取更多资料,无加密无套路! 最近整理了一波电子书籍资料,包含《Effective Java中文版 第2版》《深入JAVA虚拟机》,《重构改善既有代码设计》,《MySQL高性能-第3版》&…

质量小议35 -- SQL注入

已经记不得上次用到SQL注入是什么时候了,一些概念和操作已经模糊。 最近与人聊起SQL注入,重新翻阅,暂记于此。 重点:敏感信息、权限过大、未脱敏的输入/输出、协议、框架、数据包、明文、安全意识 SQL - Structured Query La…

力扣124. 二叉树中的最大路径和(java DFS解法)

Problem: 124. 二叉树中的最大路径和 文章目录 题目描述思路解题方法复杂度Code 题目描述 二叉树中的 路径 被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经…

【C++】类和对象——const修饰成员函数和取地址操作符重载

在上篇博客中,我们已经对于日期类有了较为全面的实现,但是,还有一个问题,比如说,我给一个const修饰的日期类的对象 这个对象是不能调用我们上篇博客写的函数的,因为&d1是const Date*类型的&#xff…

备战春招——12.04 算法

哈希表 哈希表主要是使用 map、unordered_map、set、unorerdered_set、multi_,完成映射操作,主要是相应的函数。map和set是有序的,使用的是树的形式,unordered_map和unordered_set使用的是散列比表的,无序。 相应函数…

【Java】类和对象之超级详细的总结!!!

文章目录 前言1. 什么是面向对象?1.2面向过程和面向对象 2.类的定义和使用2.1什么是类?2.2类的定义格式2.3类的实例化2.3.1什么是实例化2.3.2类和对象的说明 3.this引用3.1为什么会有this3.2this的含义与性质3.3this的特性 4.构造方法4.1构造方法的概念4…

【VRTK】【VR开发】【Unity】10-连续移动

课程配套学习资源下载 https://download.csdn.net/download/weixin_41697242/88485426?spm=1001.2014.3001.5503 【概述】 连续移动与瞬移有如下不同: 连续移动不容易打断沉浸对于新手或者不适应者来说更容易晕动 我对玩家的建议:连续移动前后左右可以用摇杆,转向用自己…

低代码如何降低门槛、快速交付、实现可持续IT架构?

目录 低代码开发模式期望达成的目标 1.降低开发门槛 2.加快系统交付 3.建立可持续发展的IT架构 写在最后 低代码的概念,最早提出的时间是在2014年左右,随后一直处于上升期,随着前两年阿里、腾讯的相继入场,竞争逐步加大。低代…

设计简单高效的短链系统

目录 引言 1. 短链系统的原理 1.1 长链接生成短码 1.2 短码映射到长链接 1.3 短码重定向 1.4 过期短 URL 清理 2. 设计与实现 2.1 数据存储 2.2 短码生成 2.3 接口设计 2.4 安全性考虑 2.5 访问性能优化 引言 在当今数字化时代,人们对信息的分享需求不断…

市场缺口投资者应该怎么做? 昂首资本一招就能盈利

当在市场交易分析中,投资者发现市场缺口或者价格缺口的时候, 昂首资本问各位投资者应该怎么才能抓住机会盈利一波。 其实在技术分析中的这个术语指的是:前一根棒线的收盘价和下一根棒线的开盘价之间有差距的情况。例如,当做市商将…

【SpringBoot系列】SpringBoot时间字段格式化

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Allegro无法模块复用的解决办法

Allegro无法模块复用的解决办法 在用Allegro做PCB设计的时候,模块复用是使用的比较频繁的功能,对于有相同模块的单板,可以节省大量的时间。 模块复用的功能不细说,具体参考以前的文章。 有时会遇到模块复用的时候出现如下报错 无法匹配,有时如果因为Device而无法复用,就…

python提取通话记录中的时间信息

您需要安装适合中文的SpaCy模型。您可以通过运行 pip install spacypython -m spacy download zh_core_web_sm来安装和下载所需的模型。 import spacy# 加载中文模型 nlp spacy.load(zh_core_web_sm)# 示例电话记录文本 text """ Agent: 今天我们解决一下这…

Linux CentOS7 安装Docker

CentOS7安装Docker: Docker简介 Docker是一个开源的容器化平台,可帮助开发者轻松地创建、部署和运行应用程序。Docker使开发人员能够在一个独立的容器中打包应用程序及其依赖项,这样他们就可以轻松地将应用程序移植到任何其他环境中。Docke…

基础堆溢出原理与DWORD SHOOT实现

堆介绍 堆的数据结构与管理策略 程序员在使用堆时只需要做三件事情:申请一定大小的内存,使用内存,释放内存。 对于堆管理系统来说,响应程序的内存使用申请就意味着要在"杂乱"的堆区中"辨别"出哪些内存是正在…

Python实现交易策略评价指标-夏普比率

1.夏普比率的定义 在投资的过程中,仅关注策略的收益率是不够的,同时还需要关注承受的风险,也就是收益风险比。 夏普比率正是这样一个指标,它表示承担单位的风险会产生多少超额收益。用数学公式描述就是: S h a r p R…

【算法每日一练]-图论(保姆级教程 篇6(图上dp))#最大食物链 #游走

目录 题目:最大食物链 解法一: 解法二: 记忆化 题目:游走 思路: 题目:最大食物链 解法一: 我们标记f[i]是被f[x]捕食的点对应的类食物链数 不难得出: f[x]∑(f[i]) 首先从生…

206 反转链表

解题思路可以有两种方法:递归 or 迭代。 \qquad 迭代:通过使用for循环遍历,完成目标。方法直观,容易理解。 \qquad 递归:通过函数调用其自身,完成目标。递归最复杂、最重要的部分就是递归函数的构建&#…

【数据结构】——栈|队列(基本功能)

目录 栈 基本概念 栈的常见基本操作 栈的存储 ✌栈的基本操作实现 栈的构建 栈的初始化 入栈 打印栈 出栈 获取栈顶元素 获取栈的有效元素个数 判断栈是否为空 销毁栈 队列 基本概念 队列的常见基本操作 ✌队列的基本操作实现 队列的构建 初始化 入队列 出…

Spring Security 6.x 系列(9)—— 基于过滤器链的源码分析(二)

一、前言 在本系列文章: Spring Security 6.x 系列(4)—— 基于过滤器链的源码分析(一)中着重分析了Spring Security在Spring Boot 的自动配置、 DefaultSecurityFilterChain 的构造流程、FilterChainProxy 的构造流…