# Initialisation => Orange # Mute => Violet # Ecoute (stt) => Bleu # Reflechi(Ally) => Jaune # Repond(TTS) => Rose # Erreurs => Rouge #LED from driver_led import APA102 #BOUTON import RPi.GPIO as GPIO import time #STT import subprocess import json import vosk #ALLY import requests ## INIT #leds num_leds = 12 led = APA102(num_led=num_leds) #Bouton BUTTON = 17 GPIO.setmode(GPIO.BCM) GPIO.setup(BUTTON, GPIO.IN) etat = {'mute': False} #Ally url_ally = "https://192.168.1.12/mic" ## Initialisation #Stt model_path = "vosk-model/vosk-model-small-fr-0.22" model = vosk.Model(model_path) command = [ # "arecord", "-f", "cd", "-D", "hw:1" "arecord", "-f", "S16_LE", "-c", "2", "-r", "16000", "-D", "hw:1" ] arecord = subprocess.Popen(command, stdout=subprocess.PIPE) ffmpeg = subprocess.Popen( [ "ffmpeg", "-loglevel", "quiet", "-i", "pipe:0", "-ac", "1", "-ar", "16000", "-f", "s16le", "pipe:1" ], stdin=arecord.stdout, stdout=subprocess.PIPE ) #Vosk rec = vosk.KaldiRecognizer(model, 16000) ## LED def set_couleur(couleur): couleur = couleur.upper() # Dictionnaire des couleurs couleurs_rgb = { 'R': (255, 0, 0), # Rouge 'V': (0, 255, 0), # Vert 'B': (0, 0, 255), # Bleu 'J': (255, 255, 0), # Jaune 'VI': (128, 0, 128), # Violet 'RO': (255, 105, 180), # Rose 'O': (255, 165, 0), # Orange } rgb = couleurs_rgb.get(couleur, (0, 0, 0)) # Éteindre si couleur inconnue for i in range(num_leds): led.set_pixel(i, *rgb) led.show() def eteindre_led(): set_couleur("") # Couleur inconnue → éteint def cleanup_led(): led.cleanup() ## BOUTON # Bascule mute/unmute def toggle_mute(channel): etat['mute'] = not etat['mute'] if etat['mute']: set_couleur('VI') # Violet = mute else: set_couleur('') # Vert = unmute # Event du bouton préssé GPIO.add_event_detect(BUTTON, GPIO.FALLING, callback=toggle_mute, bouncetime=300) ## IA def ally(texte): try: payload = {"texto": texte} headers = {"Content-Type": "application/json"} response = requests.post(url_ally, json=payload, headers=headers) if response.status_code == 200: data = response.json() return data.get("ora", "") # texte à vocaliser else: return "" except Exception as e: return "" ## MAIN try: while True: if etat['mute']: time.sleep(0.2) continue else: set_couleur('B') data = ffmpeg.stdout.read(4000) if len(data) == 0: break if rec.AcceptWaveform(data): result = json.loads(rec.Result()) texto = result.get("text", "") #Resultat du STT print("Q>",result.get("text", "")) # ENVOI Vers ALLY reponse = ally(texto) print(reponse) ## else: partial = json.loads(rec.PartialResult()) time.sleep(1) # Le programme tourne sans rien faire except KeyboardInterrupt: print("Nettoyage GPIO") cleanup_led() GPIO.cleanup()