如何通过Python脚本获取机器的输入设备?

-1 投票
0 回答
31 浏览
提问于 2025-04-11 23:25

我需要帮助,想写一个Python程序,能够在我的Windows 10电脑上获取可用的麦克风列表。

我的代码:

import pyaudio
import logging
import customtkinter as ctk
from pathlib import Path

def choisir_microphone():
    """
    Choisissez un micro disponible sur l'ordinateur.

    Returns:
        int or None: Index du microphone sélectionné, ou None si aucun microphone n'a été sélectionné.
    """
    
    # Obtenez le chemin du répertoire parent du fichier en cours d'exécution
    parent_dir = Path(__file__).resolve().parent
    parent_dir.mkdir(parents=True, exist_ok=True)

    # Définir le chemin complet du fichier de journalisation
    DIR_logs = parent_dir / "logs_micro.log"

    # Configuration du module de journalisation
    logging.basicConfig(filename=DIR_logs, level=logging.INFO, format='%(levelname)s - %(message)s')
    with open(DIR_logs, "w") as log:
        log.write("")

    def obtenir_microphones_disponibles():
        """
        Obtenez les microphones disponibles sur l'ordinateur.

        Returns:
            list: Liste des microphones disponibles, sous forme de tuples (index, nom).
        """
        try:
            audio = pyaudio.PyAudio()
            microphones = []
            device_names = {}  # Dictionnaire pour stocker les noms des périphériques

            for i in range(audio.get_device_count()):
                device_info = audio.get_device_info_by_index(i)
                max_input_channels = device_info.get('maxInputChannels')

                if isinstance(max_input_channels, int) and max_input_channels > 0:
                    device_name = device_info.get('name')
                    # Vérifier si le périphérique a déjà été ajouté
                    if device_name not in device_names:
                        # Vérifier si le périphérique est un microphone
                        if 'microphone' in str(device_name).lower():
                            microphones.append((i, device_name))
                            device_names[device_name] = True
                    else:
                        logging.warning(f"Périphérique déjà existant : {device_name}")

            logging.info("Microphones disponibles et utilisables:")
            for index, microphone in microphones:
                logging.info(f"{index}: {microphone}")
                print(f"{index}: {microphone}")
                print("-" * 50)

            audio.terminate()
            return microphones

        except Exception as e:
            logging.error(f"Une erreur s'est produite : {e}")
            return []

    # Obtention des microphones disponibles
    microphones = obtenir_microphones_disponibles()

    if not microphones:
        logging.error("Aucun microphone disponible.")
        print("Aucun microphone disponible.")
        return None

    app = ctk.CTk()
    app.title('Choix du microphone')
    app.geometry("550x100")  # Taille de la fenêtre
    app.iconbitmap(parent_dir/"logo.ico")

    label = ctk.CTkLabel(app, text="Choisissez un microphone:", font=("Arial", 14))  # Police réduite
    label.pack()

    microphone_choisi = None
    fenetre_fermee_sans_selection = False

    def callback_optionmenu(choix):
        nonlocal microphone_choisi
        nonlocal microphones
        index_microphone = [microphone[1] for microphone in microphones].index(choix)
        microphone_choisi = microphones[index_microphone][0]
        print("Microphone choisi (index):", microphone_choisi)
        app.destroy()  # Fermer la fenêtre quand un choix est fait

    def sur_fermeture_fenetre():
        nonlocal fenetre_fermee_sans_selection
        fenetre_fermee_sans_selection = True
        app.destroy()

    optionmenu_var = ctk.StringVar(value=microphones[0][1])
    optionmenu = ctk.CTkOptionMenu(app, values=[microphone[1] for microphone in microphones],
                                             command=callback_optionmenu,
                                             variable=optionmenu_var,
                                             font=("Arial", 14))  # Police réduite
    optionmenu.pack()

    app.protocol("WM_DELETE_WINDOW", sur_fermeture_fenetre)
    app.mainloop()

    if fenetre_fermee_sans_selection:
        return None
    else:
        return microphone_choisi

if __name__ == "__main__":
    microphone_selectionne = choisir_microphone()
    print(microphone_selectionne)

0 个回答

暂无回答

撰写回答