pyaudio:录制并保存系统声音+绘制频谱

2024-01-24 20:36

本文主要是介绍pyaudio:录制并保存系统声音+绘制频谱,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

pyaudio INSTALL

  • sudo apt install python3-pyaudio
$ sudo apt install python3-pyaudio 
正在读取软件包列表... 完成
正在分析软件包的依赖关系树... 完成
正在读取状态信息... 完成                 
有一些软件包无法被安装。如果您用的是 unstable 发行版,这也许是
因为系统无法达到您要求的状态造成的。该版本中可能会有一些您需要的软件
包尚未被创建或是它们已被从新到(Incoming)目录移出。
下列信息可能会对解决问题有所帮助:下列软件包有未满足的依赖关系:python3-pyaudio : 依赖: python3 (< 3.6) 但是 3.10.6-1~22.04 正要被安装
E: 无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系。
  • conda install PyAudio
$ conda install PyAudio #这个并不需要python3 (< 3.6)
Collecting package metadata (current_repodata.json): done
Solving environment: done## Package Plan ##environment location: /home/pdd/anaconda3/envs/myaudioadded / updated specs:- pyaudioThe following packages will be downloaded:package                    |            build---------------------------|-----------------portaudio-19.6.0           |       h7b6447c_4         114 KB  defaultspyaudio-0.2.11             |   py35h14c3975_1          64 KB  defaults------------------------------------------------------------Total:         178 KBThe following NEW packages will be INSTALLED:portaudio          anaconda/pkgs/main/linux-64::portaudio-19.6.0-h7b6447c_4 Nonepyaudio            anaconda/pkgs/main/linux-64::pyaudio-0.2.11-py35h14c3975_1 NoneProceed ([y]/n)? yDownloading and Extracting Packages
portaudio-19.6.0     | 114 KB    | ####################################################################################################### | 100% 
pyaudio-0.2.11       | 64 KB     | ####################################################################################################### | 100% 
Preparing transaction: done
Verifying transaction: done
Executing transaction: done
Retrieving notices: ...working... done

使用pyaudio保存音频到wav文件

import pyaudio
import wavedef record_and_save_wav(filename, duration=5, sample_rate=44100, channels=2, format=pyaudio.paInt16):p = pyaudio.PyAudio()# 打开音频流stream = p.open(format=format,channels=channels,rate=sample_rate,input=True,frames_per_buffer=1024)print("Recording...")frames = []# 录制音频for i in range(0, int(sample_rate / 1024 * duration)):data = stream.read(1024)frames.append(data)print("Finished recording.")# 停止和关闭音频流stream.stop_stream()stream.close()p.terminate()# 将录制的音频保存为wav文件with wave.open(filename, 'wb') as wf:wf.setnchannels(channels)wf.setsampwidth(p.get_sample_size(format))wf.setframerate(sample_rate)wf.writeframes(b''.join(frames))# 指定保存的文件名和录制的时长
filename = "output.wav"
record_and_save_wav(filename, duration=5)

使用pyaudio绘制频谱

在这里插入图片描述

# 代码来自https://github.com/sbarratt/spectrum-analyzer/blob/master/sa.py,略有修改
import pyaudio
import struct
import math
import sys
import numpy as np
import IPython as ipyimport pyqtgraph as pg
from PyQt5 import QtWidgets  
from pyqtgraph.Qt import QtGui, QtCore# Audio Format (check Audio MIDI Setup if on Mac)
FORMAT = pyaudio.paInt16
RATE = 44100
CHANNELS = 2# Set Plot Range [-RANGE,RANGE], default is nyquist/2
RANGE = None
if not RANGE:RANGE = RATE/2# Set these parameters (How much data to plot per FFT)
INPUT_BLOCK_TIME = 0.05
INPUT_FRAMES_PER_BLOCK = int(RATE*INPUT_BLOCK_TIME)# Which Channel? (L or R)
LR = "l"class SpectrumAnalyzer():def __init__(self):self.pa = pyaudio.PyAudio()self.initMicrophone()self.initUI()def find_input_device(self):device_index = None            for i in range(self.pa.get_device_count()):     devinfo = self.pa.get_device_info_by_index(i)if devinfo["name"].lower() in ["mic","input"]:device_index = ireturn device_indexdef initMicrophone(self):device_index = self.find_input_device()self.stream = self.pa.open(	format = FORMAT,channels = CHANNELS,rate = RATE,input = True,input_device_index = device_index,frames_per_buffer = INPUT_FRAMES_PER_BLOCK)def readData(self):block = self.stream.read(INPUT_FRAMES_PER_BLOCK)count = len(block)/2format = "%dh"%(count)shorts = struct.unpack( format, block )if CHANNELS == 1:return np.array(shorts)else:l = shorts[::2]r = shorts[1::2]if LR == 'l':return np.array(l)else:return np.array(r)def initUI(self):self.app = QtWidgets.QApplication([]) # self.app = QtGui.QApplication([])self.app.quitOnLastWindowClosed()self.mainWindow = QtWidgets.QMainWindow()self.mainWindow.setWindowTitle("Spectrum Analyzer")self.mainWindow.resize(800,300)self.centralWid = QtWidgets.QWidget()self.mainWindow.setCentralWidget(self.centralWid)self.lay = QtWidgets.QVBoxLayout()self.centralWid.setLayout(self.lay)self.specWid = pg.PlotWidget(name="spectrum")self.specItem = self.specWid.getPlotItem()self.specItem.setMouseEnabled(y=False)self.specItem.setYRange(0,1000)self.specItem.setXRange(-RANGE,RANGE, padding=0)self.specAxis = self.specItem.getAxis("bottom")self.specAxis.setLabel("Frequency [Hz]")self.lay.addWidget(self.specWid)self.mainWindow.show()self.app.aboutToQuit.connect(self.close)def close(self):self.stream.close()sys.exit()def get_spectrum(self, data):T = 1.0/RATEN = data.shape[0]Pxx = (1./N)*np.fft.fft(data)f = np.fft.fftfreq(N,T)Pxx = np.fft.fftshift(Pxx)f = np.fft.fftshift(f)return f.tolist(), (np.absolute(Pxx)).tolist()def mainLoop(self):while 1:# Sometimes Input overflowed because of mouse events, ignore thistry:data = self.readData()except IOError:continuef, Pxx = self.get_spectrum(data)self.specItem.plot(x=f,y=Pxx, clear=True)QtWidgets.QApplication.processEvents()if __name__ == '__main__':sa = SpectrumAnalyzer()sa.mainLoop()

使用pyaudio绘制频谱+悬浮窗口

  • 添加到 setWindowFlags 中的标志,确保窗口保持在其他窗口之上。这样,即使焦点切换到其他窗口,悬浮窗口仍然会保持在顶部。

在这里插入图片描述

import pyaudio
import struct
import math
import sys
import numpy as np
import IPython as ipyimport pyqtgraph as pg
from PyQt5 import QtWidgets  
from pyqtgraph.Qt import QtGui, QtCore
from PyQt5.QtCore import Qt# Audio Format (check Audio MIDI Setup if on Mac)
FORMAT = pyaudio.paInt16
RATE = 44100
CHANNELS = 2# Set Plot Range [-RANGE,RANGE], default is nyquist/2
RANGE = None
if not RANGE:RANGE = RATE/2# Set these parameters (How much data to plot per FFT)
INPUT_BLOCK_TIME = 0.05
INPUT_FRAMES_PER_BLOCK = int(RATE*INPUT_BLOCK_TIME)# Which Channel? (L or R)
LR = "l"class SpectrumAnalyzer():def __init__(self):self.pa = pyaudio.PyAudio()self.initMicrophone()self.initUI()def find_input_device(self):device_index = None            for i in range(self.pa.get_device_count()):     devinfo = self.pa.get_device_info_by_index(i)if devinfo["name"].lower() in ["mic","input"]:device_index = ireturn device_indexdef initMicrophone(self):device_index = self.find_input_device()self.stream = self.pa.open(	format = FORMAT,channels = CHANNELS,rate = RATE,input = True,input_device_index = device_index,frames_per_buffer = INPUT_FRAMES_PER_BLOCK)def readData(self):block = self.stream.read(INPUT_FRAMES_PER_BLOCK)count = len(block)/2format = "%dh"%(count)shorts = struct.unpack( format, block )if CHANNELS == 1:return np.array(shorts)else:l = shorts[::2]r = shorts[1::2]if LR == 'l':return np.array(l)else:return np.array(r)def initUI(self):self.app = QtWidgets.QApplication([]) # self.app = QtGui.QApplication([])self.app.quitOnLastWindowClosed()self.mainWindow = QtWidgets.QMainWindow()self.mainWindow.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint)self.mainWindow.setWindowTitle("Spectrum Analyzer")self.mainWindow.setGeometry(100, 100, 300, 200)#self.mainWindow.resize(800,300)self.centralWid = QtWidgets.QWidget()self.mainWindow.setCentralWidget(self.centralWid)self.lay = QtWidgets.QVBoxLayout()self.centralWid.setLayout(self.lay)self.specWid = pg.PlotWidget(name="spectrum")self.specItem = self.specWid.getPlotItem()self.specItem.setMouseEnabled(y=False)self.specItem.setYRange(0,1000)self.specItem.setXRange(-RANGE,RANGE, padding=0)self.specAxis = self.specItem.getAxis("bottom")self.specAxis.setLabel("Frequency [Hz]")self.lay.addWidget(self.specWid)self.mainWindow.show()self.app.aboutToQuit.connect(self.close)def close(self):self.stream.close()sys.exit()def get_spectrum(self, data):T = 1.0/RATEN = data.shape[0]Pxx = (1./N)*np.fft.fft(data)f = np.fft.fftfreq(N,T)Pxx = np.fft.fftshift(Pxx)f = np.fft.fftshift(f)return f.tolist(), (np.absolute(Pxx)).tolist()def mainLoop(self):while 1:# Sometimes Input overflowed because of mouse events, ignore thistry:data = self.readData()except IOError:continuef, Pxx = self.get_spectrum(data)self.specItem.plot(x=f,y=Pxx, clear=True)QtWidgets.QApplication.processEvents()if __name__ == '__main__':sa = SpectrumAnalyzer()sa.mainLoop()

CG

  • Record audio stream from a microphone to wav files (with overlaps) using pyaudio
  • How to write pyaudio output into audio file?
  • https://cloud.tencent.com/developer/ask/sof/113102996
  • https://pypi.org/project/soundfile/
  • ipython是一个python的交互式shell,比默认的python shell好用得多,支持变量自动补全,自动缩进,支持bash shell命令,内置了许多很有用的功能和函数。学习ipython将会让我们以一种更高的效率来使用python。同时它也是利用Python进行科学计算和交互可视化的一个最佳的平台。

这篇关于pyaudio:录制并保存系统声音+绘制频谱的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/640916

相关文章

linux系统中java的cacerts的优先级详解

《linux系统中java的cacerts的优先级详解》文章讲解了Java信任库(cacerts)的优先级与管理方式,指出JDK自带的cacerts默认优先级更高,系统级cacerts需手动同步或显式... 目录Java 默认使用哪个?如何检查当前使用的信任库?简要了解Java的信任库总结了解 Java 信

Python绘制TSP、VRP问题求解结果图全过程

《Python绘制TSP、VRP问题求解结果图全过程》本文介绍用Python绘制TSP和VRP问题的静态与动态结果图,静态图展示路径,动态图通过matplotlib.animation模块实现动画效果... 目录一、静态图二、动态图总结【代码】python绘制TSP、VRP问题求解结果图(包含静态图与动态图

Python屏幕抓取和录制的详细代码示例

《Python屏幕抓取和录制的详细代码示例》随着现代计算机性能的提高和网络速度的加快,越来越多的用户需要对他们的屏幕进行录制,:本文主要介绍Python屏幕抓取和录制的相关资料,需要的朋友可以参考... 目录一、常用 python 屏幕抓取库二、pyautogui 截屏示例三、mss 高性能截图四、Pill

Oracle数据库在windows系统上重启步骤

《Oracle数据库在windows系统上重启步骤》有时候在服务中重启了oracle之后,数据库并不能正常访问,下面:本文主要介绍Oracle数据库在windows系统上重启的相关资料,文中通过代... oracle数据库在Windows上重启的方法我这里是使用oracle自带的sqlplus工具实现的方

JWT + 拦截器实现无状态登录系统

《JWT+拦截器实现无状态登录系统》JWT(JSONWebToken)提供了一种无状态的解决方案:用户登录后,服务器返回一个Token,后续请求携带该Token即可完成身份验证,无需服务器存储会话... 目录✅ 引言 一、JWT 是什么? 二、技术选型 三、项目结构 四、核心代码实现4.1 添加依赖(pom

基于Python实现自动化邮件发送系统的完整指南

《基于Python实现自动化邮件发送系统的完整指南》在现代软件开发和自动化流程中,邮件通知是一个常见且实用的功能,无论是用于发送报告、告警信息还是用户提醒,通过Python实现自动化的邮件发送功能都能... 目录一、前言:二、项目概述三、配置文件 `.env` 解析四、代码结构解析1. 导入模块2. 加载环

linux系统上安装JDK8全过程

《linux系统上安装JDK8全过程》文章介绍安装JDK的必要性及Linux下JDK8的安装步骤,包括卸载旧版本、下载解压、配置环境变量等,强调开发需JDK,运行可选JRE,现JDK已集成JRE... 目录为什么要安装jdk?1.查看linux系统是否有自带的jdk:2.下载jdk压缩包2.解压3.配置环境

Linux查询服务器系统版本号的多种方法

《Linux查询服务器系统版本号的多种方法》在Linux系统管理和维护工作中,了解当前操作系统的版本信息是最基础也是最重要的操作之一,系统版本不仅关系到软件兼容性、安全更新策略,还直接影响到故障排查和... 目录一、引言:系统版本查询的重要性二、基础命令解析:cat /etc/Centos-release详

更改linux系统的默认Python版本方式

《更改linux系统的默认Python版本方式》通过删除原Python软链接并创建指向python3.6的新链接,可切换系统默认Python版本,需注意版本冲突、环境混乱及维护问题,建议使用pyenv... 目录更改系统的默认python版本软链接软链接的特点创建软链接的命令使用场景注意事项总结更改系统的默

在Linux系统上连接GitHub的方法步骤(适用2025年)

《在Linux系统上连接GitHub的方法步骤(适用2025年)》在2025年,使用Linux系统连接GitHub的推荐方式是通过SSH(SecureShell)协议进行身份验证,这种方式不仅安全,还... 目录步骤一:检查并安装 Git步骤二:生成 SSH 密钥步骤三:将 SSH 公钥添加到 github