Phase 12~13 전체 구현: Pro+ 피처 6종 + 음성 대화 + RAG + OS 자동화

Phase 12:
- FileTranscriptionService: ffmpeg PCM 변환 + 30초 청크 순차 STT
- MeetingSummaryService: 자막 세션 → LLM 자동 요약 + DB summaryText
- DictationTemplateService: 필드별 음성 입력 상태 머신 + 프리셋 3개

Phase 13.1:
- VoiceConversationService: STT→Ollama /api/chat→TTS 대화 루프 (10턴)
- TTSPlaybackService: Windows SAPI 문장 단위 큐 재생
- LocalLLMService.chatStream: Ollama /api/chat 스트리밍

Phase 13.2:
- RAGService: Ollama 임베딩 + SQLite 벡터 + 코사인 유사도 검색
- KnowledgeBasePage: 문서 관리 + 질문/답변 UI
- PDF 파서: zlib FlateDecode 해제 + BT/ET 텍스트 추출

Phase 13.3:
- VoiceActionService: LLM JSON 액션 플랜 생성 + 실행
- 프리셋 6개 (크롬/메모장/탐색기/볼륨), 위험 명령 차단

공통: IPC ~70채널, 에러코드 780-878, i18n 100+키
버그픽스: 라이선스 로컬 키 우선, i18n featureLabel, DOM 중첩
This commit is contained in:
Yun Chan 2026-04-05 23:52:14 +09:00
parent a31f96bbb8
commit eb83682269
38 changed files with 5678 additions and 19 deletions

View file

@ -307,6 +307,21 @@
"license.feature.meeting_summary": "회의 요약",
"license.feature.local_rag": "로컬 RAG",
"license.feature.os_automation": "OS 자동화",
"license.feature.llmProcess": "LLM 처리",
"license.feature.liveCaption": "실시간 자막",
"license.feature.screenContext": "화면 컨텍스트",
"license.feature.voiceCommand": "음성 명령어",
"license.feature.llmChain": "LLM 체인",
"license.feature.voiceMemo": "음성 메모",
"license.feature.historyUnlimited": "무제한 히스토리",
"license.feature.historyExport": "히스토리 내보내기",
"license.feature.customInstruction": "커스텀 명령어 생성",
"license.feature.fileTranscription": "파일 전사",
"license.feature.voiceConversation": "음성 대화",
"license.feature.dictationTemplate": "받아쓰기 템플릿",
"license.feature.meetingSummary": "회의 요약",
"license.feature.localRag": "로컬 RAG",
"license.feature.osAutomation": "OS 자동화",
"license.pro.required": "PRO 필요",
"license.proPlus.required": "PRO+ 필요",
"license.included": "포함",
@ -327,5 +342,80 @@
"license.perDay": "회/일",
"license.unlimited": "무제한",
"license.locked": "잠금",
"license.nav": "라이선스"
"license.nav": "라이선스",
"fileTranscription.title": "파일 전사",
"fileTranscription.dropZone": "오디오/비디오 파일을 여기에 드래그하세요",
"fileTranscription.dropZoneHint": "MP3, WAV, M4A, MP4, MKV, WEBM 지원",
"fileTranscription.converting": "변환 중...",
"fileTranscription.processing": "전사 중...",
"fileTranscription.progress": "청크 {{current}} / {{total}}",
"fileTranscription.complete": "전사 완료",
"fileTranscription.copyAll": "전체 복사",
"fileTranscription.cancel": "취소",
"fileTranscription.retry": "다시 시도",
"fileTranscription.error.invalidFormat": "지원하지 않는 파일 형식입니다",
"fileTranscription.error.unknown": "알 수 없는 오류",
"meetingSummary.title": "회의록 요약",
"meetingSummary.generating": "요약 생성 중...",
"meetingSummary.summary": "요약",
"meetingSummary.decisions": "핵심 결정사항",
"meetingSummary.actionItems": "할 일 목록",
"meetingSummary.exportMarkdown": "마크다운 내보내기",
"meetingSummary.noSummary": "요약이 없습니다",
"meetingSummary.generate": "요약 생성",
"template.title": "딕테이션 템플릿",
"template.create": "새 템플릿",
"template.edit": "템플릿 편집",
"template.delete": "삭제",
"template.name": "템플릿 이름",
"template.description": "설명",
"template.fields": "필드",
"template.addField": "필드 추가",
"template.fieldName": "필드명",
"template.fieldLabel": "라벨",
"template.fieldPrompt": "음성 안내",
"template.outputFormat": "출력 포맷",
"template.startSession": "시작",
"template.cancelSession": "세션 취소",
"template.empty": "템플릿이 없습니다",
"nav.conversation": "대화",
"conversation.title": "음성 대화",
"conversation.idle": "대기",
"conversation.listening": "듣는 중",
"conversation.thinking": "생각 중",
"conversation.speaking": "말하는 중",
"conversation.empty": "D3RO에게 말을 걸어보세요",
"conversation.emptyHint": "마이크 버튼을 누르거나 텍스트를 입력하세요",
"conversation.inputPlaceholder": "메시지 입력...",
"conversation.end": "종료",
"conversation.clearHistory": "대화 초기화",
"nav.knowledge": "지식 베이스",
"rag.title": "지식 베이스",
"rag.addDocument": "문서 추가",
"rag.documents": "문서",
"rag.noDocuments": "문서가 없습니다",
"rag.chunks": "청크",
"rag.indexed": "인덱싱 완료",
"rag.pending": "대기 중",
"rag.indexing": "인덱싱 중",
"rag.reindex": "재인덱싱",
"rag.askQuestion": "질문하기",
"rag.queryPlaceholder": "문서에 대해 질문하세요...",
"rag.searching": "검색 중...",
"rag.sources": "참조 문서",
"rag.adding": "추가 중...",
"rag.parsing": "문서 분석 중...",
"voiceAction.title": "음성 액션",
"voiceAction.execute": "실행",
"voiceAction.presets": "프리셋 명령",
"voiceAction.history": "실행 이력",
"voiceAction.noHistory": "실행 이력이 없습니다",
"voiceAction.blocked": "차단됨 (위험 명령)",
"voiceAction.executed": "실행됨"
}