Как я могу перечислить все существующие микрофоны, доступные в настоящее время в 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 элементов.
Как правильно «фильтровать» это, чтобы отображались только реальные устройства, то есть те, которые доступны в моих «Настройки» > «Система» > «Звук»?






Я не уверен, что это самое эффективное решение, но оно работает.
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
Дайте мне знать, если это не решит вашу проблему или вам понадобится помощь в чем-то еще.
У вас есть хорошая точка зрения. Добавил функционал проверки языка ОС. Я тестировал в Windows, MacOS и Linux.
Поскольку 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.
Не уверен, что вам следует проверить «Микрофон», если это приложение должно запускаться на клиентских устройствах, на которых язык может отличаться от английского.