ia_hackathon/main.py
@arthurcabon29 a97d12443c add project
2025-03-07 15:57:11 +01:00

153 lines
4.5 KiB
Python

import requests
import whisper
import sounddevice as sd
import numpy as np
import soundfile as sf
import pyttsx3
import random
import re
import pygame
import time
import serial
# list of tics audios
# 3, 16, 17, 18, 20, 22, 23, 24 have been removed
PATHS_AUDIO = [
'assets/audio/1.wav',
'assets/audio/2.wav',
'assets/audio/4.wav',
'assets/audio/5.wav',
'assets/audio/6.wav',
'assets/audio/7.wav',
'assets/audio/8.wav',
'assets/audio/9.wav',
'assets/audio/10.wav',
'assets/audio/11.wav',
'assets/audio/12.wav',
'assets/audio/13.wav',
'assets/audio/14.wav',
'assets/audio/15.wav',
'assets/audio/19.wav',
'assets/audio/21.wav',
'assets/audio/claquement-2.wav',
'assets/audio/claquement-3.wav',
'assets/audio/claquement-4.wav',
'assets/audio/claquement-5.wav',
]
# Mistral AI API Key
API_KEY = "MY_API_KEY"
# Initializing the speech synthesis engine
engine = pyttsx3.init()
# Loading the Whisper model
print("Initialisation du Brainrot...")
whisper_model = whisper.load_model("base")
# Creation of the prompt that will be sent to the API
def create_prompte(text):
prompte = "Je souhaiterais que tu incarne du debut a la fin de ta reponse quelqu'un avec des tics. \
La personne qui tu incarne ne devras pas avoir plus de 5 tics dans sa réponse. \
Tout les tics seront representés entre crochets, comme ceci : [tic] \
Plusieurs tics d'affilés soront recrésentés entre crochets et non séparés par des espaces. \
Voici la phrese auquel je veux que tu repondes : "
prompte += text
return (prompte)
# Function to record audio
def record_audio(filename="output.wav", duration=5, samplerate=44100):
print("Parle maintenant...")
recording = sd.rec(int(samplerate * duration), samplerate=samplerate, channels=1, dtype=np.float32)
sd.wait()
sf.write(filename, recording, samplerate)
print("Enregistrement terminé.")
# Function to transcribe audio to text
def transcribe_audio(filename="output.wav"):
print("Transcription de l'audio en cours...")
result = whisper_model.transcribe(filename)
text = result["text"].strip()
print(f"Transcription détectée : '{text}'")
return text
# Function to send the request to Mistral AI
def generate_response(prompt):
if not prompt:
return "Je n'ai rien compris, peux-tu répéter ?"
print("Génération de la réponse...")
url = "https://api.mistral.ai/v1/chat/completions"
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
data = {
"model": "mistral-tiny",
"messages": [{"role": "user", "content": create_prompte(prompt)}]
}
response = requests.post(url, json=data, headers=headers)
if response.status_code == 200:
ai_response = response.json()["choices"][0]["message"]["content"]
print(f"{ai_response}")
return ai_response
else:
error_message = f"Erreur API Mistral: {response.status_code} - {response.text}"
print(f"{error_message}")
return error_message
def play(path):
pygame.mixer.music.load(path)
pygame.mixer.music.play()
while pygame.mixer.music.get_busy():
time.sleep(0.1)
def get_audio_path():
num_tic = random.randint(0, len(PATHS_AUDIO) - 1)
return (PATHS_AUDIO[num_tic])
# Function to make AI speak
# Possibility to give him different tics
def speak(text, arduino):
tab_text = re.split(r"[\[\]]", text)
for text_i in tab_text:
match text_i.lower():
case "tic":
if (random.randint(0, 2) == 0):
play(get_audio_path())
else:
print("test")
arduino.write(b"R")
case _:
engine.say(text_i)
engine.runAndWait()
# Main function
def main():
pygame.init()
pygame.mixer.init()
print("Connexion a la carte arduino...")
arduino = serial.Serial('COM4', 9600, timeout=1)
time.sleep(2)
print("Connexion réalisé !")
while True:
record_audio() # Records the user's voice
user_text = transcribe_audio() # Transcribes audio to text
# possibility to send prompts
# user_text = input("Ecrivez votre prompte : ")
print(user_text)
if user_text.lower() in ["stop", "quitte", "exit"]:
print("Fin du programme.")
break
response = generate_response(user_text) # Send the text to Mistral AI
speak(response, arduino) # Make AI talk with pyttsx3
if __name__ == "__main__":
main()