如何用 Python 实现一个 “系统声音” 的实时律动挂件

前言

应该是三年前,我用 Esp8266 和 ws2812 实现了一个音乐律动灯带。就是电脑播放音乐时,灯带会随着系统内部音乐播放的频率而闪动不同色彩的灯珠。而当时用来监听系统声音的工具是一个博主提供的,除了实时采集声音外还通过 UDP 传递数据到 Esp8266 上。

而这次,我就自己用 Python 实现一下,不过不传数据,就采集后直接实时地在电脑上绘制波形动画,主要是用来作为 FL Studio 播放时的一个桌面小挂件。

环境

python3.8

pyaudio0.2.14

matplotlib

pyaudio 简介

pyaudio 是一个跨平台地音频 I/O 库,使用他可以在 Python 程序中进行播放,录音和生成 wav 文件等。需要注意的是,如果要使用 pyaudio 时,python 的版本最好在 3.7 以上,不然 pip 安装会报错。因为以下例子是获取系统内部声音,而 pyaudio 读取的音频流默认是麦克风,所以接下来介绍一下关于获取的设备列表信息。

代码获取设备列表
# pyaudio实例
audio = pyaudio.PyAudio()
# 获取设备总数
device_count = audio.get_device_count()
# 根据设备索引获取设备详细信息
for i in range(p.get_device_count()):devInfo = p.get_device_info_by_index(i)print(devInfo)

设备信息参数介绍
  • index: 设备的索引号,通常用于标识系统中的设备顺序。
  • structVersion: 结构版本号,用于表示这个数据结构的版本。
  • name: 设备的名称,这里是 “Microsoft 声音映射器 - Input”。
  • hostApi: 主 API 的标识符,通常用于表示该设备属于哪个 API 或系统。
  • maxInputChannels: 设备支持的最大输入通道数,这里是 2,表示设备支持 2 个输入通道。
  • maxOutputChannels: 设备支持的最大输出通道数,这里为 0,表示该设备没有输出通道。
  • defaultLowInputLatency: 默认的低输入延迟,以秒为单位,这里是 0.09 秒。
  • defaultLowOutputLatency: 默认的低输出延迟,这里是 0.09 秒。
  • defaultHighInputLatency: 默认的高输入延迟,这里是 0.18 秒。
  • defaultHighOutputLatency: 默认的高输出延迟,这里是 0.18 秒。
  • defaultSampleRate: 默认的采样率,这里是 44100.0 赫兹,这是 CD 质量的音频标准采样率。

开始操作

开启立体声混音权限

打开电脑设置 - 系统 - 声音 - 管理声音设备 - 立体声混响,点击启用。

设置设备索引号

打开立体声混音后,通过 pyaudio 获取设备列表,找到带有 “立体声混音” 的名称,和 hostApi 为 0 的,hostAPI = 0 表明是 MME 设备。然后拿到该设备索引号,打开音频流时指定该内录设备序号。

def findInternalRecordingDevice(p):# 要找查的设备名称中的关键字target = '立体声混音'# 逐一查找声音设备for i in range(p.get_device_count()):devInfo = p.get_device_info_by_index(i)print(devInfo)if devInfo['name'].find(target) >= 0 and devInfo['hostApi'] == 0:# print('已找到内录设备,序号是 ',i)return iprint('无法找到内录设备!')return -1
全部代码
import pyaudio
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
import waveFORMAT = pyaudio.paInt16
CHANNELS = 1  
RATE = 44100  
CHUNK = 4096  
# CHUNK = 1024  
WAVE_OUTPUT_FILENAME = 'audio_output.wav'# 获取内录设备序号,在windows操作系统上测试通过,hostAPI = 0 表明是MME设备
def findInternalRecordingDevice(p):# 要找查的设备名称中的关键字target = '立体声混音'# 逐一查找声音设备for i in range(p.get_device_count()):devInfo = p.get_device_info_by_index(i)print(devInfo)if devInfo['name'].find(target) >= 0 and devInfo['hostApi'] == 0:# print('已找到内录设备,序号是 ',i)return iprint('无法找到内录设备!')return -1# Initialize PyAudio
audio = pyaudio.PyAudio()# 这里input_device_index的2就是系统内录设备索引
stream = audio.open(input_device_index=2,format=FORMAT,channels=1,rate=RATE,input=True,frames_per_buffer=CHUNK)plt.ion()
fig, ax = plt.subplots()
x = np.arange(0, CHUNK)
line, = ax.plot(x, np.zeros(CHUNK))
ax.set_xlim(0, CHUNK)
ax.set_ylim(-32768, 32767)wave_output_file = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
wave_output_file.setnchannels(CHANNELS)
wave_output_file.setsampwidth(audio.get_sample_size(FORMAT))
wave_output_file.setframerate(RATE)def update_plot(data):print(data)line.set_ydata(data)fig.canvas.draw()fig.canvas.flush_events()def display_audio_waveform():while True:try:audio_data = np.frombuffer(stream.read(CHUNK), dtype=np.int16)# update_plot(audio_data*500)update_plot(audio_data)# wave_output_file.writeframes(audio_data)except KeyboardInterrupt:breakdisplay_audio_waveform()stream.stop_stream()
stream.close()
audio.terminate()wave_output_file.close()
print('Audio saved to', WAVE_OUTPUT_FILENAME)

如果你对Python感兴趣,想要学习python,这里给大家分享一份Python全套学习资料,都是我自己学习时整理的,希望可以帮到你,一起加油!

😝有需要的小伙伴,可以V扫描下方二维码免费领取🆓

1️⃣零基础入门

① 学习路线

对于从来没有接触过Python的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

② 路线对应学习视频

还有很多适合0基础入门的学习视频,有了这些视频,轻轻松松上手Python~
在这里插入图片描述

③练习题

每节视频课后,都有对应的练习题哦,可以检验学习成果哈哈!
在这里插入图片描述

2️⃣国内外Python书籍、文档

① 文档和书籍资料

在这里插入图片描述

3️⃣Python工具包+项目源码合集

①Python工具包

学习Python常用的开发软件都在这里了!每个都有详细的安装教程,保证你可以安装成功哦!
在这里插入图片描述

②Python实战案例

光学理论是没用的,要学会跟着一起敲代码,动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。100+实战案例源码等你来拿!
在这里插入图片描述

③Python小游戏源码

如果觉得上面的实战案例有点枯燥,可以试试自己用Python编写小游戏,让你的学习过程中增添一点趣味!
在这里插入图片描述

4️⃣Python面试题

我们学会了Python之后,有了技能就可以出去找工作啦!下面这些面试题是都来自阿里、腾讯、字节等一线互联网大厂,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
在这里插入图片描述
在这里插入图片描述

上述所有资料 ⚡️ ,朋友们如果有需要的,可以扫描下方👇👇👇二维码免费领取🆓

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

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

相关文章

玉米浸泡液植酸吸附树脂

植酸为环己六醇六磷酸,分子量为660,植酸钠为环己六醇六磷酸钠(Na12C6H6O24P6)分子量为924。 植酸用途:在食品工业中植酸钠可用作食品添设剂,菲丁(植酸钙)可用于生产肌醇&#xff0c…

vscode+markdown+plantuml+html

markdown-preview-enhanced plantuml配置 生成html侧边栏 --- html:toc: truetoc_depth: 6toc_float: truecollapsed: falsesmooth_scroll: true ---

多测师肖sir___接口自动化测试框架(python+request+unittest+ddt)讲解版

pythonrequestunittestddt 一、接口自动化测试框架(pythonrequestunittestddtj 7个包)讲解 首先我们新建一个新项目:名称zdh 二、在一个项目中:新建7个包 第一个包conf包用来填写配置参数、地址等 第二个包data 包用来存放测试用例的表格 第…

视频转gif的在线转换怎么操作?告别繁琐,轻松搞定

视频转gif的在线转换怎么操作?在当今社交媒体盛行的时代,GIF动图已经成为了我们表达自我、分享生活的重要方式。但是,很多小伙伴可能还在为如何将心爱的视频片段转为GIF而烦恼。今天,我们就来一起学习如何将视频轻松转换为GIF的在…

数据库编程大赛冠军:郑凌云:0.67秒通过百万级数据评测!SQL代码惊现神之一手!

12月27日,NineData和云数据库技术社区主办,华为云、火山引擎、开源中国、云和恩墨、TDengine、云猿生数据、DORIS、ITPUB等协办单位和媒体,共同举办了本次《数据库编程大赛》。大赛题目「用一条SQL给出扑克牌24点的计算表达式」。 以下冠军选…

JS 高频面试题

JS 的数据类型有哪些,有什么区别 基本数据类型(Undefined、Null、Boolean、Number、String、Symbol) 引用数据类型(对象、数组和函数) 区别: 原始数据类型直接存储在栈(stack)中的简…

【亲测有效】Win11 卸载MySQL5.7以及安装MySQL8.0.35

目录 一、卸载原来本地的mysql5.7 1.mysql服务部分 1.1停止mysql服务 1.2删除mysql服务 2.卸载 MySQL程序 3.残余文件的清理 3.1删除mysql安装的目录 3.2删除mysql数据存放的目录 3.3删除mysql自定义目录 4.清理注册表 5.删除环境变量配置 二、安装mysql8.0.35 1.…

【Spring Boot】SpringMVC入门

1.什么是springMVC MVC就是把一个项目分成了三部分: MVC是一种思想。Spring进行了实现,称为Spring MVC。SpringBoot是创建SpringMVC项目的一种方式而已。springMVC对于MVC做出了一些改变: 当前阶段,MVC的概念又发生了一些变化,后端开发人员不涉及前端页…

众和策略股市行情分析:了解散户的典型特征

散户特色如下: 1、出资规模小:散户的出资规模一般比较小,资金量有限,无法对商场发生显著的影响。资金量较小的一起,其对危险的承受能力也相对较弱。 2、缺少危险意识:散户往往缺少危险意识,没…

2024年网络工程师10大必备软件,最新安装包分享

功夫再高,也怕菜刀。作为网络工程师,我们手中的菜刀是什么? 以下10大网工必备软件都已整理好安装包,需要的朋友可以在文末获取。 1、Cisco Packet Tracer(思科模拟器) Cisco Packet Tracer 是由Cisco公司发…

详解JavaScript中的WeakMap和WeakSet

🧑‍🎓 个人主页:《爱蹦跶的大A阿》 🔥当前正在更新专栏:《VUE》 、《JavaScript保姆级教程》、《krpano》 ​ ​ ✨ 前言 内存管理一直是JavaScript这门语言中的难点和痛点。由于其自动垃圾回收机制的限制,在某些场…

HTTPS详解及openssl简单使用

OpenSSL 中文手册 | OpenSSL 中文网 本文介绍https传输协议中涉及的概念,流程,算法,如何实现等相关内容。 HTTP传输过程 HTTP 之所以被 HTTPS 取代,最大的原因就是不安全,至于为什么不安全,看了下面这张图…

如何通过 Prompt 优化大模型 Text2SQL 的效果

前言 在上篇文章中「大模型LLM在Text2SQL上的应用实践」介绍了基于SQLDatabaseChain的Text2SQL实践,但对于逻辑复杂的查询在稳定性、可靠性、安全性方面可能无法达到预期,比如输出幻觉、数据安全、用户输入错误等问题。 本文将从以下4个方面探讨通过Pr…

Python办公自动化 – 操作NoSQL数据库和自动化图像识别

Python办公自动化 – 操作NoSQL数据库和自动化图像识别 以下是往期的文章目录,需要可以查看哦。 Python办公自动化 – Excel和Word的操作运用 Python办公自动化 – Python发送电子邮件和Outlook的集成 Python办公自动化 – 对PDF文档和PPT文档的处理 Python办公自动…

前端-基础 表格标签 - 相关属性详解

目录 相关属性 : align 属性 : border 属性 : cellpadding 属性 : cellspacing 属性 : width 属性 : height 属性 : 首先,需要声明的是 表格标签这部分属性&…

Hive基础题-1

别看我,不看答案我也不会写 正因为不会写,所以才要每天一练 本地hive练习题 SET hive.exec.mode.local.autotrue; -- 默认 false SET hive.exec.mode.local.auto.inputbytes.max50000000; SET hive.exec.mode.local.auto.input.files.max5; -- 默认 4# …

Hotspot源码解析-第十七章-虚拟机万物创建(三)

17.4 Java堆空间内存分配 分配Java堆内存前,我们先通过两图来了解下C堆、Java堆、内核空间、native本地空间的关系。 1、从图17-1来看,Java堆的分配其实就是从Java进程运行时堆中选中一块内存区域来映射 2、从图17-2,可以看中各内存空间的…

thinkphp学习07-数据库的数据查询

单数据查询 单条数据查询,一般是一维数组 Db::table()中 table 必须指定完整数据表(包括前缀),如果配置了表前缀,Db::name()中可以忽略 如果希望只查询一条数据,可以使用 find()方法,需指定 wh…

Django 框架添加管理员,完成对普通用户信息管理

前情回顾:Django框架 完成用户登录注册 文章目录 1.创建管理员2.完善管理员功能2.1增加管理员登录功能2.2完善展示用户信息功能2.3完善修改用户信息功能2.4完善删除用户信息功能 1.创建管理员 一般管理员都是直接指定,不开放页面注册,可以直…

Mermaid 教程

Mermaid 教程 Mermaid 介绍 Mermaid 是一个用于生成流程图、时序图、甘特图等图表的 JavaScript 库。它使用类似于 Markdown 的文本语法,使得创建图表变得简单直观。以下是一个简单的 Mermaid 教程,介绍如何使用 Mermaid 创建流程图、时序图和甘特图。…