Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
2
2023-029
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
2023-029
2023-029
Commits
7ac13eb2
Commit
7ac13eb2
authored
Sep 06, 2023
by
Ridma Dilshan
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fix the Update All of my parts
parent
e9f16236
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
582 additions
and
35 deletions
+582
-35
Project/Backend/Server_Python/app.log
Project/Backend/Server_Python/app.log
+160
-0
Project/Backend/Server_Python/controllers/video_detect_controler.py
...ckend/Server_Python/controllers/video_detect_controler.py
+1
-1
Project/Backend/Server_Python/services/video_detection_service.py
...Backend/Server_Python/services/video_detection_service.py
+21
-1
Project/Frontend/SignConnectPlus/src/pages/emotion-detection/emotion-audio-detection/list/list.tsx
...s/emotion-detection/emotion-audio-detection/list/list.tsx
+144
-7
Project/Frontend/SignConnectPlus/src/pages/emotion-detection/emotion-video-detection/list/list.tsx
...s/emotion-detection/emotion-video-detection/list/list.tsx
+215
-25
Project/Frontend/SignConnectPlus/src/pages/services/AudioEmotionDetection.js
...gnConnectPlus/src/pages/services/AudioEmotionDetection.js
+13
-0
Project/Frontend/SignConnectPlus/src/pages/services/VideoEmotionDetection.js
...gnConnectPlus/src/pages/services/VideoEmotionDetection.js
+13
-0
Project/Frontend/SignConnectPlus/src/routes/MainRoutes.tsx
Project/Frontend/SignConnectPlus/src/routes/MainRoutes.tsx
+2
-1
Project/Frontend/SignConnectPlus/src/services/AudioEmotionDetection.js
...end/SignConnectPlus/src/services/AudioEmotionDetection.js
+13
-0
No files found.
Project/Backend/Server_Python/app.log
View file @
7ac13eb2
...
@@ -297,3 +297,163 @@
...
@@ -297,3 +297,163 @@
2023-09-04 19:46:11,290 - INFO - Error.
2023-09-04 19:46:11,290 - INFO - Error.
2023-09-04 19:46:11,290 - INFO - Error.
2023-09-04 19:46:11,290 - INFO - Error.
2023-09-04 19:46:11,290 - INFO - Error.
2023-09-04 19:46:11,290 - INFO - Error.
2023-09-06 13:23:22,433 - ERROR - Failed to make predictions.
2023-09-06 13:23:22,433 - ERROR - Failed to make predictions.
2023-09-06 13:23:22,433 - ERROR - Failed to make predictions.
2023-09-06 13:23:22,433 - ERROR - Failed to make predictions.
2023-09-06 13:23:22,433 - ERROR - Failed to make predictions.
2023-09-06 13:23:22,433 - ERROR - Failed to make predictions.
2023-09-06 13:23:22,433 - ERROR - Failed to make predictions.
2023-09-06 13:23:22,433 - ERROR - Failed to make predictions.
2023-09-06 13:23:22,751 - INFO - Error.
2023-09-06 13:23:22,751 - INFO - Error.
2023-09-06 13:23:22,751 - INFO - Error.
2023-09-06 13:23:22,751 - INFO - Error.
2023-09-06 13:23:22,751 - INFO - Error.
2023-09-06 13:23:22,751 - INFO - Error.
2023-09-06 13:23:22,751 - INFO - Error.
2023-09-06 13:23:22,751 - INFO - Error.
2023-09-06 13:23:30,780 - ERROR - Failed to make predictions.
2023-09-06 13:23:30,780 - ERROR - Failed to make predictions.
2023-09-06 13:23:30,780 - ERROR - Failed to make predictions.
2023-09-06 13:23:30,780 - ERROR - Failed to make predictions.
2023-09-06 13:23:30,780 - ERROR - Failed to make predictions.
2023-09-06 13:23:30,780 - ERROR - Failed to make predictions.
2023-09-06 13:23:30,780 - ERROR - Failed to make predictions.
2023-09-06 13:23:30,780 - ERROR - Failed to make predictions.
2023-09-06 13:23:30,783 - INFO - Error.
2023-09-06 13:23:30,783 - INFO - Error.
2023-09-06 13:23:30,783 - INFO - Error.
2023-09-06 13:23:30,783 - INFO - Error.
2023-09-06 13:23:30,783 - INFO - Error.
2023-09-06 13:23:30,783 - INFO - Error.
2023-09-06 13:23:30,783 - INFO - Error.
2023-09-06 13:23:30,783 - INFO - Error.
2023-09-06 13:25:05,906 - ERROR - Failed to make predictions.
2023-09-06 13:25:05,906 - ERROR - Failed to make predictions.
2023-09-06 13:25:05,906 - ERROR - Failed to make predictions.
2023-09-06 13:25:05,906 - ERROR - Failed to make predictions.
2023-09-06 13:25:05,906 - ERROR - Failed to make predictions.
2023-09-06 13:25:05,906 - ERROR - Failed to make predictions.
2023-09-06 13:25:05,906 - ERROR - Failed to make predictions.
2023-09-06 13:25:05,906 - ERROR - Failed to make predictions.
2023-09-06 13:25:05,909 - INFO - Error.
2023-09-06 13:25:05,909 - INFO - Error.
2023-09-06 13:25:05,909 - INFO - Error.
2023-09-06 13:25:05,909 - INFO - Error.
2023-09-06 13:25:05,909 - INFO - Error.
2023-09-06 13:25:05,909 - INFO - Error.
2023-09-06 13:25:05,909 - INFO - Error.
2023-09-06 13:25:05,909 - INFO - Error.
2023-09-06 13:29:28,237 - ERROR - Failed to make predictions.
2023-09-06 13:29:28,237 - ERROR - Failed to make predictions.
2023-09-06 13:29:28,237 - ERROR - Failed to make predictions.
2023-09-06 13:29:28,237 - ERROR - Failed to make predictions.
2023-09-06 13:29:28,237 - ERROR - Failed to make predictions.
2023-09-06 13:29:28,237 - ERROR - Failed to make predictions.
2023-09-06 13:29:28,237 - ERROR - Failed to make predictions.
2023-09-06 13:29:28,237 - ERROR - Failed to make predictions.
2023-09-06 13:29:28,238 - INFO - Error.
2023-09-06 13:29:28,238 - INFO - Error.
2023-09-06 13:29:28,238 - INFO - Error.
2023-09-06 13:29:28,238 - INFO - Error.
2023-09-06 13:29:28,238 - INFO - Error.
2023-09-06 13:29:28,238 - INFO - Error.
2023-09-06 13:29:28,238 - INFO - Error.
2023-09-06 13:29:28,238 - INFO - Error.
2023-09-06 13:30:50,568 - ERROR - Failed to make predictions.
2023-09-06 13:30:50,568 - ERROR - Failed to make predictions.
2023-09-06 13:30:50,568 - ERROR - Failed to make predictions.
2023-09-06 13:30:50,568 - ERROR - Failed to make predictions.
2023-09-06 13:30:50,568 - ERROR - Failed to make predictions.
2023-09-06 13:30:50,568 - ERROR - Failed to make predictions.
2023-09-06 13:30:50,568 - ERROR - Failed to make predictions.
2023-09-06 13:30:50,568 - ERROR - Failed to make predictions.
2023-09-06 13:30:50,571 - INFO - Error.
2023-09-06 13:30:50,571 - INFO - Error.
2023-09-06 13:30:50,571 - INFO - Error.
2023-09-06 13:30:50,571 - INFO - Error.
2023-09-06 13:30:50,571 - INFO - Error.
2023-09-06 13:30:50,571 - INFO - Error.
2023-09-06 13:30:50,571 - INFO - Error.
2023-09-06 13:30:50,571 - INFO - Error.
2023-09-06 13:30:56,845 - ERROR - Failed to make predictions.
2023-09-06 13:30:56,845 - ERROR - Failed to make predictions.
2023-09-06 13:30:56,845 - ERROR - Failed to make predictions.
2023-09-06 13:30:56,845 - ERROR - Failed to make predictions.
2023-09-06 13:30:56,845 - ERROR - Failed to make predictions.
2023-09-06 13:30:56,845 - ERROR - Failed to make predictions.
2023-09-06 13:30:56,845 - ERROR - Failed to make predictions.
2023-09-06 13:30:56,845 - ERROR - Failed to make predictions.
2023-09-06 13:30:56,847 - INFO - Error.
2023-09-06 13:30:56,847 - INFO - Error.
2023-09-06 13:30:56,847 - INFO - Error.
2023-09-06 13:30:56,847 - INFO - Error.
2023-09-06 13:30:56,847 - INFO - Error.
2023-09-06 13:30:56,847 - INFO - Error.
2023-09-06 13:30:56,847 - INFO - Error.
2023-09-06 13:30:56,847 - INFO - Error.
2023-09-06 14:46:08,227 - ERROR - Failed to make predictions.
2023-09-06 14:46:08,227 - ERROR - Failed to make predictions.
2023-09-06 14:46:08,227 - ERROR - Failed to make predictions.
2023-09-06 14:46:08,227 - ERROR - Failed to make predictions.
2023-09-06 14:46:08,227 - ERROR - Failed to make predictions.
2023-09-06 14:46:08,227 - ERROR - Failed to make predictions.
2023-09-06 14:46:08,227 - ERROR - Failed to make predictions.
2023-09-06 14:46:08,227 - ERROR - Failed to make predictions.
2023-09-06 14:46:08,337 - INFO - Error.
2023-09-06 14:46:08,337 - INFO - Error.
2023-09-06 14:46:08,337 - INFO - Error.
2023-09-06 14:46:08,337 - INFO - Error.
2023-09-06 14:46:08,337 - INFO - Error.
2023-09-06 14:46:08,337 - INFO - Error.
2023-09-06 14:46:08,337 - INFO - Error.
2023-09-06 14:46:08,337 - INFO - Error.
2023-09-06 14:46:12,808 - ERROR - Failed to make predictions.
2023-09-06 14:46:12,808 - ERROR - Failed to make predictions.
2023-09-06 14:46:12,808 - ERROR - Failed to make predictions.
2023-09-06 14:46:12,808 - ERROR - Failed to make predictions.
2023-09-06 14:46:12,808 - ERROR - Failed to make predictions.
2023-09-06 14:46:12,808 - ERROR - Failed to make predictions.
2023-09-06 14:46:12,808 - ERROR - Failed to make predictions.
2023-09-06 14:46:12,808 - ERROR - Failed to make predictions.
2023-09-06 14:46:12,811 - INFO - Error.
2023-09-06 14:46:12,811 - INFO - Error.
2023-09-06 14:46:12,811 - INFO - Error.
2023-09-06 14:46:12,811 - INFO - Error.
2023-09-06 14:46:12,811 - INFO - Error.
2023-09-06 14:46:12,811 - INFO - Error.
2023-09-06 14:46:12,811 - INFO - Error.
2023-09-06 14:46:12,811 - INFO - Error.
2023-09-06 14:48:19,677 - ERROR - Failed to make predictions.
2023-09-06 14:48:19,677 - ERROR - Failed to make predictions.
2023-09-06 14:48:19,677 - ERROR - Failed to make predictions.
2023-09-06 14:48:19,677 - ERROR - Failed to make predictions.
2023-09-06 14:48:19,677 - ERROR - Failed to make predictions.
2023-09-06 14:48:19,677 - ERROR - Failed to make predictions.
2023-09-06 14:48:19,677 - ERROR - Failed to make predictions.
2023-09-06 14:48:19,677 - ERROR - Failed to make predictions.
2023-09-06 14:48:19,681 - INFO - Error.
2023-09-06 14:48:19,681 - INFO - Error.
2023-09-06 14:48:19,681 - INFO - Error.
2023-09-06 14:48:19,681 - INFO - Error.
2023-09-06 14:48:19,681 - INFO - Error.
2023-09-06 14:48:19,681 - INFO - Error.
2023-09-06 14:48:19,681 - INFO - Error.
2023-09-06 14:48:19,681 - INFO - Error.
2023-09-06 14:48:25,483 - ERROR - Failed to make predictions.
2023-09-06 14:48:25,483 - ERROR - Failed to make predictions.
2023-09-06 14:48:25,483 - ERROR - Failed to make predictions.
2023-09-06 14:48:25,483 - ERROR - Failed to make predictions.
2023-09-06 14:48:25,483 - ERROR - Failed to make predictions.
2023-09-06 14:48:25,483 - ERROR - Failed to make predictions.
2023-09-06 14:48:25,483 - ERROR - Failed to make predictions.
2023-09-06 14:48:25,483 - ERROR - Failed to make predictions.
2023-09-06 14:48:25,486 - INFO - Error.
2023-09-06 14:48:25,486 - INFO - Error.
2023-09-06 14:48:25,486 - INFO - Error.
2023-09-06 14:48:25,486 - INFO - Error.
2023-09-06 14:48:25,486 - INFO - Error.
2023-09-06 14:48:25,486 - INFO - Error.
2023-09-06 14:48:25,486 - INFO - Error.
2023-09-06 14:48:25,486 - INFO - Error.
Project/Backend/Server_Python/controllers/video_detect_controler.py
View file @
7ac13eb2
...
@@ -37,7 +37,7 @@ async def upload_video(video: UploadFile = File(...)):
...
@@ -37,7 +37,7 @@ async def upload_video(video: UploadFile = File(...)):
with
open
(
file_location
,
"wb"
)
as
file
:
with
open
(
file_location
,
"wb"
)
as
file
:
file
.
write
(
video
.
file
.
read
())
file
.
write
(
video
.
file
.
read
())
return
{
"text"
:
"
OK2
"
}
return
{
"text"
:
"
Video Upload Successfully
"
}
except
Exception
as
e
:
except
Exception
as
e
:
logger
.
info
(
f
"Failed to upload file. {e}"
)
logger
.
info
(
f
"Failed to upload file. {e}"
)
raise
HTTPException
(
raise
HTTPException
(
...
...
Project/Backend/Server_Python/services/video_detection_service.py
View file @
7ac13eb2
...
@@ -24,6 +24,7 @@ emotion_model.load_weights("../ML_Models/Emotion_Detection_Model/emotion_model.h
...
@@ -24,6 +24,7 @@ emotion_model.load_weights("../ML_Models/Emotion_Detection_Model/emotion_model.h
class
EmotionPredictionService
:
class
EmotionPredictionService
:
def
__init__
(
self
,
model
):
def
__init__
(
self
,
model
):
self
.
model
=
model
self
.
model
=
model
self
.
current_emotion
=
None
def
predict_emotion_detection_video
(
video_request
:
UploadFile
)
->
Dict
[
str
,
str
]:
def
predict_emotion_detection_video
(
video_request
:
UploadFile
)
->
Dict
[
str
,
str
]:
try
:
try
:
...
@@ -85,7 +86,26 @@ class EmotionPredictionService:
...
@@ -85,7 +86,26 @@ class EmotionPredictionService:
break
break
emotions
=
predict_emotion_from_frame
(
frame
)
emotions
=
predict_emotion_from_frame
(
frame
)
predicted_emotions
.
extend
(
emotions
)
if
emotions
:
new_emotion
=
emotions
[
0
]
# Assuming you only process one face at a time
cv2
.
putText
(
frame
,
f
"Emotion: {new_emotion}"
,
(
10
,
30
),
cv2
.
FONT_HERSHEY_SIMPLEX
,
1
,
(
0
,
0
,
255
),
2
)
if
new_emotion
!=
self
.
current_emotion
:
self
.
current_emotion
=
new_emotion
predicted_emotions
.
append
(
new_emotion
)
# Display the frame with emotion prediction
cv2
.
imshow
(
'Emotion Detection'
,
frame
)
if
cv2
.
waitKey
(
1
)
&
0xFF
==
ord
(
'q'
):
break
# while True:
# ret, frame = cap.read()
# if not ret:
# break
# emotions = predict_emotion_from_frame(frame)
# predicted_emotions.extend(emotions)
cap
.
release
()
cap
.
release
()
os
.
remove
(
video_location
)
os
.
remove
(
video_location
)
...
...
Project/Frontend/SignConnectPlus/src/pages/emotion-detection/emotion-audio-detection/list/list.tsx
View file @
7ac13eb2
...
@@ -6,11 +6,37 @@ import Button from '@mui/material/Button';
...
@@ -6,11 +6,37 @@ import Button from '@mui/material/Button';
import
UploadOutlined
from
'
@ant-design/icons/lib/icons/UploadOutlined
'
;
import
UploadOutlined
from
'
@ant-design/icons/lib/icons/UploadOutlined
'
;
import
AudioOutlined
from
'
@ant-design/icons/lib/icons/AudioOutlined
'
;
import
AudioOutlined
from
'
@ant-design/icons/lib/icons/AudioOutlined
'
;
import
{
Link
}
from
'
react-router-dom
'
;
import
{
Box
,
Stack
,
}
from
'
@mui/material
'
;
import
{
APP_DEFAULT_PATH
}
from
'
config
'
;
import
construction
from
'
assets/images/maintenance/under-construction.svg
'
;
import
{
CardContent
,
IconButton
,
InputAdornment
,
Paper
,
TextField
,
Typography
}
from
'
@mui/material
'
;
import
CopyOutlined
from
'
@ant-design/icons/lib/icons/CopyOutlined
'
;
import
AudioEmotionDetectService
from
'
../../../services/AudioEmotionDetection.js
'
;
import
{
MuiFileInput
}
from
'
mui-file-input
'
;
import
{
useSnackbar
}
from
'
notistack
'
;
const
List
=
()
=>
{
const
List
=
()
=>
{
const
[
audioBlob
,
setAudioBlob
]
=
useState
<
Blob
|
undefined
>
(
undefined
);
const
[
audioBlob
,
setAudioBlob
]
=
useState
<
Blob
|
undefined
>
(
undefined
);
const
[
mediaRecorder
,
setMediaRecorder
]
=
useState
<
MediaRecorder
|
undefined
>
(
undefined
);
const
[
mediaRecorder
,
setMediaRecorder
]
=
useState
<
MediaRecorder
|
undefined
>
(
undefined
);
const
[
isRecording
,
setIsRecording
]
=
useState
<
boolean
>
(
false
);
const
[
isRecording
,
setIsRecording
]
=
useState
<
boolean
>
(
false
);
const
[
audioUrl
,
setAudioUrl
]
=
useState
<
string
|
undefined
>
(
undefined
);
const
[
audioUrl
,
setAudioUrl
]
=
useState
<
string
|
undefined
>
(
undefined
);
const
[
value
,
setValue
]
=
useState
(
''
);
const
[
file
,
setFile
]
=
useState
<
File
|
string
|
null
>
(
null
);
const
[
loading
,
setLoading
]
=
useState
(
false
);
const
[
isUploadFile
,
setIsUploadFile
]
=
useState
<
boolean
|
string
|
null
>
(
true
);
const
handleDropSingleFile
=
(
files
:
any
)
=>
{
if
(
files
)
{
setFile
(
Object
.
assign
(
files
,
{
preview
:
URL
.
createObjectURL
(
files
)
})
);
setAudioUrl
(
URL
.
createObjectURL
(
files
));
}
};
const
handleRecordStart
=
async
()
=>
{
const
handleRecordStart
=
async
()
=>
{
// Clear the uploaded audio state when recording starts
// Clear the uploaded audio state when recording starts
...
@@ -54,6 +80,53 @@ const List = () => {
...
@@ -54,6 +80,53 @@ const List = () => {
// Handle case where uploaded file is not an audio file
// Handle case where uploaded file is not an audio file
}
}
};
};
const
{
enqueueSnackbar
}
=
useSnackbar
();
const
handleChange
=
(
event
:
React
.
ChangeEvent
<
HTMLTextAreaElement
>
)
=>
{
setValue
(
event
.
target
.
value
);
};
const
onCopy
=
(
text
:
string
)
=>
{
if
(
text
)
{
navigator
.
clipboard
.
writeText
(
text
);
enqueueSnackbar
(
'
Copied!
'
,
{
variant
:
'
success
'
});
}
};
// Audio Upload
const
predictEmotionFromAudio
=
async
()
=>
{
console
.
log
(
"
OK75
"
)
console
.
log
(
file
);
if
(
file
)
{
setLoading
(
true
);
const
formData
=
new
FormData
();
//@ts-ignore
formData
.
append
(
'
audio_request
'
,
file
,
file
.
name
);
try
{
const
response
=
await
AudioEmotionDetectService
.
predictEmotionAudio
(
formData
);
if
(
response
.
status
==
200
)
{
console
.
log
(
response
.
data
);
setValue
(
response
.
data
.
predicted_emotion
);
}
else
{
enqueueSnackbar
(
'
Something went Wrong!
'
,
{
variant
:
'
error
'
});
}
setLoading
(
false
);
}
catch
(
error
)
{
console
.
log
(
error
);
setLoading
(
false
);
enqueueSnackbar
(
'
Something went Wrong!
'
,
{
variant
:
'
error
'
});
}
}
else
{
enqueueSnackbar
(
'
Please select a file.
'
,
{
variant
:
'
warning
'
});
}
};
const
checkEmotionUpload
=
()
=>
{
if
(
isUploadFile
)
{
return
'
contained
'
;
}
else
{
return
'
outlined
'
;
}
};
return
(
return
(
<
MainCard
content=
{
false
}
>
<
MainCard
content=
{
false
}
>
...
@@ -65,17 +138,20 @@ const List = () => {
...
@@ -65,17 +138,20 @@ const List = () => {
<
div
style=
{
{
textAlign
:
'
center
'
}
}
>
<
div
style=
{
{
textAlign
:
'
center
'
}
}
>
<
input
<
input
type=
"file"
type=
"file"
accept=
"audio/*"
onChange=
{
handleUpload
}
onChange=
{
handleUpload
}
style=
{
{
display
:
'
none
'
}
}
style=
{
{
display
:
'
none
'
}
}
id=
"audio-upload"
id=
"audio-upload"
/>
/>
<
label
htmlFor=
"audio-upload"
>
<
label
htmlFor=
"audio-upload"
>
<
Button
<
Button
variant=
"contained"
// variant="contained"
variant=
{
checkEmotionUpload
()
}
color=
"primary"
color=
"primary"
component=
"span"
component=
"span"
startIcon=
{
<
UploadOutlined
/>
}
startIcon=
{
<
UploadOutlined
/>
}
onClick=
{
()
=>
{
setIsUploadFile
(
true
);
}
}
>
>
Upload
Upload
</
Button
>
</
Button
>
...
@@ -88,6 +164,49 @@ const List = () => {
...
@@ -88,6 +164,49 @@ const List = () => {
>
>
{
isRecording
?
'
Stop Recording
'
:
'
Record
'
}
{
isRecording
?
'
Stop Recording
'
:
'
Record
'
}
</
Button
>
</
Button
>
<
Button
variant=
"contained"
disabled=
{
loading
}
onClick=
{
()
=>
{
predictEmotionFromAudio
();
}
}
>
Prediction
</
Button
>
<
div
>
<
Typography
variant=
"overline"
sx=
{
{
color
:
'
text.secondary
'
}
}
>
Predict Emotion
</
Typography
>
<
TextField
fullWidth
value=
{
value
}
onChange=
{
handleChange
}
InputProps=
{
{
endAdornment
:
(
<
InputAdornment
position=
"end"
>
<
IconButton
onClick=
{
()
=>
onCopy
(
value
)
}
>
<
CopyOutlined
/>
</
IconButton
>
</
InputAdornment
>
)
}
}
/>
</
div
>
<
CardContent
>
{
/* ! Important */
}
{
/* @ts-ignore */
}
<
MuiFileInput
value=
{
file
}
onChange=
{
handleDropSingleFile
}
inputProps=
{
{
accept
:
'
audio/*
'
}
}
/>
<
Paper
style=
{
{
padding
:
'
20px
'
,
marginTop
:
'
15px
'
}
}
>
<
Typography
variant=
"h5"
align=
"center"
gutterBottom
>
Preview
</
Typography
>
<
div
style=
{
{
marginTop
:
'
20px
'
,
textAlign
:
'
center
'
}
}
>
{
file
?
<
video
src=
{
audioUrl
}
width=
"400"
controls
/>
:
<
p
>
No Audio Selected ...
</
p
>
}
</
div
>
</
Paper
>
</
CardContent
>
{
audioBlob
&&
(
{
audioBlob
&&
(
<
audio
controls
>
<
audio
controls
>
<
source
src=
{
URL
.
createObjectURL
(
audioBlob
)
}
type=
"audio/wav"
/>
<
source
src=
{
URL
.
createObjectURL
(
audioBlob
)
}
type=
"audio/wav"
/>
...
@@ -104,12 +223,30 @@ const List = () => {
...
@@ -104,12 +223,30 @@ const List = () => {
</
MainCard
>
</
MainCard
>
</
Grid
>
</
Grid
>
<
Grid
item
xs=
{
12
}
md=
{
6
}
>
<
Grid
item
xs=
{
12
}
md=
{
6
}
>
<
h2
>
3D Avatar
</
h2
>
<
h2
>
3D Avatar
</
h2
>
<
MainCard
>
<
MainCard
>
{
/* Content of the second card */
}
<
Grid
container
spacing=
{
4
}
direction=
"column"
alignItems=
"center"
justifyContent=
"center"
sx=
{
{
minHeight
:
'
100vh
'
,
py
:
2
}
}
>
{
/* You can put your 3D avatar components here */
}
<
Grid
item
xs=
{
12
}
>
</
MainCard
>
<
Box
sx=
{
{
width
:
{
xs
:
300
,
sm
:
480
}
}
}
>
<
img
src=
{
construction
}
alt=
"mantis"
style=
{
{
width
:
'
100%
'
,
height
:
'
auto
'
}
}
/>
</
Box
>
</
Grid
>
<
Grid
item
xs=
{
12
}
>
<
Stack
spacing=
{
2
}
justifyContent=
"center"
alignItems=
"center"
>
<
Typography
align=
"center"
variant=
"h1"
>
Under Construction
</
Typography
>
<
Typography
color=
"textSecondary"
align=
"center"
sx=
{
{
width
:
'
85%
'
}
}
>
Hey! Please check out this site later. We are doing some maintenance on it right now.
</
Typography
>
<
Button
component=
{
Link
}
to=
{
APP_DEFAULT_PATH
}
variant=
"contained"
>
Back To Home
</
Button
>
</
Stack
>
</
Grid
>
</
Grid
>
</
Grid
>
</
MainCard
>
</
Grid
>
</
Grid
>
</
Grid
>
</
ScrollX
>
</
ScrollX
>
</
MainCard
>
</
MainCard
>
...
...
Project/Frontend/SignConnectPlus/src/pages/emotion-detection/emotion-video-detection/list/list.tsx
View file @
7ac13eb2
...
@@ -5,14 +5,44 @@ import Grid from '@mui/material/Grid';
...
@@ -5,14 +5,44 @@ import Grid from '@mui/material/Grid';
import
Button
from
'
@mui/material/Button
'
;
import
Button
from
'
@mui/material/Button
'
;
import
VideoCameraOutlined
from
'
@ant-design/icons/lib/icons/VideoCameraOutlined
'
;
import
VideoCameraOutlined
from
'
@ant-design/icons/lib/icons/VideoCameraOutlined
'
;
import
UploadOutlined
from
'
@ant-design/icons/lib/icons/UploadOutlined
'
;
import
UploadOutlined
from
'
@ant-design/icons/lib/icons/UploadOutlined
'
;
// import WebcamOutlinedIcon from '@mui/icons-material/WebcamOutlined';
import
{
Link
}
from
'
react-router-dom
'
;
import
{
Box
,
Stack
,
}
from
'
@mui/material
'
;
import
{
APP_DEFAULT_PATH
}
from
'
config
'
;
import
construction
from
'
assets/images/maintenance/under-construction.svg
'
;
import
{
CardContent
,
IconButton
,
InputAdornment
,
Paper
,
TextField
,
Typography
}
from
'
@mui/material
'
;
import
CopyOutlined
from
'
@ant-design/icons/lib/icons/CopyOutlined
'
;
import
VideoEmotionDetectService
from
'
../../../services/VideoEmotionDetection.js
'
;
import
{
MuiFileInput
}
from
'
mui-file-input
'
;
import
{
useSnackbar
}
from
'
notistack
'
;
const
List
=
()
=>
{
const
List
=
()
=>
{
const
[
selectedFile
,
setSelectedFile
]
=
useState
<
File
|
null
>
(
null
);
const
[
selectedFile
,
setSelectedFile
]
=
useState
<
File
|
null
>
(
null
);
const
[
isLive
,
setIsLive
]
=
useState
(
false
);
const
[
isLive
]
=
useState
(
false
);
const
fileInputRef
=
useRef
<
HTMLInputElement
|
null
>
(
null
);
const
fileInputRef
=
useRef
<
HTMLInputElement
|
null
>
(
null
);
const
videoRef
=
useRef
<
HTMLVideoElement
|
null
>
(
null
);
const
videoRef
=
useRef
<
HTMLVideoElement
|
null
>
(
null
);
const
[
videoUrl
,
setVideoUrl
]
=
useState
<
string
|
undefined
>
(
undefined
);
const
[
file
,
setFile
]
=
useState
<
File
|
string
|
null
>
(
null
);
const
[
loading
,
setLoading
]
=
useState
(
false
);
const
[
isUploadFile
,
setIsUploadFile
]
=
useState
<
boolean
|
string
|
null
>
(
true
);
const
[
value
,
setValue
]
=
useState
(
''
);
const
[
mediaStream
,
setMediaStream
]
=
useState
<
MediaStream
|
null
>
(
null
);
const
[
mediaRecorder
,
setMediaRecorder
]
=
useState
<
MediaRecorder
|
null
>
(
null
);
const
[
chunks
,
setChunks
]
=
useState
<
Blob
[]
>
([]);
const
[
isRecording
,
setIsRecording
]
=
useState
(
false
);
const
{
enqueueSnackbar
}
=
useSnackbar
();
const
handleDropSingleFile
=
(
files
:
any
)
=>
{
if
(
files
)
{
setFile
(
Object
.
assign
(
files
,
{
preview
:
URL
.
createObjectURL
(
files
)
})
);
setVideoUrl
(
URL
.
createObjectURL
(
files
));
}
};
const
handleFileChange
=
(
event
:
React
.
ChangeEvent
<
HTMLInputElement
>
)
=>
{
const
handleFileChange
=
(
event
:
React
.
ChangeEvent
<
HTMLInputElement
>
)
=>
{
if
(
event
.
target
.
files
&&
event
.
target
.
files
[
0
])
{
if
(
event
.
target
.
files
&&
event
.
target
.
files
[
0
])
{
...
@@ -20,33 +50,108 @@ const List = () => {
...
@@ -20,33 +50,108 @@ const List = () => {
}
}
};
};
const
handleUploadButtonClick
=
()
=>
{
if
(
fileInputRef
.
current
)
{
fileInputRef
.
current
.
click
();
}
};
const
handleLiveButtonClick
=
async
()
=>
{
const
handleLiveButtonClick
=
async
()
=>
{
try
{
try
{
const
stream
=
await
navigator
.
mediaDevices
.
getUserMedia
({
video
:
true
});
if
(
!
isRecording
)
{
if
(
videoRef
.
current
)
{
const
stream
=
await
navigator
.
mediaDevices
.
getUserMedia
({
video
:
true
});
videoRef
.
current
.
srcObject
=
stream
;
if
(
videoRef
.
current
)
{
videoRef
.
current
.
play
();
// Start playing the live camera feed
videoRef
.
current
.
srcObject
=
stream
;
videoRef
.
current
.
play
();
const
recorder
=
new
MediaRecorder
(
stream
);
recorder
.
ondataavailable
=
(
event
)
=>
{
if
(
event
.
data
.
size
>
0
)
{
setChunks
((
prevChunks
)
=>
[...
prevChunks
,
event
.
data
]);
}
};
setMediaStream
(
stream
);
setMediaRecorder
(
recorder
);
recorder
.
start
();
setIsRecording
(
true
);
}
}
else
{
if
(
mediaRecorder
)
{
mediaRecorder
.
stop
();
if
(
mediaStream
)
{
mediaStream
.
getTracks
().
forEach
((
track
)
=>
track
.
stop
());
}
setIsRecording
(
false
);
}
}
}
setIsLive
(
true
);
}
catch
(
error
)
{
}
catch
(
error
)
{
console
.
error
(
'
Error accessing camera:
'
,
error
);
console
.
error
(
'
Error accessing camera:
'
,
error
);
}
}
};
};
const
handleChange
=
(
event
:
React
.
ChangeEvent
<
HTMLTextAreaElement
>
)
=>
{
setValue
(
event
.
target
.
value
);
};
const
onCopy
=
(
text
:
string
)
=>
{
if
(
text
)
{
navigator
.
clipboard
.
writeText
(
text
);
enqueueSnackbar
(
'
Copied!
'
,
{
variant
:
'
success
'
});
}
};
const
predictEmotionFromVideo
=
async
()
=>
{
console
.
log
(
"
OK75
"
)
console
.
log
(
file
);
if
(
file
)
{
setLoading
(
true
);
const
formData
=
new
FormData
();
//@ts-ignore
formData
.
append
(
'
video_request
'
,
file
,
file
.
name
);
try
{
const
response
=
await
VideoEmotionDetectService
.
predictEmotionVideo
(
formData
);
if
(
response
.
status
==
200
)
{
console
.
log
(
response
.
data
);
setValue
(
response
.
data
.
predicted_emotions
);
}
else
{
enqueueSnackbar
(
'
Something went Wrong!
'
,
{
variant
:
'
error
'
});
}
setLoading
(
false
);
}
catch
(
error
)
{
console
.
log
(
error
);
setLoading
(
false
);
enqueueSnackbar
(
'
Something went Wrong!
'
,
{
variant
:
'
error
'
});
}
}
else
{
enqueueSnackbar
(
'
Please select a file.
'
,
{
variant
:
'
warning
'
});
}
};
const
checkEmotionUpload
=
()
=>
{
if
(
isUploadFile
)
{
return
'
contained
'
;
}
else
{
return
'
outlined
'
;
}
};
const
createDownloadableVideo
=
()
=>
{
if
(
chunks
.
length
===
0
)
{
return
;
}
const
blob
=
new
Blob
(
chunks
,
{
type
:
'
video/webm
'
});
const
url
=
URL
.
createObjectURL
(
blob
);
const
a
=
document
.
createElement
(
'
a
'
);
a
.
style
.
display
=
'
none
'
;
a
.
href
=
url
;
a
.
download
=
'
recorded-video.webm
'
;
document
.
body
.
appendChild
(
a
);
a
.
click
();
window
.
URL
.
revokeObjectURL
(
url
);
};
return
(
return
(
<
MainCard
content=
{
false
}
>
<
MainCard
content=
{
false
}
>
<
ScrollX
>
<
ScrollX
>
<
Grid
container
spacing=
{
2
}
>
<
Grid
container
spacing=
{
2
}
>
<
Grid
item
xs=
{
12
}
md=
{
6
}
>
<
Grid
item
xs=
{
12
}
md=
{
6
}
>
<
h2
>
Upload or
Live
</
h2
>
<
h2
>
Upload or
Record
</
h2
>
<
MainCard
>
<
MainCard
>
<
div
style=
{
{
textAlign
:
'
center
'
}
}
>
<
div
style=
{
{
textAlign
:
'
center
'
}
}
>
...
@@ -73,31 +178,116 @@ const List = () => {
...
@@ -73,31 +178,116 @@ const List = () => {
/>
/>
)
)
)
}
)
}
<
Typography
variant=
"overline"
sx=
{
{
color
:
'
text.secondary
'
}
}
>
Predict Emotion
</
Typography
>
<
TextField
fullWidth
value=
{
value
}
onChange=
{
handleChange
}
InputProps=
{
{
endAdornment
:
(
<
InputAdornment
position=
"end"
>
<
IconButton
onClick=
{
()
=>
onCopy
(
value
)
}
>
<
CopyOutlined
/>
</
IconButton
>
</
InputAdornment
>
)
}
}
/>
</
div
>
<
CardContent
>
{
/* ! Important */
}
{
/* @ts-ignore */
}
<
MuiFileInput
value=
{
file
}
onChange=
{
handleDropSingleFile
}
inputProps=
{
{
accept
:
'
video/*
'
}
}
/>
<
Paper
style=
{
{
padding
:
'
20px
'
,
marginTop
:
'
15px
'
}
}
>
<
Typography
variant=
"h5"
align=
"center"
gutterBottom
>
Preview
</
Typography
>
<
div
style=
{
{
marginTop
:
'
20px
'
,
textAlign
:
'
center
'
}
}
>
{
file
?
<
video
src=
{
videoUrl
}
width=
"400"
controls
/>
:
<
p
>
No Video Selected ...
</
p
>
}
</
div
>
</
Paper
>
</
CardContent
>
<
Button
<
Button
variant=
"contained"
// variant="contained"
color=
"primary"
variant=
{
checkEmotionUpload
()
}
startIcon=
{
<
UploadOutlined
/>
}
color=
"primary"
onClick=
{
handleUploadButtonClick
}
component=
"span"
startIcon=
{
<
UploadOutlined
/>
}
onClick=
{
()
=>
{
setIsUploadFile
(
true
);
}
}
>
Upload
</
Button
>
<
Button
variant=
"contained"
disabled=
{
loading
}
onClick=
{
()
=>
{
predictEmotionFromVideo
();
}
}
>
>
Upload
Prediction
</
Button
>
</
Button
>
<
Button
<
Button
variant=
"contained"
variant=
"contained"
color=
"primary"
color=
"primary"
startIcon=
{
<
VideoCameraOutlined
/>
}
startIcon=
{
<
VideoCameraOutlined
/>
}
onClick=
{
handleLiveButtonClick
}
onClick=
{
handleLiveButtonClick
}
>
>
Live
{
isRecording
?
'
Stop Recording
'
:
'
Record
'
}
</
Button
>
</
Button
>
{
isRecording
&&
(
<
Button
variant=
"contained"
color=
"secondary"
onClick=
{
createDownloadableVideo
}
>
Download
</
Button
>
)
}
<
div
>
<
video
ref=
{
videoRef
}
autoPlay
playsInline
width=
"100%"
src=
{
isRecording
?
undefined
:
videoUrl
}
// Use videoUrl only when not recording
/>
</
div
>
</
div
>
</
MainCard
>
</
MainCard
>
</
Grid
>
</
Grid
>
<
Grid
item
xs=
{
12
}
md=
{
6
}
>
<
Grid
item
xs=
{
12
}
md=
{
6
}
>
<
h2
>
3D Avatar
</
h2
>
<
h2
>
3D Avatar
</
h2
>
<
MainCard
>
<
MainCard
>
{
/* Content of the second card */
}
<
Grid
container
spacing=
{
4
}
direction=
"column"
alignItems=
"center"
justifyContent=
"center"
sx=
{
{
minHeight
:
'
100vh
'
,
py
:
2
}
}
>
{
/* You can put your 3D avatar components here */
}
<
Grid
item
xs=
{
12
}
>
</
MainCard
>
<
Box
sx=
{
{
width
:
{
xs
:
300
,
sm
:
480
}
}
}
>
<
img
src=
{
construction
}
alt=
"mantis"
style=
{
{
width
:
'
100%
'
,
height
:
'
auto
'
}
}
/>
</
Box
>
</
Grid
>
<
Grid
item
xs=
{
12
}
>
<
Stack
spacing=
{
2
}
justifyContent=
"center"
alignItems=
"center"
>
<
Typography
align=
"center"
variant=
"h1"
>
Under Construction
</
Typography
>
<
Typography
color=
"textSecondary"
align=
"center"
sx=
{
{
width
:
'
85%
'
}
}
>
Hey! Please check out this site later. We are doing some maintenance on it right now.
</
Typography
>
<
Button
component=
{
Link
}
to=
{
APP_DEFAULT_PATH
}
variant=
"contained"
>
Back To Home
</
Button
>
</
Stack
>
</
Grid
>
</
Grid
>
</
MainCard
>
</
Grid
>
</
Grid
>
</
Grid
>
</
Grid
>
</
ScrollX
>
</
ScrollX
>
...
...
Project/Frontend/SignConnectPlus/src/pages/services/AudioEmotionDetection.js
0 → 100644
View file @
7ac13eb2
import
axios
from
'
axios
'
;
class
AudioEmotionDetectService
{
predictEmotionAudio
(
data
)
{
return
axios
.
post
(
// @ts-ignore
`http://127.0.0.1:8000/predict_emotion/audio/`
,
data
);
}
}
export
default
new
AudioEmotionDetectService
();
\ No newline at end of file
Project/Frontend/SignConnectPlus/src/pages/services/VideoEmotionDetection.js
0 → 100644
View file @
7ac13eb2
import
axios
from
'
axios
'
;
class
VideoEmotionDetectService
{
predictEmotionVideo
(
data
)
{
return
axios
.
post
(
// @ts-ignore
`http://127.0.0.1:8000/predict_emotion/video/`
,
data
);
}
}
export
default
new
VideoEmotionDetectService
();
\ No newline at end of file
Project/Frontend/SignConnectPlus/src/routes/MainRoutes.tsx
View file @
7ac13eb2
...
@@ -167,7 +167,8 @@ const MainRoutes = {
...
@@ -167,7 +167,8 @@ const MainRoutes = {
{
{
path
:
'
feedback
'
,
path
:
'
feedback
'
,
element
:
<
MaintenanceUnderConstruction
/>
element
:
<
MaintenanceUnderConstruction
/>
}
},
]
]
},
},
],
],
...
...
Project/Frontend/SignConnectPlus/src/services/AudioEmotionDetection.js
0 → 100644
View file @
7ac13eb2
import
axios
from
'
axios
'
;
class
AudioEmotionDetectService
{
predictEmotionAudio
(
data
)
{
return
axios
.
post
(
// @ts-ignore
`http://127.0.0.1:8000/predict_emotion/audio/`
,
data
);
}
}
export
default
new
AudioEmotionDetectService
();
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment