Как получить объем вывода системы в python?

Я работаю над проектом, в котором мне нужно получить текущий уровень вывода звука системы в Python. По сути, я хочу знать, насколько громкий текущий звук, исходящий из динамиков, использует Python в системе Linux. Мне не нужно знать точный уровень громкости динамиков, меня интересует относительная громкость. Я не нашел хороших ресурсов в Интернете для этого.


person Corey Campbell    schedule 05.04.2018    source источник


Ответы (2)


tl; dr — альтернативный ответ для получения дискретного системного выходного тома в macOS.

Увидев ваш вопрос и узнав, что я не могу собрать pyalsaaudio на macOS, я хотел предоставить дополнительный ответ на вопрос, как это можно сделать конкретно на macOS, поскольку он не абстрагируется кросс-платформенным способом.

(Я знаю, что это не будет полезно для вашего непосредственного варианта использования, но у меня есть подозрение, что я не единственный пользователь Mac, который наткнется на этот вопрос, заинтересованный в решении, которое мы тоже можем запустить.)

В macOS вы можете получить выходной объем, запустив небольшой AppleScript:

$ osascript -e 'get volume settings'
output volume:13, input volume:50, alert volume:17, output muted:false

Я обернул этот вызов в функцию Python для анализа состояния громкости + отключения звука в простом диапазоне от 0 до 100:

import re
import subprocess


def get_speaker_output_volume():
    """
    Get the current speaker output volume from 0 to 100.

    Note that the speakers can have a non-zero volume but be muted, in which
    case we return 0 for simplicity.

    Note: Only runs on macOS.
    """
    cmd = "osascript -e 'get volume settings'"
    process = subprocess.run(cmd, stdout=subprocess.PIPE, shell=True)
    output = process.stdout.strip().decode('ascii')

    pattern = re.compile(r"output volume:(\d+), input volume:(\d+), "
                         r"alert volume:(\d+), output muted:(true|false)")
    volume, _, _, muted = pattern.match(output).groups()

    volume = int(volume)
    muted = (muted == 'true')

    return 0 if muted else volume

Например, на MacBook Pro при различных настройках громкости:

>>> # 2/16 clicks
>>> vol = get_speaker_output_volume()
>>> print(f'Volume: {vol}%')
Volume: 13%
>>> # 2/16 clicks + muted
>>> get_speaker_output_volume()
0
>>> # 16/16 clicks
>>> get_speaker_output_volume()
100
person Taylor Edmiston    schedule 05.04.2018

Содержит ли этот фрагмент с сайта https://askubuntu.com/a/689523/583376 нужную вам информацию?

Сначала pip install pyalsaaudio, а затем запустите, чтобы получить объем:

>>> import alsaaudio
>>> m = alsaaudio.Mixer()
>>> vol = m.getvolume()
>>> vol
[50L]

Примечание. Этот код скопирован из второй части связанного ответа. Я работаю на Mac и поэтому не могу запустить его, так как библиотека не будет работать на macOS, но на первый взгляд кажется, что она обеспечивает текущий уровень вывода системного звука в Linux.

person Taylor Edmiston    schedule 05.04.2018
comment
Возможно, текущий уровень звука — это неправильный выбор слов. Я ищу выходную версию примера 2 с этой страницы: programcreek.com /python/example/52624/pyaudio.PyAudio. Эта программа записывает громкость с микрофона по времени, я хочу громкость с динамиков по времени. Спасибо за вашу постоянную поддержку. - person Corey Campbell; 05.04.2018
comment
Итак, вы ищете непрерывный сигнал потока выходного уровня звука, а не дискретное значение? - person Taylor Edmiston; 05.04.2018
comment
Да, я обнаружил, что интенсивность звука — это термин, который я ищу. - person Corey Campbell; 05.04.2018
comment
Итак, вы ищете интенсивность звука то, что на самом деле воспроизводится через динамики, а не выходную громкость, на которую настроены динамики? - person Taylor Edmiston; 05.04.2018
comment
Это было бы правильно. Еще раз спасибо за вашу помощь. - person Corey Campbell; 05.04.2018