Commit 7ac13eb2 authored by Ridma Dilshan's avatar Ridma Dilshan

Fix the Update All of my parts

parent e9f16236
...@@ -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.
...@@ -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(
......
...@@ -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)
......
...@@ -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>
......
...@@ -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>
......
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
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
...@@ -167,7 +167,8 @@ const MainRoutes = { ...@@ -167,7 +167,8 @@ const MainRoutes = {
{ {
path: 'feedback', path: 'feedback',
element: <MaintenanceUnderConstruction /> element: <MaintenanceUnderConstruction />
} },
] ]
}, },
], ],
......
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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment