Skip to content

Commit 5088cfb

Browse files
committed
Merge branch 'live_caption/unit_tests' of https://github.com/yogeshmpandey/edge-ai-suites into live_caption/unit_tests
2 parents b9731b0 + a9a08aa commit 5088cfb

File tree

466 files changed

+29891
-3658
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

466 files changed

+29891
-3658
lines changed

.gitmodules

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,3 +42,6 @@
4242
url = https://github.com/open-edge-platform/edge-ai-suites.git
4343
branch = exp/smart-traffic-adapter
4444
shallow = true
45+
[submodule "health-and-life-sciences-ai-suite/multi_modal_patient_monitoring/services/mdpnp/mdpnp"]
46+
path = health-and-life-sciences-ai-suite/multi_modal_patient_monitoring/services/mdpnp/mdpnp
47+
url = https://github.com/mdpnp/mdpnp.git

education-ai-suite/smart-classroom/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ The **Smart Classroom** project is a modular, extensible framework designed to p
55
The main features are as follows:
66

77
• Audio transcription with ASR models (e.g., Whisper, Paraformer)\
8-
• Speaker diarization is supported using Pyannote Audio models.
8+
• Speaker diarization is supported using Pyannote Audio models.\
99
• Summarization using powerful LLMs (e.g., Qwen, LLaMA)\
1010
• MindMap Generation using Mermaid.js for visual diagram rendering of the summary\
1111
• Plug-and-play architecture for integrating new ASR and LLM models\

education-ai-suite/smart-classroom/docs/user-guide/get-started.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -180,8 +180,8 @@ Request access here:
180180
Pyannote Speaker Diarization v3.1
181181
https://huggingface.co/pyannote/speaker-diarization-3.1
182182

183-
(Optional) Pyannote Speaker Diarization v3.0
184-
https://huggingface.co/pyannote/speaker-diarization-3.0
183+
Pyannote segmentation v3.0
184+
https://huggingface.co/pyannote/segmentation-3.0
185185

186186
Click "Request Access" on the model page and wait for approval.
187187

education-ai-suite/smart-classroom/ui/src/assets/css/RightPanel.css

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010
padding: 12px 8px;
1111
}
1212
.container.fullscreen .right-panel {
13-
margin-top: 70vh; /* Push the RightPanel below the full-screen VideoStream */
14-
z-index: 1000; /* Ensure it stays above the background */
13+
margin-top: 70vh;
14+
z-index: 1000;
1515
}
1616

1717
.platform-configuration,

education-ai-suite/smart-classroom/ui/src/assets/css/Timeline.css

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,33 @@
44
padding: 16px;
55
margin-bottom: 16px;
66
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
7-
border: 1px solid #e0e0e0;
7+
}
8+
9+
.timeline-accordion {
10+
font-size: 12px;
11+
}
12+
13+
.timeline-accordion .timeline-header h4 {
14+
font-size: 14px !important;
15+
margin-bottom: 8px !important;
16+
}
17+
18+
.timeline-accordion .timeline-row {
19+
margin-bottom: 8px;
20+
}
21+
22+
.timeline-accordion .timeline-speaker-info {
23+
width: 80px;
24+
font-size: 11px;
25+
}
26+
27+
.timeline-accordion .timeline-track {
28+
height: 20px;
29+
}
30+
31+
.timeline-accordion .timeline-segment {
32+
height: 18px;
33+
border-radius: 2px;
834
}
935

1036
.timeline-header {

education-ai-suite/smart-classroom/ui/src/assets/css/VideoStream.css

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -188,10 +188,9 @@
188188
padding: 8px;
189189
gap:2px;
190190
}
191-
192-
/* Main stream (front camera) - 75% width */
191+
193192
.main-stream {
194-
flex: 3;
193+
flex: 50%;
195194
position: relative;
196195
background: #000;
197196
overflow: hidden;
@@ -205,16 +204,14 @@
205204
flex-direction: column;
206205
gap:2px;
207206
}
208-
209-
/* Individual side streams */
207+
210208
.side-stream {
211209
flex: 1;
212210
position: relative;
213211
background: #000;
214212
overflow: hidden;
215213
}
216-
217-
/* Single stream view */
214+
218215
.single-stream {
219216
width: 100%;
220217
height: 100%;
@@ -223,8 +220,7 @@
223220
overflow: hidden;
224221
margin: 8px;
225222
}
226-
227-
/* Stream overlay labels */
223+
228224
.stream-overlay-label {
229225
position: absolute;
230226
top: 8px;
@@ -236,8 +232,7 @@
236232
border-radius: 4px;
237233
z-index: 10;
238234
}
239-
240-
/* Ensure HLS players fill their containers */
235+
241236
.main-stream video,
242237
.side-stream video,
243238
.single-stream video,
@@ -249,8 +244,7 @@
249244
object-fit: cover;
250245
display: block;
251246
}
252-
253-
/* Responsive design */
247+
254248
@media (max-width: 768px) {
255249
.multi-stream-container {
256250
flex-direction: column;

education-ai-suite/smart-classroom/ui/src/components/Header/Header.tsx

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,10 @@ import {
2828
setAudioStatus,
2929
setVideoStatus,
3030
startTranscription,
31-
setMonitoringActive
31+
setMonitoringActive,
32+
setUploadedVideoFiles,
33+
setHasUploadedVideoFiles,
34+
setVideoPlaybackMode,
3235
} from '../../redux/slices/uiSlice';
3336
import { resetTranscript } from '../../redux/slices/transcriptSlice';
3437
import { resetSummary } from '../../redux/slices/summarySlice';
@@ -45,7 +48,6 @@ import {
4548
} from '../../services/api';
4649
import Toast from '../common/Toast';
4750
import UploadFilesModal from '../Modals/UploadFilesModal';
48-
import { monitorVideoAnalyticsPipelines} from "../../services/api";
4951

5052
interface HeaderBarProps {
5153
projectName: string;
@@ -61,15 +63,11 @@ const HeaderBar: React.FC<HeaderBarProps> = ({ projectName }) => {
6163
const [errorMsg, setErrorMsg] = useState<string | null>(null);
6264
const [videoAnalyticsEnabled] = useState(true);
6365
const [isUploadModalOpen, setIsUploadModalOpen] = useState(false);
64-
const [monitoringTimer, setMonitoringTimer] = useState<number | null>(null);
6566
const monitoringActive = useAppSelector((s) => s.ui.monitoringActive);
6667
const dispatch = useAppDispatch();
67-
const isBusy = useAppSelector((s) => s.ui.aiProcessing);
6868
const summaryEnabled = useAppSelector((s) => s.ui.summaryEnabled);
6969
const summaryLoading = useAppSelector((s) => s.ui.summaryLoading);
70-
const transcriptStatus = useAppSelector((s) => s.transcript.status);
7170
const mindmapEnabled = useAppSelector((s) => s.ui.mindmapEnabled);
72-
const mindmapLoading = useAppSelector((s) => s.ui.mindmapLoading);
7371
const sessionId = useAppSelector((s) => s.ui.sessionId);
7472
const projectLocation = useAppSelector((s) => s.ui.projectLocation);
7573
const mindmapState = useAppSelector((s) => s.mindmap);
@@ -79,15 +77,14 @@ const HeaderBar: React.FC<HeaderBarProps> = ({ projectName }) => {
7977
const backCamera = useAppSelector((s) => s.ui.backCamera);
8078
const boardCamera = useAppSelector((s) => s.ui.boardCamera);
8179
const videoAnalyticsActive = useAppSelector((s) => s.ui.videoAnalyticsActive);
82-
const videoAnalyticsLoading = useAppSelector((s) => s.ui.videoAnalyticsLoading);
8380
const audioStatus = useAppSelector((s) => s.ui.audioStatus);
8481
const videoStatus = useAppSelector((s) => s.ui.videoStatus);
8582
const hasAudioDevices = useAppSelector((s) => s.ui.hasAudioDevices);
8683
const audioDevicesLoading = useAppSelector((s) => s.ui.audioDevicesLoading);
8784
const isRecording = useAppSelector((s) => s.ui.isRecording);
8885
const justStoppedRecording = useAppSelector((s) => s.ui.justStoppedRecording);
89-
const videoAnalyticsStopping = useAppSelector((s) => s.ui.videoAnalyticsStopping);
9086
const hasUploadedVideoFiles = useAppSelector((s) => s.ui.hasUploadedVideoFiles);
87+
const isPlaybackMode = useAppSelector((s) => s.ui.videoPlaybackMode);
9188
const [isUploading, setIsUploading] = useState(false);
9289

9390
useEffect(() => {
@@ -268,12 +265,13 @@ const HeaderBar: React.FC<HeaderBarProps> = ({ projectName }) => {
268265
setVideoNotification(t('notifications.videoAnalyticsFailed'));
269266
break;
270267
case 'completed':
271-
setVideoNotification(t('notifications.videoProcessingComplete'));
268+
setVideoNotification(
269+
isPlaybackMode ? t('notifications.playbackMode') : t('notifications.videoStreamingComplete'));
272270
break;
273271
default:
274272
setVideoNotification(hasVideoCapability ? t('notifications.videoReady') : t('notifications.noVideoConfigured'));
275273
}
276-
}, [videoStatus, justStoppedRecording, hasVideoCapability, t]);
274+
}, [videoStatus, justStoppedRecording, hasVideoCapability, isPlaybackMode, t]);
277275

278276
useEffect(() => {
279277
const handler = (e: Event) => {
@@ -402,10 +400,10 @@ const HeaderBar: React.FC<HeaderBarProps> = ({ projectName }) => {
402400
});
403401

404402
if (hasSuccessfulStreams) {
403+
dispatch(setVideoPlaybackMode(false));
405404
dispatch(setVideoAnalyticsActive(true));
406405
dispatch(setActiveStream('all'));
407406
dispatch(setVideoStatus('streaming'));
408-
monitorVideoAnalyticsPipelines(sharedSessionId);
409407
console.log(`🎥 Video analytics started successfully. Working: ${successfulPipelines.join(', ')}`);
410408

411409
if (failedPipelines.length > 0) {
@@ -549,7 +547,13 @@ const HeaderBar: React.FC<HeaderBarProps> = ({ projectName }) => {
549547
dispatch(setBoardCameraStream(''));
550548
dispatch(setActiveStream(null));
551549
dispatch(setVideoAnalyticsActive(false));
552-
dispatch(setVideoStatus(hasVideoCapability ? 'ready' : 'no-config'));
550+
dispatch(setVideoStatus('completed'));
551+
dispatch(setHasUploadedVideoFiles(false));
552+
dispatch(setUploadedVideoFiles({
553+
front: null,
554+
back: null,
555+
board: null,
556+
}));
553557

554558
} catch (videoError) {
555559
console.warn('Failed to stop video analytics (non-critical):', videoError);

education-ai-suite/smart-classroom/ui/src/components/LeftPanel/LeftPanel.tsx

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import { useState } from "react";
22
import TranscriptsTab from "../Tabs/TranscriptsTab";
33
import AISummaryTab from "../Tabs/AISummaryTab";
44
import MindMapTab from "../Tabs/MindMapTab";
5-
import Timeline from "./Timeline"; // Add this import
65
import "../../assets/css/LeftPanel.css";
76
import { useAppDispatch, useAppSelector } from "../../redux/hooks";
87
import { setActiveTab } from "../../redux/slices/uiSlice";
@@ -27,9 +26,6 @@ const LeftPanel = () => {
2726
return (
2827
<div className={`left-panel-container ${isFullScreen ? "fullscreen" : ""}`}>
2928
<VideoStream isFullScreen={isFullScreen} onToggleFullScreen={handleToggleFullScreen} />
30-
31-
<Timeline />
32-
3329
<div className="tabs">
3430
<button
3531
className={activeTab === "transcripts" ? "active" : ""}

0 commit comments

Comments
 (0)