Phase 10~11 전체 구현: 킬러 피처 5종 + 수익화 시스템
Phase 10 킬러 피처: - MemoService: 태그 CRUD + 마크다운 내보내기 (memo_tags DB) - VoiceCommandService: 키워드→명령어 매칭, 프리셋 4종 - ScreenContextService: PowerShell 활성 윈도우 + Ctrl+C 선택 텍스트 - ChainService: LLM 명령어 순차 실행 파이프라인 - CaptionService: 6초 청크 연속 전사 + 시스템 오디오 루프백 VoiceModeService 파이프라인 통합: - 녹음 시작 → 컨텍스트 캡처 → STT → 키워드 매칭 → LLM(체인/컨텍스트 주입) → 삽입 시스템 오디오 캡처: - setDisplayMediaRequestHandler + audio: 'loopback' (IPC 브릿지) - electron-audio-loopback 패키지 contextIsolation 호환 불가 → 직접 구현 Phase 11 수익화: - LicenseService: Free/Pro/Pro+ 3티어, LemonSqueezy API - Feature Gate: requireFeature/checkFeature/consumeFeature - 일일 쿼터: Free dictation 20/일, LLM 10/일 (SQLite daily_usage) - LicenseModal, ProBadge, UpgradePromptModal UI 디자인 보강: - d3roTypo(13종), d3roShadow(10종), d3roRadius(7종) 토큰 시스템 - ScreenPanel, ButtonGroup DS 컴포넌트 신규 - PhosphorText 4→13종 변형, MetalDial conic-gradient 광택 - 공유 컴포넌트: EmptyStateCard, SearchInput, PageHeader, HistoryEntryCard 기타: - 자막 핫키 SSOT 전체 연동 (Config→Hotkey→VoiceMode→Caption→Settings) - StatusBar 자막 LED + 효과음, 자막 로딩 UI - LLM 상태 이벤트 전파 수정 (폴링 제거 → onStatusChanged) - 커맨드 팝업 "선택 해제" 항목 추가
This commit is contained in:
parent
36d77ca224
commit
a31f96bbb8
97 changed files with 11853 additions and 1143 deletions
|
|
@ -1,58 +1,331 @@
|
|||
{
|
||||
"app.name": "D3RO Voice",
|
||||
"app.tagline": "로컬 AI 음성 어시스턴트",
|
||||
|
||||
"nav.dashboard": "대시보드",
|
||||
"nav.history": "히스토리",
|
||||
"nav.dictionary": "사전",
|
||||
"nav.commands": "명령어",
|
||||
"nav.settings": "설정",
|
||||
"dashboard.title": "대시보드",
|
||||
"dashboard.totalSessions": "총 세션",
|
||||
"dashboard.totalTime": "총 시간",
|
||||
"dashboard.totalWords": "총 단어",
|
||||
"dashboard.streak": "연속",
|
||||
"dashboard.today": "오늘",
|
||||
"dashboard.sessions": "세션",
|
||||
"dashboard.time": "시간",
|
||||
|
||||
"dashboard.sessionOverview": "세션 개요",
|
||||
"dashboard.systemStatus": "시스템 상태",
|
||||
"dashboard.sessionsToday": "오늘 세션",
|
||||
"dashboard.pressToRecord": "{{key}}를 눌러 녹음 시작",
|
||||
"dashboard.hotkeyNotSet": "핫키 미설정",
|
||||
"dashboard.words": "단어",
|
||||
"history.title": "히스토리",
|
||||
"history.search": "전사 내용 검색...",
|
||||
"history.empty": "아직 히스토리가 없습니다.",
|
||||
"history.noResults": "검색 결과가 없습니다.",
|
||||
"dictionary.title": "사전",
|
||||
"dictionary.search": "단어 검색...",
|
||||
"dictionary.addWord": "단어 추가",
|
||||
"dictionary.empty": "아직 등록된 단어가 없습니다. STT 정확도 향상을 위해 커스텀 단어를 추가하세요.",
|
||||
"dictionary.noResults": "검색 결과가 없습니다.",
|
||||
"dashboard.total": "전체",
|
||||
"dashboard.streak": "연속",
|
||||
"dashboard.days": "일",
|
||||
"dashboard.recording": "녹음",
|
||||
"dashboard.sessions": "세션",
|
||||
"dashboard.today": "오늘",
|
||||
"dashboard.recentTranscriptions": "최근 전사",
|
||||
"dashboard.noHistory": "히스토리 없음 — 핫키를 눌러 녹음을 시작하세요",
|
||||
"dashboard.copy": "복사",
|
||||
"dashboard.entries": "{{count}}건",
|
||||
"dashboard.stat": "통계",
|
||||
"dashboard.sys": "시스템",
|
||||
|
||||
"history.title": "전사 기록",
|
||||
"history.search": "검색...",
|
||||
"history.entries": "{{count}}건",
|
||||
"history.loading": "로딩...",
|
||||
"history.noResults": "검색 결과 없음",
|
||||
"history.noHistory": "히스토리 없음 — 녹음을 시작하세요",
|
||||
"history.count": "{{count}}건",
|
||||
|
||||
"dictionary.title": "커스텀 사전",
|
||||
"dictionary.words": "{{count}}개",
|
||||
"dictionary.add": "추가",
|
||||
"dictionary.search": "검색...",
|
||||
"dictionary.loading": "로딩...",
|
||||
"dictionary.noResults": "검색 결과 없음",
|
||||
"dictionary.noWords": "단어 없음 — STT 정확도 향상을 위해 커스텀 단어를 추가하세요",
|
||||
"dictionary.used": "{{count}}회 사용",
|
||||
"dictionary.editTitle": "단어 편집",
|
||||
"dictionary.addTitle": "단어 추가",
|
||||
"dictionary.word": "단어",
|
||||
"dictionary.pronunciation": "발음 (선택)",
|
||||
"commands.title": "커스텀 명령어",
|
||||
"commands.add": "명령어 추가",
|
||||
|
||||
"commands.title": "LLM 명령어",
|
||||
"commands.count": "{{count}}개",
|
||||
"commands.add": "추가",
|
||||
"commands.activeCommand": "활성 명령어",
|
||||
"commands.none": "없음",
|
||||
"commands.loading": "로딩...",
|
||||
"commands.noCommands": "명령어 없음 — 추가를 클릭하여 생성",
|
||||
"commands.editTitle": "명령어 편집",
|
||||
"commands.addTitle": "명령어 추가",
|
||||
"commands.name": "이름",
|
||||
"commands.description": "설명",
|
||||
"commands.prompt": "프롬프트",
|
||||
"commands.builtin": "기본",
|
||||
"commands.custom": "사용자",
|
||||
"commands.promptTemplate": "프롬프트 템플릿",
|
||||
"commands.promptHelp": "{{text}}는 전사된 텍스트로 치환됩니다",
|
||||
"commands.defaultPrompt": "{{text}}를 다듬어주세요.",
|
||||
|
||||
"settings.title": "설정",
|
||||
"settings.general": "일반",
|
||||
"settings.audio": "오디오",
|
||||
"settings.stt": "음성 인식",
|
||||
"settings.llm": "LLM",
|
||||
"settings.tabs.general": "일반",
|
||||
"settings.tabs.audio": "오디오",
|
||||
"settings.tabs.stt": "STT",
|
||||
"settings.tabs.llm": "LLM",
|
||||
"settings.tabs.about": "정보",
|
||||
|
||||
"settings.shortcuts": "단축키",
|
||||
"settings.dictation": "받아쓰기",
|
||||
"settings.dictation.desc": "누른 상태에서 말하기. 키를 놓으면 전사가 시작됩니다.",
|
||||
"settings.agent": "Agent 모드",
|
||||
"settings.agent.descWithKey": "{{key}}를 두 번 클릭하면 Agent 모드에 진입합니다.",
|
||||
"settings.agent.descNoKey": "받아쓰기 핫키를 먼저 설정하세요.",
|
||||
"settings.oneTouch": "원터치 모드",
|
||||
"settings.oneTouch.desc": "눌러서 시작, 다시 눌러서 중지. 별도 단축키가 필요합니다.",
|
||||
"settings.caption": "실시간 자막",
|
||||
"settings.caption.desc": "핫키로 자막 모드를 토글합니다. 마이크 입력을 실시간 전사합니다.",
|
||||
"settings.captionAudio": "자막 오디오 소스",
|
||||
"settings.captionSource": "오디오 소스",
|
||||
"settings.captionSource.mic": "마이크만",
|
||||
"settings.captionSource.system": "시스템 오디오만 (데스크톱 소리)",
|
||||
"settings.captionSource.both": "마이크 + 시스템 오디오",
|
||||
"settings.key": "키",
|
||||
"settings.notSet": "미설정",
|
||||
"settings.enabled": "활성화됨",
|
||||
"settings.disabled": "비활성화",
|
||||
|
||||
"settings.interface": "인터페이스",
|
||||
"settings.theme": "테마",
|
||||
"settings.theme.system": "시스템",
|
||||
"settings.theme.light": "라이트",
|
||||
"settings.theme.dark": "다크",
|
||||
"settings.language": "언어",
|
||||
"settings.closeToTray": "닫기 시 트레이로 최소화",
|
||||
"settings.autoInsert": "전사 후 자동 삽입",
|
||||
|
||||
"settings.appBehavior": "앱 동작",
|
||||
"settings.closeToTray": "트레이로 최소화",
|
||||
"settings.autoLaunch": "시스템 시작 시 자동 실행",
|
||||
"settings.autoInsert": "전사 후 자동 텍스트 삽입",
|
||||
"settings.soundEffects": "효과음",
|
||||
|
||||
"settings.microphone": "마이크",
|
||||
"settings.inputDevice": "입력 장치",
|
||||
"settings.deviceDefault": "(기본)",
|
||||
"settings.textInsert": "텍스트 삽입",
|
||||
"settings.insertMethod": "삽입 방식",
|
||||
"settings.insertClipboard": "클립보드 (Ctrl+V)",
|
||||
"settings.insertKeyboard": "키보드 타이핑",
|
||||
|
||||
"settings.whisperModel": "Whisper 모델",
|
||||
"settings.model.tiny": "tiny (39 MB, 가장 빠름)",
|
||||
"settings.model.base": "base (74 MB, 균형)",
|
||||
"settings.model.small": "small (244 MB, 양호)",
|
||||
"settings.model.medium": "medium (769 MB, 우수)",
|
||||
"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).",
|
||||
"settings.postProcess": "음성 후처리",
|
||||
"settings.defaultAction": "기본 후처리 명령어",
|
||||
"settings.action.none": "없음 (원본 텍스트 그대로)",
|
||||
"settings.action.refine": "다듬기 (문법+자연스러움)",
|
||||
"settings.action.translate": "번역",
|
||||
"settings.action.summarize": "요약",
|
||||
"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",
|
||||
"settings.about.voiceEngine": "음성 엔진",
|
||||
"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": "시작하기",
|
||||
"onboarding.mic.title": "마이크 설정",
|
||||
"onboarding.mic.desc": "사용할 마이크를 선택하세요. 나중에 설정에서 변경할 수 있습니다.",
|
||||
"onboarding.hotkey.title": "단축키 설정",
|
||||
"onboarding.hotkey.desc": "받아쓰기 단축키를 설정하세요. 키를 누르고 있는 동안 녹음됩니다.",
|
||||
"onboarding.hotkey.notSet": "단축키가 설정되지 않았습니다",
|
||||
"onboarding.hotkey.change": "단축키 변경",
|
||||
"onboarding.hotkey.set": "단축키 설정",
|
||||
"onboarding.ollama.title": "Ollama 설치 (선택)",
|
||||
"onboarding.ollama.desc": "번역, 요약 등 LLM 후처리를 사용하려면 Ollama가 필요합니다. 음성 받아쓰기 자체는 Ollama 없이도 동작합니다.",
|
||||
"onboarding.ollama.download": "Ollama 다운로드",
|
||||
"onboarding.ollama.modelHint": "설치 후 터미널에서 모델을 다운로드하세요",
|
||||
"onboarding.done.title": "설정 완료!",
|
||||
"onboarding.done.descWithKey": "{{key}} 키를 누르고 말하면 음성이 텍스트로 변환됩니다.",
|
||||
"onboarding.done.descNoKey": "설정에서 단축키를 지정하면 음성 받아쓰기를 시작할 수 있습니다.",
|
||||
"onboarding.done.start": "시작하기",
|
||||
"onboarding.back": "뒤로",
|
||||
"onboarding.next": "다음",
|
||||
|
||||
"hotkey.title": "단축키 설정",
|
||||
"hotkey.dictationTitle": "받아쓰기 단축키 설정",
|
||||
"hotkey.oneTouchTitle": "원터치 모드 단축키 설정",
|
||||
"hotkey.captionTitle": "실시간 자막 단축키 설정",
|
||||
"hotkey.prompt": "키 조합을 눌러주세요...",
|
||||
"hotkey.ready": "✓ {{keys}} — 저장을 눌러주세요",
|
||||
"hotkey.noKey": "키를 입력해주세요",
|
||||
"hotkey.reserved": "{{keys}}은 시스템 예약 단축키입니다",
|
||||
"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을 실행하는 무료 도구입니다.",
|
||||
"ollama.step2.title": "STEP 2 — 모델 다운로드",
|
||||
"ollama.step2.desc": "터미널에서 원하는 모델을 pull하세요. 한국어에 추천:",
|
||||
"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",
|
||||
"service.audioInput": "AUDIO INPUT",
|
||||
"service.ready": "READY",
|
||||
"service.connected": "CONNECTED",
|
||||
"service.offline": "OFFLINE",
|
||||
"service.active": "ACTIVE",
|
||||
"service.standby": "STANDBY",
|
||||
|
||||
"common.cancel": "취소",
|
||||
"common.save": "저장",
|
||||
"common.delete": "삭제",
|
||||
"common.add": "추가",
|
||||
"common.edit": "편집",
|
||||
"common.close": "닫기",
|
||||
"common.confirm": "확인",
|
||||
"common.loading": "로딩...",
|
||||
"status.ollamaConnected": "Ollama 연결됨",
|
||||
"status.ollamaOffline": "Ollama 오프라인"
|
||||
"common.copy": "복사",
|
||||
"common.test": "테스트",
|
||||
"common.stop": "중지",
|
||||
|
||||
"memo.tags": "태그",
|
||||
"memo.addTag": "태그 추가",
|
||||
"memo.removeTag": "태그 제거",
|
||||
"memo.tagPlaceholder": "태그 입력 후 Enter",
|
||||
"memo.noTags": "태그 없음",
|
||||
"memo.export": "마크다운 내보내기",
|
||||
"memo.exportSuccess": "내보내기 완료",
|
||||
"memo.filterByTag": "태그로 필터",
|
||||
"memo.allTags": "전체 태그",
|
||||
"memo.clearFilter": "필터 해제",
|
||||
|
||||
"voiceCommand.title": "음성 명령어",
|
||||
"voiceCommand.enabled": "음성 키워드 인식",
|
||||
"voiceCommand.enabledDesc": "전사 시작 시 키워드를 감지하여 명령어를 자동 선택합니다.",
|
||||
"voiceCommand.keywords": "키워드",
|
||||
"voiceCommand.keywordPlaceholder": "키워드 입력 후 Enter",
|
||||
"voiceCommand.noKeywords": "키워드 없음",
|
||||
"voiceCommand.matchMode": "매칭 모드",
|
||||
"voiceCommand.matchMode.prefix": "앞부분 일치",
|
||||
"voiceCommand.matchMode.suffix": "뒷부분 일치",
|
||||
"voiceCommand.matchMode.contains": "포함",
|
||||
|
||||
"chain.title": "LLM 체인",
|
||||
"chain.count": "{{count}}개",
|
||||
"chain.add": "체인 추가",
|
||||
"chain.editTitle": "체인 편집",
|
||||
"chain.addTitle": "체인 추가",
|
||||
"chain.name": "체인 이름",
|
||||
"chain.steps": "단계",
|
||||
"chain.addStep": "단계 추가",
|
||||
"chain.removeStep": "제거",
|
||||
"chain.inputSource": "입력 소스",
|
||||
"chain.inputSource.original": "원본 텍스트",
|
||||
"chain.inputSource.previous": "이전 단계 결과",
|
||||
"chain.selectInstruction": "명령어 선택",
|
||||
"chain.execute": "실행",
|
||||
"chain.executing": "실행 중...",
|
||||
"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",
|
||||
"license.pro": "PRO",
|
||||
"license.proPlus": "PRO+",
|
||||
"license.activate": "라이선스 활성화",
|
||||
"license.deactivate": "비활성화",
|
||||
"license.keyPlaceholder": "라이선스 키 입력...",
|
||||
"license.activating": "활성화 중...",
|
||||
"license.activated": "활성화 완료",
|
||||
"license.activateError": "활성화 실패: {{message}}",
|
||||
"license.deactivated": "비활성화 완료",
|
||||
"license.machineId": "기기 ID",
|
||||
"license.activatedAt": "활성화 일시",
|
||||
"license.manageLicense": "라이선스 관리",
|
||||
"license.upgrade": "업그레이드",
|
||||
"license.upgradeTitle": "Pro로 업그레이드",
|
||||
"license.upgradeDesc": "모든 기능을 잠금 해제하세요",
|
||||
"license.quotaUsed": "{{used}}/{{limit}} 사용",
|
||||
"license.quotaUnlimited": "무제한",
|
||||
"license.tierComparison": "등급 비교",
|
||||
"license.dailyUsage": "일일 사용량",
|
||||
"license.feature.dictation": "받아쓰기",
|
||||
"license.feature.llm_process": "LLM 처리",
|
||||
"license.feature.live_caption": "실시간 자막",
|
||||
"license.feature.screen_context": "화면 컨텍스트",
|
||||
"license.feature.voice_command": "음성 명령어",
|
||||
"license.feature.llm_chain": "LLM 체인",
|
||||
"license.feature.voice_memo": "음성 메모",
|
||||
"license.feature.history_unlimited": "무제한 히스토리",
|
||||
"license.feature.history_export": "히스토리 내보내기",
|
||||
"license.feature.custom_instruction_create": "커스텀 명령어 생성",
|
||||
"license.feature.file_transcription": "파일 전사",
|
||||
"license.feature.voice_conversation": "음성 대화",
|
||||
"license.feature.dictation_template": "받아쓰기 템플릿",
|
||||
"license.feature.meeting_summary": "회의 요약",
|
||||
"license.feature.local_rag": "로컬 RAG",
|
||||
"license.feature.os_automation": "OS 자동화",
|
||||
"license.pro.required": "PRO 필요",
|
||||
"license.proPlus.required": "PRO+ 필요",
|
||||
"license.included": "포함",
|
||||
"license.notIncluded": "미포함",
|
||||
"license.keyLabel": "라이선스 키",
|
||||
"license.quotaExceeded.title": "오늘의 {{feature}}을(를) 모두 사용했습니다",
|
||||
"license.quotaExceeded.desc": "Pro로 업그레이드하면 무제한으로 사용할 수 있습니다",
|
||||
"license.tierRequired.title": "{{feature}}은(는) {{tier}} 기능입니다",
|
||||
"license.tierRequired.desc": "{{tier}}로 업그레이드하여 잠금을 해제하세요",
|
||||
"license.tryTomorrow": "내일 다시 사용하기",
|
||||
"license.learnMore": "알아보기",
|
||||
"license.upgradeBenefits": "업그레이드 혜택",
|
||||
"license.benefit.unlimitedDictation": "무제한 받아쓰기",
|
||||
"license.benefit.unlimitedLLM": "무제한 AI 다듬기",
|
||||
"license.benefit.liveCaption": "실시간 자막",
|
||||
"license.benefit.unlimitedHistory": "히스토리 무제한 보존",
|
||||
"license.usageToday": "오늘 사용량",
|
||||
"license.perDay": "회/일",
|
||||
"license.unlimited": "무제한",
|
||||
"license.locked": "잠금",
|
||||
"license.nav": "라이선스"
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue