Lightweight Deepgram-only sidecar that excludes PyTorch, faster-whisper, RealtimeSTT, and CUDA. Only includes audio capture + WebSocket streaming to Deepgram. Requires a Deepgram API key (BYOK or managed mode). Changes: - client/models.py: Extracted TranscriptionResult into standalone module so deepgram_transcription.py doesn't transitively import torch - backend/app_controller.py: Made RealtimeTranscriptionEngine and DeviceManager imports lazy (only loaded when remote.mode == "local") - local-transcription-cloud.spec: PyInstaller spec excluding all ML deps - SidecarSetup.svelte: Added "Cloud Only (Deepgram)" variant option - build-sidecar-cloud.yml: CI workflow building cloud sidecar for all 3 OS - sidecar-release.yml: Dispatches cloud build alongside CPU/CUDA builds Sidecar download options are now: - Standard (CPU): ~500 MB - local Whisper on any computer - GPU Accelerated (CUDA): ~2 GB - local Whisper with NVIDIA GPU - Cloud Only (Deepgram): ~50 MB - requires API key, no local models Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
30 lines
1016 B
Python
30 lines
1016 B
Python
"""Shared data models used across transcription engines."""
|
|
|
|
from datetime import datetime
|
|
|
|
|
|
class TranscriptionResult:
|
|
"""Represents a transcription result."""
|
|
|
|
def __init__(self, text: str, is_final: bool, timestamp: datetime, user_name: str = ""):
|
|
"""
|
|
Initialize transcription result.
|
|
|
|
Args:
|
|
text: Transcribed text
|
|
is_final: Whether this is a final transcription or realtime preview
|
|
timestamp: Timestamp of transcription
|
|
user_name: Name of the user/speaker
|
|
"""
|
|
self.text = text.strip()
|
|
self.is_final = is_final
|
|
self.timestamp = timestamp
|
|
self.user_name = user_name
|
|
|
|
def __repr__(self) -> str:
|
|
time_str = self.timestamp.strftime("%H:%M:%S")
|
|
prefix = "[FINAL]" if self.is_final else "[PREVIEW]"
|
|
if self.user_name and self.user_name.strip():
|
|
return f"{prefix} [{time_str}] {self.user_name}: {self.text}"
|
|
return f"{prefix} [{time_str}] {self.text}"
|