python语言多功能录音机 - 系统内录+麦克风软件代码QZQ
importwarningsimporttkinterastkfromtkinterimportttk,messagebox,filedialogimportsoundcardasscimportsoundfileassfimportnumpyasnpimportthreadingimporttime# 屏蔽无关警告warnings.filterwarnings(ignore,categorysc.SoundcardRuntimeWarning)classAudioRecorderApp:def__init__(self,root):self.rootroot self.root.title(多功能录音机 - 系统内录麦克风)self.root.geometry(500x400)self.root.resizable(False,False)# 核心变量self.is_recordingFalse# 是否正在录音self.is_pausedFalse# 是否暂停self.recorded_data[]# 录制的数据self.record_threadNone# 录音线程self.samplerate44100# 采样率self.selected_deviceNone# 选中的录音设备self.record_typetk.StringVar(valuesystem)# 录音类型system(内录)/mic(麦克风)# 初始化UIself._init_ui()# 加载设备列表self._load_devices()def_init_ui(self):# 1. 录音类型选择type_framettk.LabelFrame(self.root,text录音类型)type_frame.pack(padx20,pady10,fillx)ttk.Radiobutton(type_frame,text系统内录,variableself.record_type,valuesystem,commandself._on_record_type_change).pack(sideleft,padx20,pady5)ttk.Radiobutton(type_frame,text麦克风录音,variableself.record_type,valuemic,commandself._on_record_type_change).pack(sideleft,padx20,pady5)# 2. 设备选择device_framettk.LabelFrame(self.root,text录音设备)device_frame.pack(padx20,pady10,fillx)ttk.Label(device_frame,text选择设备).pack(sideleft,padx10,pady5)self.device_comboboxttk.Combobox(device_frame,statereadonly,width30)self.device_combobox.pack(sideleft,padx10,pady5)self.device_combobox.bind(ComboboxSelected,self._on_device_selected)# 3. 录制时长设置time_framettk.LabelFrame(self.root,text录制设置)time_frame.pack(padx20,pady10,fillx)ttk.Label(time_frame,text录制时长(秒)).pack(sideleft,padx10,pady5)self.time_entryttk.Entry(time_frame,width10)self.time_entry.insert(0,5)# 默认5秒self.time_entry.pack(sideleft,padx5,pady5)ttk.Label(time_frame,text0为无限时长手动停止).pack(sideleft,padx5,pady5)# 4. 状态显示status_framettk.LabelFrame(self.root,text录制状态)status_frame.pack(padx20,pady10,fillx)self.status_labelttk.Label(status_frame,text未开始录制,foregroundgray)self.status_label.pack(padx10,pady10)# 5. 控制按钮btn_framettk.Frame(self.root)btn_frame.pack(padx20,pady20,fillx)self.start_btnttk.Button(btn_frame,text开始录制,commandself.start_recording)self.start_btn.pack(sideleft,padx10,pady5,fillx,expandTrue)self.pause_btnttk.Button(btn_frame,text暂停,commandself.pause_recording,statedisabled)self.pause_btn.pack(sideleft,padx10,pady5,fillx,expandTrue)self.stop_btnttk.Button(btn_frame,text停止录制,commandself.stop_recording,statedisabled)self.stop_btn.pack(sideleft,padx10,pady5,fillx,expandTrue)self.save_btnttk.Button(btn_frame,text保存录音,commandself.save_recording,statedisabled)self.save_btn.pack(sideleft,padx10,pady5,fillx,expandTrue)def_load_devices(self):加载录音设备列表根据录音类型ifself.record_type.get()system:# 系统内录加载扬声器设备devicessc.all_speakers()else:# 麦克风录音加载麦克风设备devicessc.all_microphones()# 提取设备名device_names[dev.namefordevindevices]self.device_combobox[values]device_namesifdevice_names:self.device_combobox.current(0)self.selected_devicedevices[0]def_on_record_type_change(self):切换录音类型时重新加载设备列表self._load_devices()self.status_label.config(text切换录音类型请重新选择设备,foregroundblue)def_on_device_selected(self,event):选择设备后更新选中的设备selected_idxself.device_combobox.current()ifself.record_type.get()system:self.selected_devicesc.all_speakers()[selected_idx]else:self.selected_devicesc.all_microphones()[selected_idx]self.status_label.config(textf已选中设备{self.selected_device.name},foregroundgreen)def_record_task(self):后台录音线程任务try:# 获取录制时长try:record_secondsint(self.time_entry.get())exceptValueError:messagebox.showerror(错误,录制时长请输入数字)self.is_recordingFalsereturn# 创建录音器ifself.record_type.get()system:# 系统内录开启loopbackmicsc.get_microphone(idstr(self.selected_device.name),include_loopbackTrue)else:# 麦克风录音普通麦克风micsc.get_microphone(idstr(self.selected_device.name))withmic.recorder(samplerateself.samplerate,blocksize1024)asrecorder:self.recorded_data[]total_framesself.samplerate*record_secondsifrecord_seconds0elsefloat(inf)recorded_frames0self.status_label.config(text正在录制...,foregroundred)whileself.is_recordingandrecorded_framestotal_frames:ifnotself.is_paused:# 每次录制1024帧chunkrecorder.record(numframes1024)self.recorded_data.append(chunk)recorded_frameslen(chunk)# 更新录制时长显示elapsedrecorded_frames/self.samplerate self.status_label.config(textf正在录制... 已录制{elapsed:.1f}秒,foregroundred)else:time.sleep(0.1)# 暂停时休眠# 录制结束self.is_recordingFalseself.root.after(0,lambda:self.status_label.config(textf录制完成总时长{recorded_frames/self.samplerate:.1f}秒,foregroundgreen))self.root.after(0,lambda:self._update_btn_state(after_stopTrue))exceptExceptionase:self.root.after(0,lambda:messagebox.showerror(录制错误,f录音失败{str(e)}))self.root.after(0,lambda:self.status_label.config(text录制失败,foregroundred))self.is_recordingFalseself.root.after(0,lambda:self._update_btn_state(after_stopTrue))defstart_recording(self):开始录制ifnotself.selected_device:messagebox.showwarning(警告,请先选择录音设备)returnifself.is_recordingandnotself.is_paused:messagebox.showinfo(提示,已经在录制中了)returnifself.is_paused:# 恢复暂停self.is_pausedFalseself.status_label.config(text恢复录制...,foregroundred)self.pause_btn.config(text暂停)return# 开始新的录制self.is_recordingTrueself.is_pausedFalseself._update_btn_state(after_startTrue)# 启动后台录音线程self.record_threadthreading.Thread(targetself._record_task,daemonTrue)self.record_thread.start()defpause_recording(self):暂停/恢复录制ifnotself.is_recording:returnself.is_pausednotself.is_pausedifself.is_paused:self.status_label.config(text录制已暂停,foregroundorange)self.pause_btn.config(text恢复)else:self.status_label.config(text恢复录制...,foregroundred)self.pause_btn.config(text暂停)defstop_recording(self):停止录制ifself.is_recording:self.is_recordingFalseself.status_label.config(text正在停止录制...,foregroundorange)# 等待线程结束ifself.record_thread:self.record_thread.join(timeout2)self._update_btn_state(after_stopTrue)self.status_label.config(text录制已停止,foregroundgreen)defsave_recording(self):保存录制的音频ifnotself.recorded_data:messagebox.showwarning(警告,没有可保存的录音数据)return# 选择保存路径file_pathfiledialog.asksaveasfilename(defaultextension.wav,filetypes[(WAV音频文件,*.wav),(所有文件,*.*)],title保存录音)ifnotfile_path:returntry:# 合并录制的数据datanp.concatenate(self.recorded_data,axis0)# 立体声转单声道兼容更多播放器datadata.mean(axis1)# 保存为WAV文件sf.write(file_path,data,self.samplerate)messagebox.showinfo(成功,f录音已保存到\n{file_path})exceptExceptionase:messagebox.showerror(保存失败,f保存出错{str(e)})def_update_btn_state(self,after_startFalse,after_stopFalse):更新按钮状态ifafter_start:self.start_btn.config(statenormal)# 开始按钮仍可用用于恢复暂停self.pause_btn.config(statenormal)self.stop_btn.config(statenormal)self.save_btn.config(statedisabled)elifafter_stop:self.start_btn.config(statenormal)self.pause_btn.config(statedisabled)self.stop_btn.config(statedisabled)self.save_btn.config(statenormal)else:# 默认状态self.start_btn.config(statenormal)self.pause_btn.config(statedisabled)self.stop_btn.config(statedisabled)self.save_btn.config(statedisabled)if__name____main__:roottk.Tk()appAudioRecorderApp(root)root.mainloop()

相关新闻

数据治理框架下的元数据管理实施路径

数据治理框架下的元数据管理实施路径

数据治理框架下的元数据管理实施路径:从混乱到有序的数字地图构建关键词:数据治理、元数据管理、数据资产、血缘分析、数据质量、实施路径、企业级数据管理摘要:在企业数字化转型的浪潮中,数据已成为核心生产要素。但数据爆炸式增…

2026/7/5 1:50:43 阅读更多 →
高校教学AI辅助平台数据标注成本高?AI应用架构师的弱监督学习方案

高校教学AI辅助平台数据标注成本高?AI应用架构师的弱监督学习方案

破解高校教学AI辅助平台数据困境:弱监督学习如何将标注成本降低80%?——AI应用架构师的实战方案 摘要/引言:高校AI教学的“数据瓶颈”与破局之道 开门见山:当AI教学遇上“标注悬崖” “我们团队花了3个月标注了5000份试卷,才勉强让智能批改模型达到85%的准确率,但全校…

2026/5/17 5:38:02 阅读更多 →
风电最大化消纳的热电联产机组联合优化控制附Matlab代码

风电最大化消纳的热电联产机组联合优化控制附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室🍊个人信条:格物致知,完整Matlab代码及仿真咨询…

2026/7/5 10:44:52 阅读更多 →

最新新闻

年度必看!2026AI写作辅助软件大盘点(覆盖 99% 毕业论文需求)

年度必看!2026AI写作辅助软件大盘点(覆盖 99% 毕业论文需求)

本文精选13 款2026 年实测 AI 论文工具,按全流程全能型、垂直领域专精型、润色降重专家、文献管理助手四大类别排序,覆盖从选题到定稿全链路,适配本科 / 硕博 / 期刊全场景,附选型速查表与避坑指南,帮你快速找到最佳拍…

2026/7/5 20:20:19 阅读更多 →
5分钟掌握Rembg:Python图像背景移除的终极解决方案

5分钟掌握Rembg:Python图像背景移除的终极解决方案

5分钟掌握Rembg:Python图像背景移除的终极解决方案 【免费下载链接】rembg Rembg is a tool to remove images background 项目地址: https://gitcode.com/GitHub_Trending/re/rembg 还在为复杂的图片背景处理而烦恼吗?Rembg(Remove B…

2026/7/5 20:20:19 阅读更多 →
TableExport:3分钟为你的HTML表格添加专业数据导出功能

TableExport:3分钟为你的HTML表格添加专业数据导出功能

TableExport:3分钟为你的HTML表格添加专业数据导出功能 【免费下载链接】TableExport The simple, easy-to-implement library to export HTML tables to xlsx, xls, csv, and txt files. 项目地址: https://gitcode.com/gh_mirrors/ta/TableExport 还在为网…

2026/7/5 20:18:19 阅读更多 →
ComfyUI-KJNodes:重构AI工作流架构的模块化扩展方案

ComfyUI-KJNodes:重构AI工作流架构的模块化扩展方案

ComfyUI-KJNodes:重构AI工作流架构的模块化扩展方案 【免费下载链接】ComfyUI-KJNodes Various custom nodes for ComfyUI 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-KJNodes 在AI图像生成和视频处理的复杂工作流中,ComfyUI已成为事实…

2026/7/5 20:16:18 阅读更多 →
5分钟快速部署:Python大麦网自动抢票脚本完整指南

5分钟快速部署:Python大麦网自动抢票脚本完整指南

5分钟快速部署:Python大麦网自动抢票脚本完整指南 【免费下载链接】Automatic_ticket_purchase 大麦网抢票脚本 项目地址: https://gitcode.com/GitHub_Trending/au/Automatic_ticket_purchase 还在为抢不到热门演唱会门票而烦恼吗?每次开票瞬间售…

2026/7/5 20:12:17 阅读更多 →
基于混沌系统与DNA编码的图像加密算法原理与Matlab实现

基于混沌系统与DNA编码的图像加密算法原理与Matlab实现

1. 项目概述:当混沌遇上DNA,图像加密的新思路最近在复现和优化一些经典的图像加密算法,发现将Logistic映射和Chen超混沌系统结合起来,再引入DNA分块编码,是一条非常有意思的技术路线。这不仅仅是两个混沌系统的简单堆叠…

2026/7/5 20:08:17 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻