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

相关文章

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

Linux系统中查询JDK安装目录的几种常用方法

《Linux系统中查询JDK安装目录的几种常用方法》:本文主要介绍Linux系统中查询JDK安装目录的几种常用方法,方法分别是通过update-alternatives、Java命令、环境变量及目... 目录方法 1:通过update-alternatives查询(推荐)方法 2:检查所有已安装的 JDK方

Linux系统之lvcreate命令使用解读

《Linux系统之lvcreate命令使用解读》lvcreate是LVM中创建逻辑卷的核心命令,支持线性、条带化、RAID、镜像、快照、瘦池和缓存池等多种类型,实现灵活存储资源管理,需注意空间分配、R... 目录lvcreate命令详解一、命令概述二、语法格式三、核心功能四、选项详解五、使用示例1. 创建逻

使用Python构建一个高效的日志处理系统

《使用Python构建一个高效的日志处理系统》这篇文章主要为大家详细讲解了如何使用Python开发一个专业的日志分析工具,能够自动化处理、分析和可视化各类日志文件,大幅提升运维效率,需要的可以了解下... 目录环境准备工具功能概述完整代码实现代码深度解析1. 类设计与初始化2. 日志解析核心逻辑3. 文件处

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序