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": "로컬 AI 음성 어시스턴트",
"nav.dashboard": "대시보드",
"nav.history": "히스토리",
"nav.dictionary": "사전",
"nav.commands": "명령어",
"nav.settings": "설정",
"dashboard.sessionOverview": "세션 개요",
"dashboard.systemStatus": "시스템 상태",
"dashboard.sessionsToday": "오늘 세션",
@ -26,7 +24,6 @@
"dashboard.entries": "{{count}}건",
"dashboard.stat": "통계",
"dashboard.sys": "시스템",
"history.title": "전사 기록",
"history.search": "검색...",
"history.entries": "{{count}}건",
@ -34,7 +31,6 @@
"history.noResults": "검색 결과 없음",
"history.noHistory": "히스토리 없음 — 녹음을 시작하세요",
"history.count": "{{count}}건",
"dictionary.title": "커스텀 사전",
"dictionary.words": "{{count}}개",
"dictionary.add": "추가",
@ -47,7 +43,6 @@
"dictionary.addTitle": "단어 추가",
"dictionary.word": "단어",
"dictionary.pronunciation": "발음 (선택)",
"commands.title": "LLM 명령어",
"commands.count": "{{count}}개",
"commands.add": "추가",
@ -62,14 +57,12 @@
"commands.promptTemplate": "프롬프트 템플릿",
"commands.promptHelp": "{{text}}는 전사된 텍스트로 치환됩니다",
"commands.defaultPrompt": "{{text}}를 다듬어주세요.",
"settings.title": "설정",
"settings.tabs.general": "일반",
"settings.tabs.audio": "오디오",
"settings.tabs.stt": "STT",
"settings.tabs.llm": "LLM",
"settings.tabs.about": "정보",
"settings.shortcuts": "단축키",
"settings.dictation": "받아쓰기",
"settings.dictation.desc": "누른 상태에서 말하기. 키를 놓으면 전사가 시작됩니다.",
@ -89,20 +82,17 @@
"settings.notSet": "미설정",
"settings.enabled": "활성화됨",
"settings.disabled": "비활성화",
"settings.interface": "인터페이스",
"settings.theme": "테마",
"settings.theme.system": "시스템",
"settings.theme.light": "라이트",
"settings.theme.dark": "다크",
"settings.language": "언어",
"settings.appBehavior": "앱 동작",
"settings.closeToTray": "트레이로 최소화",
"settings.autoLaunch": "시스템 시작 시 자동 실행",
"settings.autoInsert": "전사 후 자동 텍스트 삽입",
"settings.soundEffects": "효과음",
"settings.microphone": "마이크",
"settings.inputDevice": "입력 장치",
"settings.deviceDefault": "(기본)",
@ -110,7 +100,6 @@
"settings.insertMethod": "삽입 방식",
"settings.insertClipboard": "클립보드 (Ctrl+V)",
"settings.insertKeyboard": "키보드 타이핑",
"settings.whisperModel": "Whisper 모델",
"settings.model.tiny": "tiny (39 MB, 가장 빠름)",
"settings.model.base": "base (74 MB, 균형)",
@ -119,7 +108,6 @@
"settings.model.large": "large-v3 (1.5 GB, 최고)",
"settings.sttLanguage": "인식 언어",
"settings.sttLang.auto": "자동 감지",
"settings.ollamaServer": "Ollama 서버",
"settings.ollamaUrl": "Ollama 서버 URL",
"settings.ollamaHint": "Ollama가 실행 중이면 자동으로 연결됩니다. 모델은 Ollama에서 직접 pull하세요 (예: ollama pull qwen3:4b).",
@ -132,7 +120,6 @@
"settings.action.grammar": "문법 교정",
"settings.action.custom": "커스텀 프롬프트",
"settings.actionHint": "핫키로 녹음 후 전사된 텍스트에 선택한 LLM 후처리가 적용됩니다. Ollama가 연결되어 있을 때만 동작합니다.",
"settings.about.version": "버전",
"settings.about.techStack": "기술 스택",
"settings.about.techStackValue": "Electron + React 19 + MUI 7 + TypeScript",
@ -140,13 +127,11 @@
"settings.about.voiceEngineValue": "STT: faster-whisper (로컬) / LLM: Ollama (로컬)",
"settings.about.description": "Speakly 리버스엔지니어링 노하우 기반 로컬 AI 음성 어시스턴트. 클라우드 의존성 없이 완전 로컬로 동작합니다.",
"settings.about.restartOnboarding": "초기 설정 안내 다시 보기",
"status.ollama": "OLLAMA",
"status.offline": "OFFLINE",
"status.nudge.title": "Ollama가 실행되지 않고 있어요",
"status.nudge.desc": "LLM 후처리(번역, 요약 등)를 사용하려면 Ollama가 필요합니다.",
"status.nudge.guide": "설치 안내 보기 →",
"onboarding.welcome.title": "D3RO-VOICE",
"onboarding.welcome.desc": "타이핑 없이, 음성으로. 로컬 AI 음성 어시스턴트입니다.",
"onboarding.welcome.start": "시작하기",
@ -167,7 +152,6 @@
"onboarding.done.start": "시작하기",
"onboarding.back": "뒤로",
"onboarding.next": "다음",
"hotkey.title": "단축키 설정",
"hotkey.dictationTitle": "받아쓰기 단축키 설정",
"hotkey.oneTouchTitle": "원터치 모드 단축키 설정",
@ -179,7 +163,6 @@
"hotkey.current": "현재: {{keys}}",
"hotkey.hint": "조합키(예: Ctrl+Shift+Q) 또는 단일키(예: F5)를 입력하세요",
"hotkey.reset": "다시 입력",
"ollama.title": "OLLAMA SETUP GUIDE",
"ollama.step1.title": "STEP 1 — Ollama 설치",
"ollama.step1.desc": "Ollama는 로컬에서 LLM을 실행하는 무료 도구입니다.",
@ -188,7 +171,6 @@
"ollama.step2.alt": "또는 더 큰 모델: ollama pull qwen3:8b (더 정확, 더 느림)",
"ollama.step3.title": "STEP 3 — 자동 연결",
"ollama.step3.desc": "Ollama가 실행되면 D3RO-VOICE가 자동으로 감지합니다. 하단 상태 바의 LED가 빨간색에서 초록색으로 바뀌면 준비 완료!",
"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": "취소",
"common.save": "저장",
"common.delete": "삭제",
@ -210,7 +191,6 @@
"common.copy": "복사",
"common.test": "테스트",
"common.stop": "중지",
"memo.tags": "태그",
"memo.addTag": "태그 추가",
"memo.removeTag": "태그 제거",
@ -221,7 +201,6 @@
"memo.filterByTag": "태그로 필터",
"memo.allTags": "전체 태그",
"memo.clearFilter": "필터 해제",
"voiceCommand.title": "음성 명령어",
"voiceCommand.enabled": "음성 키워드 인식",
"voiceCommand.enabledDesc": "전사 시작 시 키워드를 감지하여 명령어를 자동 선택합니다.",
@ -232,7 +211,6 @@
"voiceCommand.matchMode.prefix": "앞부분 일치",
"voiceCommand.matchMode.suffix": "뒷부분 일치",
"voiceCommand.matchMode.contains": "포함",
"chain.title": "LLM 체인",
"chain.count": "{{count}}개",
"chain.add": "체인 추가",
@ -251,24 +229,19 @@
"chain.noChains": "체인 없음 — 여러 명령어를 순차 실행하는 파이프라인을 만들어 보세요",
"chain.step": "{{n}}단계",
"chain.progress": "{{current}}/{{total}} 단계 처리 중",
"context.title": "화면 컨텍스트",
"context.enabled": "스크린 컨텍스트",
"context.enabledDesc": "녹음 시작 시 활성 앱과 선택된 텍스트를 캡처하여 LLM에 전달합니다.",
"dashboard.caption": "실시간 자막",
"dashboard.captionStart": "자막 시작",
"dashboard.captionStop": "자막 종료",
"dashboard.captionActive": "자막 활성",
"settings.voiceCommands": "음성 명령어",
"settings.voiceCommands.desc": "전사된 텍스트에서 키워드를 감지하여 명령어를 자동 선택합니다.",
"settings.screenContext": "화면 컨텍스트",
"settings.screenContext.desc": "녹음 시 활성 앱 정보와 선택된 텍스트를 LLM에 함께 전달합니다.",
"date.today": "오늘",
"date.yesterday": "어제",
"license.title": "라이선스",
"license.currentTier": "현재 등급",
"license.free": "FREE",
@ -343,7 +316,6 @@
"license.unlimited": "무제한",
"license.locked": "잠금",
"license.nav": "라이선스",
"fileTranscription.title": "파일 전사",
"fileTranscription.dropZone": "오디오/비디오 파일을 여기에 드래그하세요",
"fileTranscription.dropZoneHint": "MP3, WAV, M4A, MP4, MKV, WEBM 지원",
@ -356,7 +328,6 @@
"fileTranscription.retry": "다시 시도",
"fileTranscription.error.invalidFormat": "지원하지 않는 파일 형식입니다",
"fileTranscription.error.unknown": "알 수 없는 오류",
"meetingSummary.title": "회의록 요약",
"meetingSummary.generating": "요약 생성 중...",
"meetingSummary.summary": "요약",
@ -365,7 +336,6 @@
"meetingSummary.exportMarkdown": "마크다운 내보내기",
"meetingSummary.noSummary": "요약이 없습니다",
"meetingSummary.generate": "요약 생성",
"template.title": "딕테이션 템플릿",
"template.create": "새 템플릿",
"template.edit": "템플릿 편집",
@ -381,7 +351,6 @@
"template.startSession": "시작",
"template.cancelSession": "세션 취소",
"template.empty": "템플릿이 없습니다",
"nav.conversation": "대화",
"conversation.title": "음성 대화",
"conversation.idle": "대기",
@ -393,7 +362,6 @@
"conversation.inputPlaceholder": "메시지 입력...",
"conversation.end": "종료",
"conversation.clearHistory": "대화 초기화",
"nav.knowledge": "지식 베이스",
"rag.title": "지식 베이스",
"rag.addDocument": "문서 추가",
@ -410,12 +378,56 @@
"rag.sources": "참조 문서",
"rag.adding": "추가 중...",
"rag.parsing": "문서 분석 중...",
"voiceAction.title": "음성 액션",
"voiceAction.execute": "실행",
"voiceAction.presets": "프리셋 명령",
"voiceAction.history": "실행 이력",
"voiceAction.noHistory": "실행 이력이 없습니다",
"voiceAction.blocked": "차단됨 (위험 명령)",
"voiceAction.executed": "실행됨"
"voiceAction.executed": "실행됨",
"settings.theme.nord": "Nord",
"settings.theme.solarized": "Solarized",
"settings.theme.catppuccin": "Catppuccin",
"settings.theme.dracula": "Dracula",
"settings.sttLang.ko": "한국어",
"settings.sttLang.en": "English",
"settings.sttLang.ja": "日本語",
"settings.sttLang.zh": "中文",
"template.outputHelperText": "{{필드명}} 형식으로 플레이스홀더를 사용하세요",
"nav.meeting": "회의",
"meeting.title": "회의 모드",
"meeting.newMeeting": "새 회의",
"meeting.startRecording": "녹음 시작",
"meeting.stopRecording": "녹음 종료",
"meeting.recording": "녹음 중",
"meeting.processing": "회의록 생성 중...",
"meeting.completed": "완료",
"meeting.error": "오류",
"meeting.elapsed": "경과 시간",
"meeting.memoPlaceholder": "메모 입력 (Enter로 추가)",
"meeting.memoAdded": "메모 추가됨",
"meeting.noSessions": "회의 녹음이 없습니다",
"meeting.noSessionsDesc": "새 회의 버튼을 눌러 녹음을 시작하세요",
"meeting.summary": "요약",
"meeting.decisions": "결정사항",
"meeting.actionItems": "할 일",
"meeting.timeline": "타임라인",
"meeting.transcript": "원문 전사",
"meeting.memos": "메모",
"meeting.exportPdf": "PDF 내보내기",
"meeting.exportMarkdown": "마크다운 내보내기",
"meeting.delete": "삭제",
"meeting.deleteConfirm": "이 회의록을 삭제하시겠습니까?",
"meeting.backToList": "목록으로",
"meeting.notificationTitle": "회의록 준비 완료",
"meeting.notificationBody": "회의록이 생성되었습니다. 클릭하여 확인하세요.",
"meeting.sessions": "{{count}}건",
"meeting.duration": "{{minutes}}분",
"meeting.editTitle": "제목 편집",
"meeting.untitled": "무제 회의",
"meeting.processingStep.merging": "전사 텍스트 합산 중...",
"meeting.processingStep.generating": "LLM 회의록 생성 중...",
"meeting.processingStep.parsing": "회의록 파싱 중...",
"meeting.processingStep.saving": "저장 중...",
"meeting.processingStep.notifying": "완료 알림 중..."
}