Windows10下如何用Python获取扬声器实时输出音量?
解决系统扬声器音量检测问题
你的代码问题出在用错了音频流类型:sd.OutputStream是用来向扬声器输出音频的,不会捕获正在播放的系统声音,所以indata始终为空,音量显示0是必然的。要获取系统播放的音频,需要使用环回捕获(捕获系统输出的音频信号),以下是可行的解决方案:
方案一:用sounddevice捕获环回设备
- 先列出所有音频设备,找到你的环回设备(比如Windows的“立体声混音”、macOS/Linux的“Loopback”设备):
import sounddevice as sd print(sd.query_devices())
- 修改代码,使用
InputStream并指定环回设备ID:
import sounddevice as sd import numpy as np import sys def audio_callback(indata, frames, time, status): if status: print(status, file=sys.stderr) # 计算音量,系数可根据需求调整 volume_norm = np.linalg.norm(indata) * 10 print(f"Volume Level: {volume_norm:.2f}") def main(): # 替换为你找到的环回设备ID loopback_device_id = 2 # 示例ID,需自行修改 sd.default.device = loopback_device_id sd.default.channels = 2 sd.default.samplerate = 44100 with sd.InputStream(callback=audio_callback): print("正在监听系统音量...按Ctrl+C停止") sd.sleep(10000) # 监听10秒,可改为while True持续监听 if __name__ == "__main__": main()
方案二:用soundcard库(更简便,自动识别环回)
soundcard库会自动处理环回设备的识别,无需手动找ID:
- 安装库:
pip install soundcard
- 运行检测代码:
import soundcard as sc import numpy as np # 获取默认扬声器对应的环回麦克风 speaker = sc.default_speaker() mic = sc.get_microphone(id=speaker.id, include_loopback=True) with mic.recorder(samplerate=44100, channels=2) as rec: print("正在监听系统音量...按Ctrl+C停止") while True: data = rec.record(numframes=1024) volume_norm = np.linalg.norm(data) * 10 print(f"Volume Level: {volume_norm:.2f}")
注意事项
- Windows:默认“立体声混音”设备可能被禁用,需在声音设置的“录制”选项卡中启用它
- macOS:需要给运行代码的终端/IDE授予麦克风权限(系统偏好设置→安全性与隐私→麦克风)
- Linux:可能需要安装
pulseaudio-module-loopback包来启用环回功能
内容的提问来源于stack exchange,提问作者Pavan Yogi
相关产品推荐
相关产品推荐

