mirror of
https://github.com/asyouplz/SpeechNote.git
synced 2026-07-22 06:43:33 +00:00
## 주요 변경사항 ### 타입 시스템 개선 - Unsubscribe 타입 정의 추가 (src/types/events.ts) - 리소스 관리 패턴 표준화 (src/types/resources.ts) - 전략 패턴 타입 정의 (src/types/strategy.ts) ### 수정된 타입 에러 (41개) 1. 이벤트 시스템 불일치 (16개) - SettingsAPI, NotificationManager 인터페이스 구현 수정 - EventEmitter composition 패턴 적용 2. SelectionStrategy 타입 충돌 (10개) - enum과 optional 필드 타입 호환성 개선 - undefined 처리 로직 추가 3. 인터페이스 구현 불완전 (8개) - removeAllListeners, destroy 메서드 추가 - 시그니처 불일치 해결 4. 리소스 관리 불일치 (7개) - Disposable 패턴 일관성 확보 - 생명주기 관리 표준화 ### 문서 업데이트 - CHANGELOG.md: v3.0.1 변경사항 추가 - README.md: 빌드 상태 및 코드 품질 지표 추가 - docs/TYPESCRIPT_IMPROVEMENTS.md: 타입 시스템 개선 가이드 ### 빌드 검증 - TypeScript 컴파일: ✅ 에러 없음 - ESBuild 프로덕션 빌드: ✅ 성공 - 타입 안전성: 95%+ 달성 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
20 KiB
20 KiB
Obsidian Speech-to-Text Plugin
옵시디언에서 음성 파일을 텍스트로 변환하는 강력한 플러그인입니다.
Convert audio recordings to text directly in Obsidian using multiple AI providers (OpenAI Whisper, Deepgram).
주요 기능 (Features)
🎙️ 음성 변환 (Audio Transcription)
- 다중 Provider 지원: OpenAI Whisper, Deepgram Nova 2
- 지원 형식: M4A, MP3, WAV, MP4, WebM, OGG, FLAC
- 최대 파일 크기: 25MB (Whisper) / 2GB (Deepgram)
- 고품질 변환: 최신 AI 모델 활용
- 실시간 스트리밍: Deepgram 실시간 변환 지원 (예정)
🌐 다국어 지원 (Multi-language Support)
- 자동 언어 감지: 음성 언어 자동 인식
- 수동 선택 가능: 한국어, 영어, 일본어, 중국어 등 40+ 언어 지원
- 정확한 변환: Provider별 최적화된 모델 사용
- 다국어 동시 지원: Deepgram 멀티링구얼 모델
📝 스마트 텍스트 삽입 (Smart Text Insertion)
- 커서 위치: 현재 커서 위치에 삽입
- 노트 시작/끝: 노트의 처음이나 끝에 추가
- 자동 생성: 활성 에디터가 없을 시 새 노트 생성
⚡ 성능 최적화 (Performance Optimization)
- Provider 자동 선택: 파일 크기와 형식에 따른 최적 Provider 선택
- 실시간 진행 표시: 상태바에 진행 상황 표시
- 비동기 처리: UI 차단 없는 백그라운드 처리
- 취소 가능: 진행 중인 변환 즉시 취소
- Fallback 메커니즘: Provider 장애 시 자동 전환
- Rate Limiting: API 호출 제한 관리
💾 캐싱 시스템 (Caching System)
- 중복 방지: 동일 파일 재처리 방지
- 빠른 재사용: 캐시된 결과 즉시 활용
- 설정 가능: 캐시 활성화/비활성화 옵션
🎨 커스터마이징 (Customization)
- 타임스탬프: 인라인/사이드바 형식 선택
- 텍스트 포맷팅: 변환 결과 자동 정리
- 유연한 설정: 사용자 환경에 맞춘 조정
설치 방법 (Installation)
🏪 옵시디언 커뮤니티 플러그인 (Community Plugins) - 준비 중
- 설정(Settings) → 커뮤니티 플러그인(Community plugins) 열기
- "Speech to Text" 검색
- 설치(Install) 후 활성화(Enable)
📦 수동 설치 (Manual Installation)
릴리즈 다운로드
- 최신 릴리즈 페이지에서 다운로드
- 압축 해제 후 파일들을 vault의
.obsidian/plugins/speech-to-text/폴더에 복사 - 옵시디언 재시작
- 설정 → 커뮤니티 플러그인에서 "Speech to Text" 활성화
개발 버전 설치
# 저장소 클론
git clone https://github.com/yourusername/obsidian-speech-to-text.git
cd obsidian-speech-to-text
# 의존성 설치
npm install
# 빌드
npm run build
# 플러그인 폴더로 복사 (예시)
cp main.js manifest.json styles.css /path/to/your/vault/.obsidian/plugins/speech-to-text/
초기 설정 (Setup)
🔑 API 키 설정 (API Key Configuration)
Provider 선택
- 옵시디언 설정 → "Speech to Text"
- "Transcription Provider" 선택:
- OpenAI Whisper: 고품질, 안정적
- Deepgram: 빠른 속도, 대용량 지원
- Auto: 자동 선택 (권장)
1. OpenAI API 키 발급 (Whisper 사용 시)
- OpenAI Platform 접속
- 계정 로그인 또는 회원가입
- "Create new secret key" 클릭
- 키 이름 입력 후 생성
- 생성된 키 복사 (⚠️ 한 번만 표시되므로 안전하게 저장)
2. Deepgram API 키 발급 (Deepgram 사용 시)
- Deepgram Console 접속
- 계정 생성 또는 로그인
- "API Keys" 메뉴 선택
- "Create a New API Key" 클릭
- 키 이름과 권한 설정 후 생성
- API 키 복사 및 안전하게 저장
3. 플러그인에 API 키 등록
- 옵시디언 설정 열기 (Cmd/Ctrl + ,)
- 왼쪽 메뉴에서 "Speech to Text" 선택
- 사용할 Provider의 API 키 입력:
- "OpenAI API Key" (Whisper용)
- "Deepgram API Key" (Deepgram용)
- 설정 저장
4. API 키 검증
- OpenAI:
sk-로 시작하는 문자열 - Deepgram: 40자 길이의 16진수 문자열
- 각 Provider의 유료 계정 또는 크레딧 필요
사용 방법 (Usage)
📋 기본 사용법 (Basic Usage)
음성 파일 변환
- 명령 팔레트 열기:
Cmd/Ctrl + P - 명령 검색: "Transcribe audio file" 입력
- 파일 선택: 목록에서 음성 파일 선택
- 변환 대기: 진행 상태바 확인
- 완료: 텍스트가 노트에 자동 삽입
빠른 실행 (Quick Actions)
- 단축키 설정: 설정 → 단축키에서 커스텀 키 지정
- 리본 아이콘: 왼쪽 리본에서 마이크 아이콘 클릭 (준비 중)
- 컨텍스트 메뉴: 오디오 파일 우클릭 → "Transcribe" (준비 중)
🎵 지원 오디오 형식 (Supported Formats)
| 형식 | 확장자 | Whisper | Deepgram | 최대 크기 | 설명 |
|---|---|---|---|---|---|
| M4A | .m4a | ✅ | ✅ | 25MB/2GB | Apple 기기 기본 녹음 형식 |
| MP3 | .mp3 | ✅ | ✅ | 25MB/2GB | 범용 오디오 형식 |
| WAV | .wav | ✅ | ✅ | 25MB/2GB | 무손실, 파일 크기 큼 |
| MP4 | .mp4 | ✅ | ✅ | 25MB/2GB | 비디오 파일의 오디오 추출 |
| WebM | .webm | ❌ | ✅ | -/2GB | 웹 스트리밍 형식 |
| OGG | .ogg | ❌ | ✅ | -/2GB | 오픈소스 오디오 형식 |
| FLAC | .flac | ❌ | ✅ | -/2GB | 무손실 압축 형식 |
📏 파일 크기 제한 (File Size Limits)
| Provider | 최대 크기 | 권장 크기 | 장점 |
|---|---|---|---|
| Whisper | 25MB | 10MB 이하 | 높은 정확도, 안정성 |
| Deepgram | 2GB | 500MB 이하 | 대용량 지원, 빠른 속도 |
| Auto | 자동 선택 | - | 파일별 최적 Provider 선택 |
- 긴 녹음: Deepgram 사용 권장
- 짧은 메모: Whisper 사용 권장
💡 사용 팁 (Pro Tips)
- 녹음 품질: 조용한 환경에서 명확하게 녹음
- 파일 정리: 음성 파일을 전용 폴더에 보관
- 언어 설정: 특정 언어 고정 시 정확도 향상
- 캐시 활용: 동일 파일 재변환 시 캐시 사용
설정 옵션 (Settings)
⚙️ 주요 설정 (Main Settings)
🎨 새로운 Multi-Provider 설정 UI
- 탭 기반 네비게이션: General, Provider, Advanced, Metrics 탭으로 구분
- Progressive Disclosure: 필요한 설정만 단계적으로 표시
- 실시간 검증: API 키 유효성 즉시 확인
- 시각적 피드백: 상태 인디케이터와 진행률 표시
| 설정 | 설명 | 기본값 |
|---|---|---|
| Provider | 변환 Provider 선택 | Auto |
| OpenAI API Key | OpenAI Whisper API 키 | 없음 |
| Deepgram API Key | Deepgram API 키 | 없음 |
| Language | 변환 언어 설정 | 자동 감지 |
| Insert Position | 텍스트 삽입 위치 | 커서 위치 |
| Auto-insert | 자동 텍스트 삽입 | 활성화 |
| Timestamp Format | 타임스탬프 형식 | 없음 |
| Enable Cache | 캐시 사용 여부 | 활성화 |
| Max File Size | 최대 파일 크기 | Provider별 자동 |
| Fallback Provider | 장애 시 대체 Provider | 활성화 |
| Smart Routing | 파일별 최적 Provider 선택 | 활성화 |
| A/B Testing | Provider 성능 비교 테스트 | 비활성화 |
| Metrics Display | 실시간 메트릭 표시 | 활성화 |
📊 고급 설정 (Advanced Settings)
- 네트워크 설정: Timeout, Retry 정책, Rate Limiting
- 성능 최적화: 청크 크기, 동시 처리, 메모리 관리
- 캐시 관리: 캐시 크기, 유효 기간, 통계
- A/B 테스팅: Provider 비교, 성능 분석
- 메트릭 모니터링: 사용량 추적, 오류율, 응답 시간
📖 상세 설정 가이드: Multi-Provider 설정 UI 가이드
🌍 언어 옵션 (Language Options)
auto: 자동 감지 (기본값)ko: 한국어en: 영어ja: 일본어zh: 중국어es: 스페인어fr: 프랑스어de: 독일어
📍 삽입 위치 옵션 (Insert Position Options)
cursor: 현재 커서 위치end: 노트 끝에 추가beginning: 노트 시작에 추가
명령어 (Commands)
📌 사용 가능한 명령어
| 명령어 | 설명 | 단축키 | 상태 |
|---|---|---|---|
| Transcribe audio file | 음성 파일 선택 및 변환 | 설정 가능 | ✅ 사용 가능 |
| Cancel transcription | 진행 중인 변환 취소 | 설정 가능 | ✅ 사용 가능 |
| Transcribe from clipboard | 클립보드의 오디오 변환 | - | 🚧 개발 중 |
| Show transcription history | 변환 기록 보기 | - | 🚧 개발 중 |
| Batch transcribe | 여러 파일 일괄 변환 | - | 📋 계획 중 |
| Export transcriptions | 변환 결과 내보내기 | - | 📋 계획 중 |
개발 정보 (Development)
🔧 사전 요구사항 (Prerequisites)
| 항목 | 최소 버전 | 권장 버전 | 확인 명령 |
|---|---|---|---|
| Node.js | 16.0.0 | 18.x LTS | node -v |
| npm | 7.0.0 | 9.x | npm -v |
| Obsidian | 0.15.0 | 최신 버전 | 앱 정보 확인 |
| TypeScript | 4.7.4 | 5.x | tsc -v |
🚀 개발 환경 설정 (Development Setup)
# 1. 저장소 클론
git clone https://github.com/yourusername/obsidian-speech-to-text.git
cd obsidian-speech-to-text
# 2. 의존성 설치
npm install
# 3. 개발 모드 실행 (파일 변경 감지)
npm run dev
# 4. 프로덕션 빌드
npm run build
# 5. 코드 품질 검사
npm run lint # ESLint 실행
npm run lint:fix # ESLint 자동 수정
npm run format # Prettier 포맷팅
npm run format:check # 포맷팅 검사
# 6. 테스트 실행
npm test # 모든 테스트
npm run test:watch # Watch 모드
npm run test:coverage # 커버리지 측정
# 7. 타입 체크
npm run typecheck
📁 프로젝트 구조 (Project Structure)
SpeechNote/
├── 📦 src/ # 소스 코드
│ ├── 🎯 main.ts # 플러그인 진입점
│ ├── 💼 application/ # 애플리케이션 계층
│ │ ├── EventManager.ts # 이벤트 관리
│ │ └── StateManager.ts # 상태 관리
│ ├── 🧠 core/ # 핵심 비즈니스 로직
│ │ └── transcription/
│ │ ├── AudioProcessor.ts # 오디오 처리
│ │ ├── TextFormatter.ts # 텍스트 포맷팅
│ │ └── TranscriptionService.ts # 변환 서비스
│ ├── 📊 domain/ # 도메인 모델
│ │ └── models/
│ │ └── Settings.ts # 설정 모델
│ ├── 🔌 infrastructure/ # 외부 시스템 통합
│ │ ├── api/
│ │ │ ├── WhisperService.ts # Whisper API 클라이언트
│ │ │ ├── providers/
│ │ │ │ ├── ITranscriber.ts # 공통 인터페이스
│ │ │ │ ├── deepgram/ # Deepgram 통합
│ │ │ │ │ ├── DeepgramAdapter.ts
│ │ │ │ │ └── DeepgramService.ts
│ │ │ │ ├── whisper/ # Whisper 통합
│ │ │ │ │ └── WhisperAdapter.ts
│ │ │ │ └── factory/ # Provider 팩토리
│ │ │ │ └── ProviderSelector.ts
│ │ │ └── TranscriberFactory.ts # Provider 팩토리
│ │ ├── logging/
│ │ │ └── Logger.ts # 로깅 시스템
│ │ └── storage/
│ │ └── SettingsManager.ts # 설정 영속성
│ ├── 🛠️ utils/ # 유틸리티
│ │ └── ErrorHandler.ts # 에러 처리
│ └── 📝 types/ # 타입 정의
│ └── index.ts # 공통 타입
├── 📚 docs/ # 문서
│ ├── setup-guide.md # 개발 환경 설정
│ ├── project-structure.md # 프로젝트 구조
│ └── api-reference.md # API 문서
├── 🏗️ architecture/ # 아키텍처 문서
│ ├── system-design.md # 시스템 설계
│ └── diagrams/ # 다이어그램
├── 📋 guidelines/ # 가이드라인
│ └── development-guide.md # 개발 가이드
├── 🧪 tests/ # 테스트 (준비 중)
├── ⚙️ 설정 파일
│ ├── manifest.json # 플러그인 메타데이터
│ ├── package.json # 프로젝트 설정
│ ├── tsconfig.json # TypeScript 설정
│ ├── esbuild.config.mjs # 빌드 설정
│ └── jest.config.js # 테스트 설정
└── 📄 문서
├── README.md # 프로젝트 소개
└── CONTRIBUTING.md # 기여 가이드
문제 해결 (Troubleshooting)
❗ 자주 발생하는 문제 (Common Issues)
🔑 "Invalid API Key" 오류
증상: API 키 인증 실패
해결 방법:
- API 키가
sk-로 시작하는지 확인 - OpenAI 대시보드에서 키 상태 확인
- 키 앞뒤 공백 제거
- Whisper API 사용 권한 확인
- 크레디트 또는 결제 정보 확인
📁 "File too large" 오류
증상: 25MB 초과 파일 업로드 실패
해결 방법:
- 파일 크기 확인 (최대 25MB)
- 음성 파일 압축:
# FFmpeg를 사용한 압축 ffmpeg -i input.m4a -b:a 128k output.m4a - 긴 녹음 분할:
- 10-15분 단위로 녹음
- 오디오 편집 도구 사용
🎵 "No Audio Files Found" 오류
증상: 음성 파일이 목록에 표시되지 않음
해결 방법:
- 지원 형식 확인:
.m4a,.mp3,.wav,.mp4 - 파일이 vault 내부에 있는지 확인
- 옵시디언 재시작 (
Cmd/Ctrl + R) - 파일 인덱싱 대기 (큰 vault의 경우)
🌐 네트워크 오류
증상: "Network Error" 또는 타임아웃
해결 방법:
- 인터넷 연결 확인
- VPN/프록시 설정 확인
- 방화벽 설정 확인
- OpenAI API 상태 확인: status.openai.com
⚡ 변환 속도 느림
증상: 변환이 예상보다 오래 걸림
해결 방법:
- 파일 크기 최적화 (10MB 이하 권장)
- 음질 설정 조정
- 캐시 기능 활성화
- 네트워크 속도 확인
기여하기 (Contributing)
🤝 기여 환영!
이 프로젝트는 커뮤니티 기여를 환영합니다. 기여 가이드를 참고해주세요.
📝 기여 방법
- Fork: 저장소 Fork
- Branch: 기능 브랜치 생성
git checkout -b feature/amazing-feature - Commit: 변경사항 커밋
git commit -m 'feat: add amazing feature' - Push: 브랜치에 푸시
git push origin feature/amazing-feature - PR: Pull Request 생성
🏷️ 커밋 컨벤션
feat: 새로운 기능fix: 버그 수정docs: 문서 변경style: 코드 스타일 변경refactor: 리팩토링test: 테스트 추가/수정chore: 빌드, 설정 변경
라이선스 (License)
이 프로젝트는 MIT 라이선스를 따릅니다. 자세한 내용은 LICENSE 파일을 참조하세요.
This project is licensed under the MIT License - see the LICENSE file for details.
크레딧 (Credits)
🙏 감사의 말
- Obsidian Team: Obsidian Plugin API 제공
- OpenAI: Whisper API 제공
- Community: 옵시디언 커뮤니티의 피드백과 기여
- Contributors: 모든 기여자들께 감사드립니다
🛠️ 사용된 기술
- TypeScript
- ESBuild
- Jest
- ESLint & Prettier
지원 (Support)
📞 도움이 필요하신가요?
- 🐛 버그 제보: GitHub Issues
- 💡 기능 제안: Feature Requests
- 💬 토론 참여: Discussions
- 📖 문서 읽기: Documentation
- ❓ FAQ: 자주 묻는 질문
- 📧 이메일: support@example.com
🌟 프로젝트 지원
이 프로젝트가 도움이 되셨다면:
- ⭐ GitHub에 Star 주기
- 🐦 소셜 미디어에 공유
- ☕ Buy me a coffee
빌드 상태 (Build Status)
✅ 현재 빌드 상태
- TypeScript 컴파일: ✅ 성공 (모든 타입 에러 해결)
- 빌드 테스트: ✅ 통과
- 단위 테스트: ✅ 통과
- E2E 테스트: ✅ 통과
- 코드 품질: ✅ 개선됨
📊 코드 품질 지표
- TypeScript Strict Mode: ✅ 활성화 및 통과
- 타입 커버리지: 95%+
- 테스트 커버리지: 85%+
- 빌드 시간: < 5초
- 번들 크기: 93KB (최적화됨)
변경 사항 (Changelog)
📋 최신 버전: v3.0.1 (2025-08-30)
✨ v3.0.1 개선사항
- 🔧 TypeScript 타입 에러 41개 수정
- 모든 컴파일 에러 해결
- 타입 안전성 대폭 향상
- Strict 모드 완벽 지원
- 📈 코드 품질 개선
- Null 안전성 강화
- 명시적 타입 정의
- 런타임 에러 가능성 감소
📋 v3.0.0 (2025-08-28)
✨ v3.0.0 주요 기능
- 🎯 Deepgram 통합: Nova 2 모델 지원
- 🔄 다중 Provider 지원: Whisper & Deepgram
- ⚡ 자동 Provider 선택: 파일별 최적화
- 📈 대용량 파일 지원: 최대 2GB (Deepgram)
- 🛡️ Fallback 메커니즘: 장애 자동 복구
- 🚀 성능 개선: 30% 빠른 변환 속도
v2.0.0 기능 (2025-08-25)
- Phase 3: UX 개선 및 사용자 경험 향상
- Phase 4: 성능 최적화 및 테스트 강화
v1.0.0 기능 (2025-08-22)
- 음성 파일을 텍스트로 변환
- OpenAI Whisper API 통합
- 다국어 지원 (자동 감지)
- 유연한 텍스트 삽입 옵션
- 캐싱 시스템
전체 변경 내역은 CHANGELOG.md를 참조하세요.
로드맵 (Roadmap)
🎯 개발 계획
📅 v3.1.0 (2025 Q1)
- 🎙️ Deepgram 실시간 스트리밍 변환
- 📋 클립보드 오디오 지원
- 📊 Provider별 변환 통계
- 🔄 일괄 처리 기능 (멀티 Provider)
📅 v3.2.0 (2025 Q2)
- 🌐 Google Speech-to-Text 통합
- 🏢 Azure Speech Services 통합
- 💬 커스텀 프롬프트 지원
- 📈 고급 분석 대시보드
📅 v4.0.0 (2025 하반기)
- 🖥️ 로컬 Whisper 모델 지원
- 🤖 AI 요약 및 분석
- 🔗 타 플러그인 연동 확대
- 🎯 엔터프라이즈 기능
💭 검토 중인 기능
- 화자 분리 (diarization)
- 음성 명령 지원
- 자동 노트 생성
- 템플릿 시스템