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系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

Linux系统之主机网络配置方式

《Linux系统之主机网络配置方式》:本文主要介绍Linux系统之主机网络配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、查看主机的网络参数1、查看主机名2、查看IP地址3、查看网关4、查看DNS二、配置网卡1、修改网卡配置文件2、nmcli工具【通用

Linux系统之dns域名解析全过程

《Linux系统之dns域名解析全过程》:本文主要介绍Linux系统之dns域名解析全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、dns域名解析介绍1、DNS核心概念1.1 区域 zone1.2 记录 record二、DNS服务的配置1、正向解析的配置

Python实战之屏幕录制功能的实现

《Python实战之屏幕录制功能的实现》屏幕录制,即屏幕捕获,是指将计算机屏幕上的活动记录下来,生成视频文件,本文主要为大家介绍了如何使用Python实现这一功能,希望对大家有所帮助... 目录屏幕录制原理图像捕获音频捕获编码压缩输出保存完整的屏幕录制工具高级功能实时预览增加水印多平台支持屏幕录制原理屏幕

Linux系统中配置静态IP地址的详细步骤

《Linux系统中配置静态IP地址的详细步骤》本文详细介绍了在Linux系统中配置静态IP地址的五个步骤,包括打开终端、编辑网络配置文件、配置IP地址、保存并重启网络服务,这对于系统管理员和新手都极具... 目录步骤一:打开终端步骤二:编辑网络配置文件步骤三:配置静态IP地址步骤四:保存并关闭文件步骤五:重

Windows系统下如何查找JDK的安装路径

《Windows系统下如何查找JDK的安装路径》:本文主要介绍Windows系统下如何查找JDK的安装路径,文中介绍了三种方法,分别是通过命令行检查、使用verbose选项查找jre目录、以及查看... 目录一、确认是否安装了JDK二、查找路径三、另外一种方式如果很久之前安装了JDK,或者在别人的电脑上,想

Linux系统之authconfig命令的使用解读

《Linux系统之authconfig命令的使用解读》authconfig是一个用于配置Linux系统身份验证和账户管理设置的命令行工具,主要用于RedHat系列的Linux发行版,它提供了一系列选项... 目录linux authconfig命令的使用基本语法常用选项示例总结Linux authconfi

Nginx配置系统服务&设置环境变量方式

《Nginx配置系统服务&设置环境变量方式》本文介绍了如何将Nginx配置为系统服务并设置环境变量,以便更方便地对Nginx进行操作,通过配置系统服务,可以使用系统命令来启动、停止或重新加载Nginx... 目录1.Nginx操作问题2.配置系统服android务3.设置环境变量总结1.Nginx操作问题

CSS3 最强二维布局系统之Grid 网格布局

《CSS3最强二维布局系统之Grid网格布局》CS3的Grid网格布局是目前最强的二维布局系统,可以同时对列和行进行处理,将网页划分成一个个网格,可以任意组合不同的网格,做出各种各样的布局,本文介... 深入学习 css3 目前最强大的布局系统 Grid 网格布局Grid 网格布局的基本认识Grid 网

在不同系统间迁移Python程序的方法与教程

《在不同系统间迁移Python程序的方法与教程》本文介绍了几种将Windows上编写的Python程序迁移到Linux服务器上的方法,包括使用虚拟环境和依赖冻结、容器化技术(如Docker)、使用An... 目录使用虚拟环境和依赖冻结1. 创建虚拟环境2. 冻结依赖使用容器化技术(如 docker)1. 创