asyouplz_SpeechNote/README.md
asyouplz a92b97ca18 fix: TypeScript 타입 에러 41개 수정 및 타입 안전성 개선
## 주요 변경사항

### 타입 시스템 개선
- 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>
2025-08-30 10:07:09 +09:00

20 KiB

Obsidian Speech-to-Text Plugin

Version License Obsidian OpenAI Deepgram

옵시디언에서 음성 파일을 텍스트로 변환하는 강력한 플러그인입니다.

Convert audio recordings to text directly in Obsidian using multiple AI providers (OpenAI Whisper, Deepgram).

English | 한국어


주요 기능 (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) - 준비 중

  1. 설정(Settings) → 커뮤니티 플러그인(Community plugins) 열기
  2. "Speech to Text" 검색
  3. 설치(Install) 후 활성화(Enable)

📦 수동 설치 (Manual Installation)

릴리즈 다운로드

  1. 최신 릴리즈 페이지에서 다운로드
  2. 압축 해제 후 파일들을 vault의 .obsidian/plugins/speech-to-text/ 폴더에 복사
  3. 옵시디언 재시작
  4. 설정 → 커뮤니티 플러그인에서 "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 선택

  1. 옵시디언 설정 → "Speech to Text"
  2. "Transcription Provider" 선택:
    • OpenAI Whisper: 고품질, 안정적
    • Deepgram: 빠른 속도, 대용량 지원
    • Auto: 자동 선택 (권장)

1. OpenAI API 키 발급 (Whisper 사용 시)

  1. OpenAI Platform 접속
  2. 계정 로그인 또는 회원가입
  3. "Create new secret key" 클릭
  4. 키 이름 입력 후 생성
  5. 생성된 키 복사 (⚠️ 한 번만 표시되므로 안전하게 저장)

2. Deepgram API 키 발급 (Deepgram 사용 시)

  1. Deepgram Console 접속
  2. 계정 생성 또는 로그인
  3. "API Keys" 메뉴 선택
  4. "Create a New API Key" 클릭
  5. 키 이름과 권한 설정 후 생성
  6. API 키 복사 및 안전하게 저장

3. 플러그인에 API 키 등록

  1. 옵시디언 설정 열기 (Cmd/Ctrl + ,)
  2. 왼쪽 메뉴에서 "Speech to Text" 선택
  3. 사용할 Provider의 API 키 입력:
    • "OpenAI API Key" (Whisper용)
    • "Deepgram API Key" (Deepgram용)
  4. 설정 저장

4. API 키 검증

  • OpenAI: sk- 로 시작하는 문자열
  • Deepgram: 40자 길이의 16진수 문자열
  • 각 Provider의 유료 계정 또는 크레딧 필요

사용 방법 (Usage)

📋 기본 사용법 (Basic Usage)

음성 파일 변환

  1. 명령 팔레트 열기: Cmd/Ctrl + P
  2. 명령 검색: "Transcribe audio file" 입력
  3. 파일 선택: 목록에서 음성 파일 선택
  4. 변환 대기: 진행 상태바 확인
  5. 완료: 텍스트가 노트에 자동 삽입

빠른 실행 (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)

  1. 녹음 품질: 조용한 환경에서 명확하게 녹음
  2. 파일 정리: 음성 파일을 전용 폴더에 보관
  3. 언어 설정: 특정 언어 고정 시 정확도 향상
  4. 캐시 활용: 동일 파일 재변환 시 캐시 사용

설정 옵션 (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 키 인증 실패

해결 방법:

  1. API 키가 sk-로 시작하는지 확인
  2. OpenAI 대시보드에서 키 상태 확인
  3. 키 앞뒤 공백 제거
  4. Whisper API 사용 권한 확인
  5. 크레디트 또는 결제 정보 확인

📁 "File too large" 오류

증상: 25MB 초과 파일 업로드 실패

해결 방법:

  1. 파일 크기 확인 (최대 25MB)
  2. 음성 파일 압축:
    # FFmpeg를 사용한 압축
    ffmpeg -i input.m4a -b:a 128k output.m4a
    
  3. 긴 녹음 분할:
    • 10-15분 단위로 녹음
    • 오디오 편집 도구 사용

🎵 "No Audio Files Found" 오류

증상: 음성 파일이 목록에 표시되지 않음

해결 방법:

  1. 지원 형식 확인: .m4a, .mp3, .wav, .mp4
  2. 파일이 vault 내부에 있는지 확인
  3. 옵시디언 재시작 (Cmd/Ctrl + R)
  4. 파일 인덱싱 대기 (큰 vault의 경우)

🌐 네트워크 오류

증상: "Network Error" 또는 타임아웃

해결 방법:

  1. 인터넷 연결 확인
  2. VPN/프록시 설정 확인
  3. 방화벽 설정 확인
  4. OpenAI API 상태 확인: status.openai.com

변환 속도 느림

증상: 변환이 예상보다 오래 걸림

해결 방법:

  1. 파일 크기 최적화 (10MB 이하 권장)
  2. 음질 설정 조정
  3. 캐시 기능 활성화
  4. 네트워크 속도 확인

기여하기 (Contributing)

🤝 기여 환영!

이 프로젝트는 커뮤니티 기여를 환영합니다. 기여 가이드를 참고해주세요.

📝 기여 방법

  1. Fork: 저장소 Fork
  2. Branch: 기능 브랜치 생성
    git checkout -b feature/amazing-feature
    
  3. Commit: 변경사항 커밋
    git commit -m 'feat: add amazing feature'
    
  4. Push: 브랜치에 푸시
    git push origin feature/amazing-feature
    
  5. 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에 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)
  • 음성 명령 지원
  • 자동 노트 생성
  • 템플릿 시스템

Made with ❤️ for the Obsidian community

옵시디언 커뮤니티를 위해 정성을 다해 만들었습니다.

⬆ 맨 위로