如何用Python监听Windows 10系统内部音频并检测250Hz阈值触发操作
实现Windows 10内部音频实时监听并检测250Hz频率触发操作
核心思路
无需录制音频文件,通过实时捕获内部音频流,用FFT(快速傅里叶变换)分析频率成分,当检测到峰值频率超过250Hz时执行指定操作。
所需依赖
先安装必要的Python库:
pip install sounddevice numpy
步骤说明与代码实现
启用Windows立体声混音设备
这是捕获内部音频的前提:右键任务栏音量图标 → 声音设置 → 更多声音设置 → 录制选项卡,找到「立体声混音」设备并启用它。获取音频设备ID
运行以下代码查看所有可用音频设备,找到「立体声混音」对应的ID:
import sounddevice as sd print(sd.query_devices())
输出示例中类似2: 立体声混音 (Realtek Audio), MME (2 in, 0 out)的行,数字2就是设备ID。
- 实时监听与频率检测代码
替换INPUT_DEVICE_ID为你的立体声混音设备ID,调整参数后运行:
import sounddevice as sd import numpy as np import time import sys # 配置参数 SAMPLING_RATE = 44100 # 音频采样率,常用44100Hz BLOCK_SIZE = 1024 # 每次捕获的音频帧大小,平衡延迟与精度 TARGET_FREQ = 250 # 触发阈值频率 TRIGGER_THRESHOLD = 3 # 连续检测到N次才触发,避免误判 trigger_count = 0 # 替换为你的立体声混音设备ID INPUT_DEVICE_ID = 2 def audio_callback(indata, frames, time_info, status): global trigger_count if status: print(status, file=sys.stderr) # 提取单声道音频数据(立体声取第一通道) audio_data = indata[:, 0] # 执行FFT计算频率成分 fft_result = np.fft.fft(audio_data) freqs = np.fft.fftfreq(len(fft_result), 1 / SAMPLING_RATE) # 只保留正频率部分 positive_freqs = freqs[:len(freqs) // 2] magnitude = np.abs(fft_result)[:len(freqs) // 2] # 找到当前帧的峰值频率 peak_freq = positive_freqs[np.argmax(magnitude)] # 判断是否触发操作 if peak_freq > TARGET_FREQ: trigger_count += 1 if trigger_count >= TRIGGER_THRESHOLD: # --------------------------- # 这里替换为你的指定操作 print("检测到频率超过250Hz,执行操作!") # 示例:调用外部命令/函数 # os.system("notepad.exe") # --------------------------- trigger_count = 0 # 重置计数,防止重复触发 else: trigger_count = 0 try: with sd.InputStream(device=INPUT_DEVICE_ID, samplerate=SAMPLING_RATE, blocksize=BLOCK_SIZE, callback=audio_callback): print("正在监听内部音频...按Ctrl+C停止") while True: time.sleep(1) except KeyboardInterrupt: print("\n监听停止") except Exception as e: print(f"错误:{str(e)}")
关键参数调整建议
- BLOCK_SIZE:值越大,FFT频率精度越高,但音频延迟也越大;如果需要低延迟,可尝试512或256,精度要求高则用2048。
- TRIGGER_THRESHOLD:如果经常误触发,可提高这个值(比如设为5),确保是持续的高频信号才触发。
- 频率检测优化:如果需要更准确的检测(比如排除噪声峰值),可以计算250Hz附近频率分量的总能量占比,而不是只取单一峰值频率。
内容的提问来源于stack exchange,提问作者Hassan
相关产品推荐
相关产品推荐

