Phase 14 구현: 회의 모드 (Meeting Mode)

실시간 녹음 + 타임스탬프 메모 + STT 전사 + LLM 구조화 회의록 + PDF/MD 내보내기.
CaptionService 연동, 동시 사용 충돌 방지, 긴 회의 2-pass 요약 지원.
DB 2테이블, IPC 15채널, UI 3뷰(목록/녹음/상세), 12개 locale i18n.
This commit is contained in:
Yun Chan 2026-04-08 01:16:52 +09:00
parent dd68fc9ccd
commit d0c4f9ee53
38 changed files with 2550 additions and 769 deletions

View file

@ -1,13 +1,11 @@
{
"app.name": "D3RO Voice",
"app.tagline": "Local AI Voice Assistant",
"nav.dashboard": "Dashboard",
"nav.history": "History",
"nav.dictionary": "Dictionary",
"nav.commands": "Commands",
"nav.settings": "Settings",
"dashboard.sessionOverview": "Session Overview",
"dashboard.systemStatus": "System Status",
"dashboard.sessionsToday": "Today's Sessions",
@ -26,7 +24,6 @@
"dashboard.entries": "{{count}} entries",
"dashboard.stat": "Stats",
"dashboard.sys": "System",
"history.title": "Transcription History",
"history.search": "Search...",
"history.entries": "{{count}} entries",
@ -34,7 +31,6 @@
"history.noResults": "No results found",
"history.noHistory": "No history — start recording",
"history.count": "{{count}} entries",
"dictionary.title": "Custom Dictionary",
"dictionary.words": "{{count}} words",
"dictionary.add": "Add",
@ -47,7 +43,6 @@
"dictionary.addTitle": "Add Word",
"dictionary.word": "Word",
"dictionary.pronunciation": "Pronunciation (optional)",
"commands.title": "LLM Commands",
"commands.count": "{{count}} commands",
"commands.add": "Add",
@ -62,14 +57,12 @@
"commands.promptTemplate": "Prompt Template",
"commands.promptHelp": "{{text}} will be replaced with the transcribed text",
"commands.defaultPrompt": "Please refine the following: {{text}}",
"settings.title": "Settings",
"settings.tabs.general": "General",
"settings.tabs.audio": "Audio",
"settings.tabs.stt": "STT",
"settings.tabs.llm": "LLM",
"settings.tabs.about": "About",
"settings.shortcuts": "Shortcuts",
"settings.dictation": "Dictation",
"settings.dictation.desc": "Hold to speak. Transcription begins when you release the key.",
@ -89,20 +82,17 @@
"settings.notSet": "Not set",
"settings.enabled": "Enabled",
"settings.disabled": "Disabled",
"settings.interface": "Interface",
"settings.theme": "Theme",
"settings.theme.system": "System",
"settings.theme.light": "Light",
"settings.theme.dark": "Dark",
"settings.language": "Language",
"settings.appBehavior": "App Behavior",
"settings.closeToTray": "Minimize to tray on close",
"settings.autoLaunch": "Launch at system startup",
"settings.autoInsert": "Auto-insert text after transcription",
"settings.soundEffects": "Sound Effects",
"settings.microphone": "Microphone",
"settings.inputDevice": "Input Device",
"settings.deviceDefault": "(Default)",
@ -110,7 +100,6 @@
"settings.insertMethod": "Insert Method",
"settings.insertClipboard": "Clipboard (Ctrl+V)",
"settings.insertKeyboard": "Keyboard Typing",
"settings.whisperModel": "Whisper Model",
"settings.model.tiny": "tiny (39 MB, fastest)",
"settings.model.base": "base (74 MB, balanced)",
@ -119,7 +108,6 @@
"settings.model.large": "large-v3 (1.5 GB, best)",
"settings.sttLanguage": "Recognition Language",
"settings.sttLang.auto": "Auto-detect",
"settings.ollamaServer": "Ollama Server",
"settings.ollamaUrl": "Ollama Server URL",
"settings.ollamaHint": "Connects automatically when Ollama is running. Pull models directly in Ollama (e.g. ollama pull qwen3:4b).",
@ -132,7 +120,6 @@
"settings.action.grammar": "Grammar Correction",
"settings.action.custom": "Custom Prompt",
"settings.actionHint": "The selected LLM post-processing will be applied to your transcription after recording. Only works when Ollama is connected.",
"settings.about.version": "Version",
"settings.about.techStack": "Tech Stack",
"settings.about.techStackValue": "Electron + React 19 + MUI 7 + TypeScript",
@ -140,13 +127,11 @@
"settings.about.voiceEngineValue": "STT: faster-whisper (local) / LLM: Ollama (local)",
"settings.about.description": "A fully local AI voice assistant built on Speakly reverse-engineering insights. Runs entirely offline with no cloud dependencies.",
"settings.about.restartOnboarding": "Restart Setup Wizard",
"status.ollama": "OLLAMA",
"status.offline": "OFFLINE",
"status.nudge.title": "Ollama is not running",
"status.nudge.desc": "Ollama is required for LLM post-processing (translation, summarization, etc.).",
"status.nudge.guide": "View setup guide →",
"onboarding.welcome.title": "D3RO-VOICE",
"onboarding.welcome.desc": "No typing needed — just speak. Your local AI voice assistant.",
"onboarding.welcome.start": "Get Started",
@ -167,7 +152,6 @@
"onboarding.done.start": "Start Using",
"onboarding.back": "Back",
"onboarding.next": "Next",
"hotkey.title": "Set Shortcut",
"hotkey.dictationTitle": "Set Dictation Shortcut",
"hotkey.oneTouchTitle": "Set One-Touch Mode Shortcut",
@ -179,7 +163,6 @@
"hotkey.current": "Current: {{keys}}",
"hotkey.hint": "Enter a combination (e.g. Ctrl+Shift+Q) or a single key (e.g. F5)",
"hotkey.reset": "Clear",
"ollama.title": "OLLAMA SETUP GUIDE",
"ollama.step1.title": "STEP 1 — Install Ollama",
"ollama.step1.desc": "Ollama is a free tool for running LLMs locally.",
@ -188,7 +171,6 @@
"ollama.step2.alt": "Or a larger model: ollama pull qwen3:8b (more accurate, slower)",
"ollama.step3.title": "STEP 3 — Auto-Connect",
"ollama.step3.desc": "Once Ollama is running, D3RO-VOICE will detect it automatically. When the status bar LED turns from red to green, you're ready!",
"service.sttEngine": "STT ENGINE",
"service.ollamaLlm": "OLLAMA LLM",
"service.hotkeyHook": "HOTKEY HOOK",
@ -198,7 +180,6 @@
"service.offline": "OFFLINE",
"service.active": "ACTIVE",
"service.standby": "STANDBY",
"common.cancel": "Cancel",
"common.save": "Save",
"common.delete": "Delete",
@ -210,7 +191,6 @@
"common.copy": "Copy",
"common.test": "Test",
"common.stop": "Stop",
"memo.tags": "Tags",
"memo.addTag": "Add Tag",
"memo.removeTag": "Remove Tag",
@ -221,7 +201,6 @@
"memo.filterByTag": "Filter by tag",
"memo.allTags": "All Tags",
"memo.clearFilter": "Clear filter",
"voiceCommand.title": "Voice Commands",
"voiceCommand.enabled": "Voice Keyword Recognition",
"voiceCommand.enabledDesc": "Detects keywords at the start of transcription to auto-select commands.",
@ -232,7 +211,6 @@
"voiceCommand.matchMode.prefix": "Starts with",
"voiceCommand.matchMode.suffix": "Ends with",
"voiceCommand.matchMode.contains": "Contains",
"chain.title": "LLM Chains",
"chain.count": "{{count}} chains",
"chain.add": "Add Chain",
@ -251,24 +229,19 @@
"chain.noChains": "No chains — create a pipeline to run multiple commands in sequence",
"chain.step": "Step {{n}}",
"chain.progress": "Processing step {{current}}/{{total}}",
"context.title": "Screen Context",
"context.enabled": "Screen Context",
"context.enabledDesc": "Captures active app and selected text when recording starts, and sends it to the LLM.",
"dashboard.caption": "Live Caption",
"dashboard.captionStart": "Start Caption",
"dashboard.captionStop": "Stop Caption",
"dashboard.captionActive": "Caption Active",
"settings.voiceCommands": "Voice Commands",
"settings.voiceCommands.desc": "Detects keywords in transcription to auto-select commands.",
"settings.screenContext": "Screen Context",
"settings.screenContext.desc": "Sends active app info and selected text to the LLM during recording.",
"date.today": "Today",
"date.yesterday": "Yesterday",
"license.title": "License",
"license.currentTier": "Current Tier",
"license.free": "FREE",
@ -343,7 +316,6 @@
"license.unlimited": "Unlimited",
"license.locked": "Locked",
"license.nav": "License",
"fileTranscription.title": "File Transcription",
"fileTranscription.dropZone": "Drop audio/video file here",
"fileTranscription.dropZoneHint": "Supports MP3, WAV, M4A, MP4, MKV, WEBM",
@ -356,7 +328,6 @@
"fileTranscription.retry": "Retry",
"fileTranscription.error.invalidFormat": "Unsupported file format",
"fileTranscription.error.unknown": "Unknown error",
"meetingSummary.title": "Meeting Summary",
"meetingSummary.generating": "Generating summary...",
"meetingSummary.summary": "Summary",
@ -365,7 +336,6 @@
"meetingSummary.exportMarkdown": "Export as Markdown",
"meetingSummary.noSummary": "No summary available",
"meetingSummary.generate": "Generate Summary",
"template.title": "Dictation Templates",
"template.create": "New Template",
"template.edit": "Edit Template",
@ -381,7 +351,6 @@
"template.startSession": "Start",
"template.cancelSession": "Cancel Session",
"template.empty": "No templates",
"nav.conversation": "Talk",
"conversation.title": "Voice Conversation",
"conversation.idle": "Idle",
@ -393,7 +362,6 @@
"conversation.inputPlaceholder": "Type a message...",
"conversation.end": "End",
"conversation.clearHistory": "Clear history",
"nav.knowledge": "Knowledge",
"rag.title": "Knowledge Base",
"rag.addDocument": "Add Document",
@ -410,12 +378,56 @@
"rag.sources": "Sources",
"rag.adding": "Adding...",
"rag.parsing": "Parsing document...",
"voiceAction.title": "Voice Actions",
"voiceAction.execute": "Execute",
"voiceAction.presets": "Preset Commands",
"voiceAction.history": "Action History",
"voiceAction.noHistory": "No action history",
"voiceAction.blocked": "Blocked (unsafe)",
"voiceAction.executed": "Executed"
"voiceAction.executed": "Executed",
"settings.theme.nord": "Nord",
"settings.theme.solarized": "Solarized",
"settings.theme.catppuccin": "Catppuccin",
"settings.theme.dracula": "Dracula",
"settings.sttLang.ko": "한국어 (Korean)",
"settings.sttLang.en": "English",
"settings.sttLang.ja": "日本語 (Japanese)",
"settings.sttLang.zh": "中文 (Chinese)",
"template.outputHelperText": "Use {{fieldName}} for placeholders",
"nav.meeting": "Meeting",
"meeting.title": "Meeting Mode",
"meeting.newMeeting": "New Meeting",
"meeting.startRecording": "Start Recording",
"meeting.stopRecording": "Stop Recording",
"meeting.recording": "Recording",
"meeting.processing": "Generating minutes...",
"meeting.completed": "Completed",
"meeting.error": "Error",
"meeting.elapsed": "Elapsed",
"meeting.memoPlaceholder": "Type a memo (Enter to add)",
"meeting.memoAdded": "Memo added",
"meeting.noSessions": "No meeting recordings",
"meeting.noSessionsDesc": "Press New Meeting to start recording",
"meeting.summary": "Summary",
"meeting.decisions": "Decisions",
"meeting.actionItems": "Action Items",
"meeting.timeline": "Timeline",
"meeting.transcript": "Raw Transcript",
"meeting.memos": "Memos",
"meeting.exportPdf": "Export PDF",
"meeting.exportMarkdown": "Export Markdown",
"meeting.delete": "Delete",
"meeting.deleteConfirm": "Delete this meeting record?",
"meeting.backToList": "Back to List",
"meeting.notificationTitle": "Minutes Ready",
"meeting.notificationBody": "Meeting minutes have been generated.",
"meeting.sessions": "{{count}} sessions",
"meeting.duration": "{{minutes}} min",
"meeting.editTitle": "Edit Title",
"meeting.untitled": "Untitled Meeting",
"meeting.processingStep.merging": "Merging transcript...",
"meeting.processingStep.generating": "Generating minutes with LLM...",
"meeting.processingStep.parsing": "Parsing minutes...",
"meeting.processingStep.saving": "Saving...",
"meeting.processingStep.notifying": "Sending notification..."
}