Alfred/tempo/dona/archive/app.py.nonoptimiser
2025-11-11 13:38:25 +01:00

132 lines
3.1 KiB
Plaintext

# 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()