diff --git a/code/backend_reconnaissance/Dockerfile b/code/backend_reconnaissance/Dockerfile index e559259..a591396 100644 --- a/code/backend_reconnaissance/Dockerfile +++ b/code/backend_reconnaissance/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.8-slim +FROM python:3.8 #Ne pas créer les fichiers .pyc ENV PYTHONDONTWRITEBYTECODE=1 @@ -7,7 +7,7 @@ ENV PYTHONUNBUFFERED=1 #Installation des dépendances de opencv RUN apt-get update -RUN apt-get install ffmpeg libsm6 libxext6 -y +RUN apt-get install ffmpeg libsm6 libxext6 portaudio19-dev python3-pyaudio -y # Installation des dépendances python COPY requirements.txt . diff --git a/tmp2.py b/code/backend_reconnaissance/audio_detector.py similarity index 86% rename from tmp2.py rename to code/backend_reconnaissance/audio_detector.py index ba72d1d..9b23c89 100644 --- a/tmp2.py +++ b/code/backend_reconnaissance/audio_detector.py @@ -5,6 +5,7 @@ import math from scipy.io import wavfile import wave from scipy.fftpack import fft,dct +import time from matplotlib.patches import ConnectionPatch import matplotlib.pyplot as plt @@ -170,31 +171,38 @@ def record_audio(filename, duration, sr): print(f"Fichier enregistré sous {filename}") def coupe_silence(signal): - t = 0 - if signal[t] == 0 : - p = 0 - while signal[t+p] == 0 : - if p == 88 : - signal = signal[:t] + signal[t+p:] - coupe_silence(signal) - else : - p = p+1 -sr = 44100 # fréquence d'échantillonnage -duration = 6 # durée d'enregistrement en secondes -filename = "audio_query" # nom du fichier à enregistrer -record_audio(filename, duration, sr) -audio_query, sr = librosa.load('C:\\Users\\HP\\audio_query.wav', sr=sr) -coupe_silence(audio_query) -audio_train_list = [librosa.load('C:\\Users\\HP\\Documents\\cool.wav', sr=sr)[0], librosa.load('C:\\Users\\HP\\Documents\\formidable.wav', sr=sr)[0], librosa.load('C:\\Users\\HP\\Documents\\cest mauvais.wav', sr=sr)[0] , librosa.load('C:\\Users\\HP\\Documents\\un.wav', sr=sr)[0], librosa.load('C:\\Users\\HP\\Documents\\parfait.wav', sr=sr)[0]] -recognized_word_index = recognize_speech(audio_query, audio_train_list, sr) -print(f'Recognized word: {recognized_word_index}') +#Todo : detecte si pas de note donnée +def get_grade(): + ######## TEST DEBUG ######## + time.sleep(6) + return 5 + + + sr = 44100 # fréquence d'échantillonnage + duration = 6 # durée d'enregistrement en secondes + filename = "recording" # nom du fichier à enregistrer + data_dir = "audio_data/" + record_audio(filename, duration, sr) + audio_query, sr = librosa.load(f'{filename}.wav', sr=sr) + coupe_silence(audio_query) + training_file_names = [] + for path in os.listdir(data_dir): + if os.path.isfile(os.path.join(data_dir, path)): + training_file_names.append(data_dir + path) + print(training_file_names) + audio_train_list = [librosa.load(file, sr=sr)[0] for file in training_file_names] + recognized_word_index = recognize_speech(audio_query, audio_train_list, sr) + print(f'Recognized word: {recognized_word_index}') + return recognized_word_index + +print(get_grade()) \ No newline at end of file diff --git a/code/backend_reconnaissance/manager.py b/code/backend_reconnaissance/manager.py index 3858b49..1ef1abb 100644 --- a/code/backend_reconnaissance/manager.py +++ b/code/backend_reconnaissance/manager.py @@ -1,4 +1,5 @@ from hand_detector import HandDetector +from audio_detector import get_grade from network import WebsocketServer import time @@ -6,11 +7,13 @@ import time class Manager(): def __init__(self): self.state = 0 - self.avis = { + self.defualtAvis = { "note": None, "commentaire": None, "notes_autres": {} } + + self.avis = self.defualtAvis self.server = WebsocketServer(None) self.server.start() self.handDetector = HandDetector() @@ -23,15 +26,29 @@ class Manager(): self.sleep() if(self.state == 1): self.camera() - + if(self.state == 2): + self.audio() + if(self.state == 3): + self.thankYou() time.sleep(0.01) #Fonction qui est executée pendant que la borne est en veille, reveille la borne si une main est detectée def sleep(self): res = self.handDetector.detect() + print(res) if(res != False): self.state = 1 self.server.sendMessage({"type": "state", "state": 1}) + + def audio(self): + grade = get_grade() + if(grade != False): + self.server.sendMessage({"type":"new_grade","grade":grade}) + self.avis["notes_autres"]["test"] = grade + time.sleep(3) + self.state = 2 + self.server.sendMessage({"type": "state", "state": 3}) + #Envoie la position de la main a l'écran et passe a l'étape suivante si une main est detectée pendant assez longtemps def camera(self): @@ -44,5 +61,10 @@ class Manager(): self.state = 2 self.server.sendMessage({"type": "state", "state": 2}) - + def thankYou(self): + time.sleep(10) + self.state = 0 + self.server.sendMessage({"type": "state", "state": 0}) + self.sendReview() + self.avis = self.defualtAvis diff --git a/code/backend_reconnaissance/network.py b/code/backend_reconnaissance/network.py index 5a28fee..7e064d7 100644 --- a/code/backend_reconnaissance/network.py +++ b/code/backend_reconnaissance/network.py @@ -28,4 +28,10 @@ class WebsocketServer(threading.Thread): await asyncio.sleep(0.01) def sendMessage(self,message): - self.messageQueue.append(message) \ No newline at end of file + self.messageQueue.append(message) + +class ApiClient(): + def __init__(self, host=os.getenv("API_HOST"), port=os.getenv("API_PORT")): + self.host = host + self.port = port + \ No newline at end of file diff --git a/code/backend_reconnaissance/recording.wav b/code/backend_reconnaissance/recording.wav new file mode 100644 index 0000000..54cb2a8 Binary files /dev/null and b/code/backend_reconnaissance/recording.wav differ diff --git a/code/backend_reconnaissance/requirements.txt b/code/backend_reconnaissance/requirements.txt index 6319855..18cb6b8 100644 --- a/code/backend_reconnaissance/requirements.txt +++ b/code/backend_reconnaissance/requirements.txt @@ -2,4 +2,7 @@ websockets requests opencv-python mediapipe -numpy \ No newline at end of file +numpy +pyaudio +librosa +scipy \ No newline at end of file diff --git a/code/docker-compose.yaml b/code/docker-compose.yaml index 24c3b8a..380dc81 100644 --- a/code/docker-compose.yaml +++ b/code/docker-compose.yaml @@ -39,6 +39,8 @@ services: #API de gestion des avis, permet d'ajouter ou de récuperer des avis ou les stats sur les avis par des requêtes HTTP reviews_api: container_name: reviews_api + expose: + - 8080 ports: - 8080:8080 environment: @@ -73,11 +75,11 @@ services: - 800:80 #Formulaire de retour d'avis - Formulaire: + formulaire: image: httpd:latest volumes: - - ./Formulaire:/usr/local/apache2/htdocs/ - container_name: Formulaire + - ./formulaire:/usr/local/apache2/htdocs/ + container_name: formulaire ports: - 80:80 # #Backend de la borne : scripts pythons de reconnaissances video et audio @@ -92,6 +94,8 @@ services: environment: - PORT=5000 - HOST=backend_reconnaissance + - API_HOST=reviews_api + - API_PORT=8080 ports: #Ce container est le serveur websocker dont le client est l'interface de la borne qui tourne dans le navigateur - 5000:5000 diff --git a/code/interface_borne/assets/css/main.css b/code/interface_borne/assets/css/main.css index 0447ff1..b06600b 100644 --- a/code/interface_borne/assets/css/main.css +++ b/code/interface_borne/assets/css/main.css @@ -48,4 +48,9 @@ html, body { .instructions > .title { border-bottom: 3px #6B8000 solid; +} + +.instructions > table, .instructions > th,.instructions > td { + border: 1px solid #6B8000; + border-collapse: collapse; } \ No newline at end of file diff --git a/code/interface_borne/assets/js/audio_page.js b/code/interface_borne/assets/js/audio_page.js index df56436..4ba14a0 100644 --- a/code/interface_borne/assets/js/audio_page.js +++ b/code/interface_borne/assets/js/audio_page.js @@ -8,4 +8,10 @@ class AudioPage { this.isEnabled = isEnabled; this.DOMElement.style.display = isEnabled ? "block" : "none"; } + + setGrade(grade) { + if(this.isEnabled) { + this.DOMElement.getElementById("grade").innerHTML = grade.toString(); + } + } } \ No newline at end of file diff --git a/code/interface_borne/assets/js/network.js b/code/interface_borne/assets/js/network.js index 1ebcdcd..6f37721 100644 --- a/code/interface_borne/assets/js/network.js +++ b/code/interface_borne/assets/js/network.js @@ -1,5 +1,5 @@ class WebsocketClient { - constructor(onNewEffects, onNewGrade, onNewState) { + constructor(onNewEffects, onNewState, onNewGrade) { this.socket = new WebSocket("ws://localhost:5000"); this.socket.addEventListener("open", (event) => { this.socket.send("connected"); diff --git a/code/interface_borne/assets/js/state_manager.js b/code/interface_borne/assets/js/state_manager.js index 9ce0546..3145f88 100644 --- a/code/interface_borne/assets/js/state_manager.js +++ b/code/interface_borne/assets/js/state_manager.js @@ -18,7 +18,8 @@ class StateManager { this.setState(STATE.video); this._cameraPage.setEffects(effects) }, - (state) => this.setState(state) + (state) => this.setState(state), + (grade) => this._audioPage.setGrade(grade) ); this._sleepingPage.enabled = true; diff --git a/code/interface_borne/index.html b/code/interface_borne/index.html index a2122e0..fc985bb 100644 --- a/code/interface_borne/index.html +++ b/code/interface_borne/index.html @@ -35,7 +35,7 @@

Enregistrement audio blabal

-

Prononcez à voix haute les notes correspondant aux critères suivants dans l'ordre

+

Donnez une note sur 10 au critère suivant

- +
Critère @@ -43,7 +43,7 @@
Calme /10 /10
diff --git a/pyzo.exe.lnk b/pyzo.exe.lnk deleted file mode 100644 index 143a7e9..0000000 Binary files a/pyzo.exe.lnk and /dev/null differ