检查 windows 上是否有任何设备正在播放声音 python

check if any devices on windows are playing sound python

我正在尝试检测 windows 上的系统声音,我想我可以使用 pyaudio 模块,因为 winrt 对我不起作用。 我有这个列出所有设备的代码,我知道我可以用 pyaudio

打开流
import pyaudio
p = pyaudio.PyAudio()
for i in range(p.get_device_count()):
    dev = p.get_device_info_by_index(i)
    print(dev)

但我如何判断这些设备中的任何一个当前是否正在输出声音?我是否为每个人打开一个流并取字节的均方根?如果这是一个 XY 问题,我最好使用另一个模块,请告诉我

我之前使用名为 PyCaw 的库(Python Windows 的核心音频)

第一个pip install pycaw 出于某种原因,此安装仅在 运行 作为管理员时有效,但这可能是我的机器特有的问题

下面列出当前正在输出音频的进程。

from pycaw.pycaw import AudioUtilities

sessions = AudioUtilities.GetAllSessions()

for session in sessions:
    print(session.Process)

出于某种原因,它似乎总是在末尾有一个 None 引用,但您应该能够很容易地处理它

在 python 中,我没有找到任何非常有效的模块来检索 pc 的内部音频,而是找到了一种使用 Stereo Mixer[将输出设备模拟为输入的方法] =26=] 在 windows 平台上。

请参考 this link 在您的 windows 环境中启用立体声混音器。

之后使用此代码找到立体声混音器所在的索引:

import pyaudio
p = pyaudio.PyAudio()
for i in range(p.get_device_count()):
    print("\n\n Index " + str(i) + " :\n")
    dev = p.get_device_info_by_index(i)
    print(dev.get('name'))
    print("------------------------------------------------------------")

此代码将列出所有音频设备及其索引。记下电脑中Stereo Mixer的索引号。

检测声音的主要代码来了,将设备变量的值替换为Stereo Mixer的索引。对我来说是 2.

import pyaudio
import audioop

p = pyaudio.PyAudio()
CHUNK = 1024
FORMAT = pyaudio.paInt16
RATE = 44100
silent_threshold = 1

device = 2
stream = p.open(format=FORMAT, channels = p.get_device_info_by_index(device).get('maxInputChannels') , rate=RATE, input = True ,  frames_per_buffer=CHUNK , input_device_index = device)

while True:
    
    data=stream.read(CHUNK)
    threshold = audioop.max(data , 2)
    print(threshold)
    if  threshold > silent_threshold :
        print("Sound found at index " + str(device))
    else :
        print("Sound not found at index " + str(device))

p.terminate()

注意 silent_threshold 的用法,你增加它的值越多,它变得越不活跃。例如,如果你想检测绝对静音使用 1 或检测安静使用 20 ,这取决于你的电脑上的声音播放。