Enterprise Meeting Knowledge Management System with: Backend (FastAPI): - Authentication proxy with JWT (pj-auth-api integration) - MySQL database with 4 tables (users, meetings, conclusions, actions) - Meeting CRUD with system code generation (C-YYYYMMDD-XX, A-YYYYMMDD-XX) - Dify LLM integration for AI summarization - Excel export with openpyxl - 20 unit tests (all passing) Client (Electron): - Login page with company auth - Meeting list with create/delete - Meeting detail with real-time transcription - Editable transcript textarea (single block, easy editing) - AI summarization with conclusions/action items - 5-second segment recording (efficient for long meetings) Sidecar (Python): - faster-whisper medium model with int8 quantization - ONNX Runtime VAD (lightweight, ~20MB vs PyTorch ~2GB) - Chinese punctuation processing - OpenCC for Traditional Chinese conversion - Anti-hallucination parameters - Auto-cleanup of temp audio files OpenSpec: - add-meeting-assistant-mvp (47 tasks, archived) - add-realtime-transcription (29 tasks, archived) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
63 lines
2.7 KiB
Markdown
63 lines
2.7 KiB
Markdown
# frontend-transcript Specification
|
|
|
|
## Purpose
|
|
TBD - created by archiving change add-realtime-transcription. Update Purpose after archive.
|
|
## Requirements
|
|
### Requirement: Editable Transcript Segments
|
|
The frontend SHALL display transcribed text as individually editable segments that can be modified without disrupting ongoing transcription.
|
|
|
|
#### Scenario: Display new segment
|
|
- **WHEN** a new transcription segment is received from sidecar
|
|
- **THEN** a new editable text block SHALL appear in the transcript area
|
|
- **AND** the block SHALL be visually distinct (e.g., border, background)
|
|
- **AND** the block SHALL be immediately editable
|
|
|
|
#### Scenario: Edit existing segment
|
|
- **WHEN** user modifies text in a segment
|
|
- **THEN** only that segment's local data SHALL be updated
|
|
- **AND** new incoming segments SHALL continue to append below
|
|
- **AND** the edited segment SHALL show an "edited" indicator
|
|
|
|
#### Scenario: Save merged transcript
|
|
- **WHEN** user clicks Save button
|
|
- **THEN** all segments (edited and unedited) SHALL be concatenated in order
|
|
- **AND** the merged text SHALL be saved as transcript_blob
|
|
|
|
### Requirement: Real-time Streaming UI
|
|
The frontend SHALL provide clear visual feedback during streaming transcription.
|
|
|
|
#### Scenario: Recording active indicator
|
|
- **WHEN** streaming recording is active
|
|
- **THEN** a pulsing recording indicator SHALL be visible
|
|
- **AND** the current/active segment SHALL have distinct styling (e.g., highlighted border)
|
|
- **AND** the Start Recording button SHALL change to Stop Recording
|
|
|
|
#### Scenario: Processing indicator
|
|
- **WHEN** audio is being processed but no text has appeared yet
|
|
- **THEN** a "Processing..." indicator SHALL appear in the active segment area
|
|
- **AND** the indicator SHALL disappear when text arrives
|
|
|
|
#### Scenario: Streaming status display
|
|
- **WHEN** streaming session is active
|
|
- **THEN** the UI SHALL display segment count (e.g., "Segment 5/5")
|
|
- **AND** total recording duration
|
|
|
|
### Requirement: Audio Streaming IPC
|
|
The Electron main process SHALL provide IPC handlers for continuous audio streaming between renderer and sidecar.
|
|
|
|
#### Scenario: Start streaming
|
|
- **WHEN** renderer calls `startRecordingStream()`
|
|
- **THEN** main process SHALL send start_stream command to sidecar
|
|
- **AND** return session confirmation to renderer
|
|
|
|
#### Scenario: Stream audio data
|
|
- **WHEN** renderer sends audio chunk via `streamAudioChunk(arrayBuffer)`
|
|
- **THEN** main process SHALL convert WebM to PCM if needed
|
|
- **AND** forward to sidecar stdin as base64-encoded audio_chunk command
|
|
|
|
#### Scenario: Receive transcription
|
|
- **WHEN** sidecar emits a segment result on stdout
|
|
- **THEN** main process SHALL parse the JSON
|
|
- **AND** forward to renderer via `transcription-segment` IPC event
|
|
|