91 lines
2.2 KiB
Plaintext
91 lines
2.2 KiB
Plaintext
#LED
|
|
from driver_led import APA102
|
|
#BOUTON
|
|
import RPi.GPIO as GPIO
|
|
import time
|
|
#STT
|
|
import subprocess
|
|
import json
|
|
import vosk
|
|
|
|
## INIT
|
|
# Initialisation des LEDs
|
|
num_leds = 12
|
|
led = APA102(num_led=num_leds)
|
|
# Initialisation Bouton
|
|
BUTTON = 17
|
|
GPIO.setmode(GPIO.BCM)
|
|
GPIO.setup(BUTTON, GPIO.IN)
|
|
etat = {'mute': False}
|
|
# Inistialisation STT
|
|
model_path = "vosk-model/vosk-model-small-fr-0.22"
|
|
model = vosk.Model(model_path)
|
|
command = [
|
|
"arecord", "-f", "cd", "-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
|
|
)
|
|
# Initialisation 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') # Rouge = mute
|
|
else:
|
|
set_couleur('') # Vert = unmute
|
|
|
|
# Event du bouton préssé
|
|
GPIO.add_event_detect(BUTTON, GPIO.FALLING, callback=toggle_mute, bouncetime=300)
|
|
|
|
try:
|
|
while True:
|
|
data = ffmpeg.stdout.read(4000)
|
|
if len(data) == 0:
|
|
break
|
|
if rec.AcceptWaveform(data):
|
|
result = json.loads(rec.Result())
|
|
print("📝", result.get("text", ""))
|
|
else:
|
|
partial = json.loads(rec.PartialResult())
|
|
|
|
time.sleep(1) # Le programme tourne sans rien faire
|
|
|
|
except KeyboardInterrupt:
|
|
print("Nettoyage GPIO")
|
|
cleanup_led()
|
|
GPIO.cleanup()
|