Список всех актуальных микрофонов Python

Как я могу перечислить все существующие микрофоны, доступные в настоящее время в Python?

В настоящее время я делаю это:

import pyaudio

p = pyaudio.PyAudio()

print("Available audio input devices:")
for i in range(p.get_device_count()):
    dev_info = p.get_device_info_by_index(i)
    print(f"{i}: {dev_info['name']}")

device_index = int(input("Enter the index of the audio input device you want to use: "))

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

Для справки, у меня есть 3 устройства ввода и 2 устройства вывода, но скрипт печатает 29 элементов.

Как правильно «фильтровать» это, чтобы отображались только реальные устройства, то есть те, которые доступны в моих «Настройки» > «Система» > «Звук»?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
166
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я не уверен, что это самое эффективное решение, но оно работает.

import pyaudio

#Check language replace with microphone_check_string = "" if you don't want language functionality
from sys import platform

import os

microphone_check_string = ""

if platform == "linux" or platform == "linux2" or platform == "darwin":
    #get os language in linux or macos
    language = os.environ['LANG']
elif platform == "win32":
    #get os language in windows
    import ctypes
    import locale
    locale.getlocale()
    windll = ctypes.windll.kernel32
    windll.GetUserDefaultUILanguage()
    language = locale.windows_locale[ windll.GetUserDefaultUILanguage() ]

#remove character encoding for linux or macos
if ("UTF-8" in language):
    language = language.replace(".UTF-8", "")

#Translate the "Microphone" text to desired language
match language:
    case "en_US"  : 
        microphone_check_string = "Microphone"
#End check language

p = pyaudio.PyAudio()

devices = p.get_device_count()

#list of device objects(dicts)
device_list = []

#list of device names. Used for detecting duplicates
temp_name_list = []

for i in range(devices):
   # Get the device info
   device_info = p.get_device_info_by_index(i)
   # Check if this device is a microphone (an input device)
   if device_info.get('maxInputChannels') > 0:
        #get device name
        device_name = device_info.get("name")
        #check if device is duplicate
        if (device_name not in temp_name_list and microphone_check_string in device_name):
            #add device to device list
            device_list.append(device_info)
            #add device to name list
            temp_name_list.append(device_name)

#print device names
for pos, device in enumerate(device_list):
   print(f"{pos}: {device["name"]}")

list_len = len(device_list)

#handle user input
while True:
    device_user_selected = int(input("Enter the number of the audio input device you want to use: "))
    
    if (device_user_selected < 0 or device_user_selected >= list_len):
        print("Please select a device that is in the list.")
    else:
        break

#do device select logic
#retrieve device info by doing device_list[device_user_selected]

print(device_list[device_user_selected])

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

Это результат, который я получаю:

0: Microsoft Sound Mapper - Input
1: Microphone (Razer Seiren X)
2: Microphone (High Definition Aud
3: Primary Sound Capture Driver
4: Microphone (High Definition Audio Device)
5: Microphone (HD Audio Microphone)
Enter the number of the audio input device you want to use: 1
{'index': 1, 'structVersion': 2, 'name': 'Microphone (Razer Seiren X)', 'hostApi': 0, 'maxInputChannels': 2, 'maxOutputChannels': 0, 'defaultLowInputLatency': 0.09, 'defaultLowOutputLatency': 0.09, 'defaultHighInputLatency': 0.18, 'defaultHighOutputLatency': 0.18, 'defaultSampleRate': 44100.0}

Чтобы получить еще лучшие результаты, добавьте следующее условие "Microphone" in device_name к условию, проверяющему, является ли устройство дубликатом.

Обновлено: добавлена ​​языковая функциональность, благодаря которой проверяемая строка может быть изменена в зависимости от языка операционной системы. Если вы хотите отключить этот набор microphone_check_string = "" до того, как pyaudio будет инициализирован и он не будет строковым, проверьте имя устройства.

Пожалуйста, обратитесь к этому ответу о переполнении стека для получения информации о проверке языка ОС в Python: https://stackoverflow.com/a/25691701/19097807

И этот ответ для определения ОС хоста в Python: https://stackoverflow.com/a/8220141/19097807

Дайте мне знать, если это не решит вашу проблему или вам понадобится помощь в чем-то еще.

Не уверен, что вам следует проверить «Микрофон», если это приложение должно запускаться на клиентских устройствах, на которых язык может отличаться от английского.

kibibu 17.04.2024 08:00

У вас есть хорошая точка зрения. Добавил функционал проверки языка ОС. Я тестировал в Windows, MacOS и Linux.

Weston Simon 17.04.2024 17:45
Ответ принят как подходящий

Поскольку PortAudio поддерживает несколько API, вы видите повторяющиеся упоминания одного и того же устройства, но на разных API хоста (для справки: https://files.portaudio.com/docs/v19-doxydocs/api_overview.html). Вы можете просто отфильтровать это следующим образом:

import pyaudio
pa = pyaudio.PyAudio()
print("Number of devices (all APIs, input + output):"+ pa.get_device_count())

for i in range (pa.get_device_count()):
   device_info = pa.get_device_info_by_index(i)
   if device_info['maxInputChannels'] != 0 and device_info['hostApi'] == 0:
       print('Device ' + str(i) + ': ' + device_info['name'])

Я уверен, что есть еще более короткий способ сделать это, но, по сути, все сводится к тому, какой собственный аудиоAPi нужен/нужен вашему приложению, и вы подсчитываете количество устройств ввода с одним и тем же API.

Другие вопросы по теме