whisper-windows-mcp 2.2.2 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{LICENSE-COMMERCIAL.md → COMMERCIAL-LICENSE.md} +58 -58
- package/LICENSE +40 -40
- package/PRIVACY.es.md +192 -135
- package/PRIVACY.id.md +192 -135
- package/PRIVACY.ja.md +192 -135
- package/PRIVACY.ko.md +192 -135
- package/PRIVACY.md +192 -135
- package/PRIVACY.pl.md +192 -135
- package/PRIVACY.pt-BR.md +192 -135
- package/PRIVACY.ro.md +192 -135
- package/PRIVACY.uk.md +192 -135
- package/PRIVACY.vi.md +192 -135
- package/README.es.md +74 -48
- package/README.id.md +77 -40
- package/README.ja.md +100 -72
- package/README.ko.md +63 -37
- package/README.md +76 -39
- package/README.pl.md +77 -40
- package/README.pt-BR.md +71 -45
- package/README.ro.md +78 -41
- package/README.uk.md +77 -40
- package/README.vi.md +67 -41
- package/ROADMAP.es.md +110 -48
- package/ROADMAP.id.md +77 -104
- package/ROADMAP.ja.md +84 -123
- package/ROADMAP.ko.md +73 -97
- package/ROADMAP.pl.md +104 -44
- package/ROADMAP.pt-BR.md +78 -102
- package/ROADMAP.ro.md +102 -44
- package/ROADMAP.uk.md +65 -97
- package/ROADMAP.vi.md +78 -102
- package/SECURITY.es.md +64 -47
- package/SECURITY.id.md +64 -47
- package/SECURITY.ja.md +64 -47
- package/SECURITY.ko.md +64 -47
- package/SECURITY.md +21 -4
- package/SECURITY.pl.md +64 -47
- package/SECURITY.pt-BR.md +64 -47
- package/SECURITY.ro.md +64 -47
- package/SECURITY.uk.md +64 -47
- package/SECURITY.vi.md +64 -47
- package/TROUBLESHOOTING.es.md +309 -323
- package/TROUBLESHOOTING.id.md +333 -323
- package/TROUBLESHOOTING.ja.md +399 -286
- package/TROUBLESHOOTING.ko.md +309 -323
- package/TROUBLESHOOTING.pl.md +355 -323
- package/TROUBLESHOOTING.pt-BR.md +309 -323
- package/TROUBLESHOOTING.ro.md +355 -323
- package/TROUBLESHOOTING.uk.md +369 -323
- package/TROUBLESHOOTING.vi.md +309 -323
- package/dist/index.js +591 -216
- package/package.json +45 -45
- package/patch_roadmaps.py +0 -72
package/ROADMAP.ko.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# whisper-windows-mcp — 로드맵
|
|
2
2
|
|
|
3
|
-
현재 버전: **v2.
|
|
3
|
+
현재 버전: **v2.3.0**
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -54,104 +54,75 @@ FFprobe를 사용한 `analyze_media` 도구: 재생 시간, 크기, 코덱, 전
|
|
|
54
54
|
### ✅ v2.0.0 — Unicode 안전 경로 + 백그라운드 SRT
|
|
55
55
|
**Unicode 파일명:** 파일명에 비ASCII 문자가 있는 경우 백그라운드 전사가 조용히 실패하던 문제 수정. 모든 출력을 정제된 작업 ID 기반 임시 경로를 통해 라우팅하고 완료 후 올바른 목적지로 이동하도록 변경.
|
|
56
56
|
|
|
57
|
-
**백그라운드 모드 SRT:** `spawnDetached`가 요청된 포맷에 관계없이 `-otxt`를
|
|
57
|
+
**백그라운드 모드 SRT:** `spawnDetached`가 요청된 포맷에 관계없이 `-otxt`를 하드코딩하던 문제 수정. `spawnDetached`에 `outputFormat` 파라미터를 추가하여 백그라운드 모드에서 `text` 및 `srt` 출력 지원.
|
|
58
58
|
|
|
59
59
|
### ✅ v2.0.1 — 버그 수정 (v2.2.0에 포함)
|
|
60
|
-
- `buildArgs`와 `spawnDetached` 모두에 `--max-context 0` 하드코딩 — 장시간 음성에서 환각 루프 방지.
|
|
60
|
+
- `buildArgs`와 `spawnDetached` 모두에 `--max-context 0` 하드코딩 — 장시간 음성에서 환각 루프 방지.
|
|
61
61
|
- 양 함수에 `--no-speech-thold 0.6` 하드코딩 — 신뢰도 임계값 미만의 세그먼트를 환각된 콘텐츠 대신 무음으로 처리.
|
|
62
62
|
- 경로 검증(`validateInputPath`) — UNC 경로 및 `..` 탐색 거부.
|
|
63
63
|
- `MAX_FILE_SIZE_MB = 10240` 파일 크기 가드.
|
|
64
64
|
- `transcribeSingle`에 전사 인젝션 보안 주석 추가.
|
|
65
|
-
- TROUBLESHOOTING.md에서 손상된 CLI 배치 명령
|
|
65
|
+
- TROUBLESHOOTING.md에서 손상된 CLI 배치 명령 수정.
|
|
66
66
|
|
|
67
67
|
### ✅ v2.1.0 — 모델 관리 스위트 (v2.2.0에 포함)
|
|
68
68
|
- `WHISPER_MODEL`을 `const`에서 `let`으로 변경 (세션 변경 가능).
|
|
69
69
|
- `MODEL_REGISTRY` — 16개 모델, 전체 정밀도 및 양자화 변형, Hugging Face 다운로드 URL.
|
|
70
70
|
- `ALLOWED_HF_PREFIXES` — 다운로드를 `ggerganov/whisper.cpp` 및 `ggml-org` 네임스페이스로 제한하는 URL 허용 목록.
|
|
71
71
|
- `list_models` 도구 — 모델 디렉터리 스캔, 활성 모델, 크기, 사용 사례, 사용 가능한 다운로드 표시.
|
|
72
|
-
- `download_model` 도구 — Node.js 내장 `https`를 통해 Hugging Face에서 다운로드, 원자적 이름
|
|
72
|
+
- `download_model` 도구 — Node.js 내장 `https`를 통해 Hugging Face에서 다운로드, 원자적 이름 변경.
|
|
73
73
|
- `switch_model` 도구 — `.bin` 확장자 검증, 디렉터리 제약, 프로세스 잠금 확인.
|
|
74
74
|
- `recommendedModel()` 업데이트 — 6GB 이상 VRAM에서 `large-v3-turbo` 권장.
|
|
75
75
|
|
|
76
|
-
### ✅ v2.2.0 — 품질, 파라미터, 하드웨어 확장
|
|
76
|
+
### ✅ v2.2.0 — 품질, 파라미터, 하드웨어 확장
|
|
77
77
|
- `buildArgs`의 위치 인수를 대체하는 `WhisperOptions` 인터페이스.
|
|
78
78
|
- `transcribe_audio`의 새 파라미터: `temperature`, `prompt`, `condition_on_prev_text`, `no_speech_thold`, `beam_size`, `best_of`, `gpu_device`, `processors`, `word_timestamps`, `max_segment_length`, `split_on_word`, `diarize`, `vad_model`, `offset_t`, `duration`.
|
|
79
79
|
- `generate_subtitles`의 새 파라미터: `temperature`, `prompt`, `beam_size`, `best_of`, `diarize`, `vad_model`.
|
|
80
80
|
- `spawnDetached` 리팩토링 — 백그라운드/배치 모드에서 모든 품질 플래그가 적용됨.
|
|
81
|
-
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
`
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
이 격차는 "데이터가 머신을 떠나지 않는다"는 메시지를 음성에서 파생된 모든 콘텐츠가 로컬에 남아 있다는 의미로 합리적으로 해석하는 사용자에게 보이지 않습니다.
|
|
121
|
-
|
|
122
|
-
`WHISPER_PRIVACY_MODE`를 `claude_desktop_config.json`의 환경 변수로 추가합니다. 활성화 시:
|
|
123
|
-
- 모든 도구 응답은 메타데이터만 반환: 파일명, 재생 시간, 단어 수, 완료 상태
|
|
124
|
-
- 어떤 도구 응답에도 전사 텍스트가 포함되지 않음
|
|
125
|
-
- Claude는 어떤 형태로도 전사 콘텐츠를 읽거나 분석하거나 중계할 수 없음
|
|
126
|
-
- 전사본은 로컬 `.txt` 파일로만 존재
|
|
127
|
-
|
|
128
|
-
이것은 의료, 법률, 재정, 기업 배포에 적합한 설정입니다. API 호출 없음, 데이터 전송 없음, 컴플라이언스 위험 없음.
|
|
129
|
-
|
|
130
|
-
### 전사 콘텐츠에 대한 동의 게이트
|
|
131
|
-
`WHISPER_PRIVACY_MODE`가 활성화되지 않은 경우(기본값), 전사 텍스트를 포함하는 도구 응답은 세션당 첫 번째 사용 시 공개 알림이 앞에 와야 합니다. 이 알림은 전사 텍스트가 Anthropic의 API에 전송된다는 것, 이것이 "데이터가 머신을 떠나지 않는다"는 보장의 범위 밖임을, 규제 대상 콘텐츠를 처리하는 사용자는 진행하기 전에 컴플라이언스 의무를 확인해야 한다는 것을 명확히 전달해야 합니다.
|
|
132
|
-
|
|
133
|
-
구현: 기본값이 `false`인 `WHISPER_CONSENT_ACKNOWLEDGED` 환경 변수. 세션당 첫 번째 전사본 반환 시 승인되지 않은 경우 Claude가 공개 알림을 제시하고 명시적 확인을 요청합니다. 세션 동안 한 번 승인되면 이후 전사본은 재프롬프트 없이 반환됩니다.
|
|
134
|
-
|
|
135
|
-
### `PRIVACY.md` 문서
|
|
136
|
-
리포지토리 루트에 `PRIVACY.md` 생성:
|
|
137
|
-
- 항상 로컬에 남는 데이터: 음성, 동영상, 모델 파일
|
|
138
|
-
- 기본값으로 로컬을 떠날 수 있는 데이터: 도구 응답의 전사 텍스트
|
|
139
|
-
- 개인 정보 모드로 절대 로컬을 떠나지 않는 데이터: 모든 것
|
|
140
|
-
- 산업별 컴플라이언스 프레임워크 안내 (HIPAA, GDPR, 변호사-의뢰인 특권, FERPA, SOX, PCI-DSS, NDA/영업 비밀)
|
|
141
|
-
- 개인 정보 모드 설정 방법
|
|
142
|
-
- 도구 작성자가 법률 고문이 아니라는 면책 조항
|
|
143
|
-
|
|
144
|
-
### 도구 스키마 개인 정보 경고
|
|
145
|
-
전사 텍스트를 반환하는 도구에 개인 정보 참고 사항을 포함하도록 `ListToolsRequestSchema` 도구 설명을 업데이트합니다. Claude Desktop의 도구 설명에 표시되어 사용 시점에서 인식을 높입니다.
|
|
146
|
-
|
|
147
|
-
### 임시 디렉터리 자동 정리
|
|
148
|
-
`%TEMP%\whisper-mcp-jobs\`는 시간이 지남에 따라 작업 상태 및 로그 파일을 축적합니다. 설정 가능한 보존 기간(기본값: 7일)이 지난 완료된 작업 파일의 자동 정리를 추가합니다. 현재는 사용자가 수동으로 `Remove-Item`을 실행해야 합니다.
|
|
81
|
+
- 배치 출력 수정 — `readBatchProgress`가 검증 전에 임시 출력을 최종 목적지로 이동하도록 수정.
|
|
82
|
+
|
|
83
|
+
**플래그 호환성 참고:** `gpu_device` / `--device`는 whisper.cpp v1.8.4에서 추가되었습니다. 릴리스의 사전 빌드된 Vulkan 바이너리는 v1.8.3 세대 — 이 파라미터는 도구에서 허용되지만 사용자가 v1.8.4 이상 바이너리로 업데이트할 때까지 효과가 없습니다.
|
|
84
|
+
|
|
85
|
+
### ✅ v2.2.2 — 패치
|
|
86
|
+
- 이중 라이선스 수정 — LICENSE 및 LICENSE-COMMERCIAL.md 교정.
|
|
87
|
+
- 사소한 문서 수정.
|
|
88
|
+
|
|
89
|
+
### ✅ v2.3.0 — 배치 자동 진행, 개인 정보 아키텍처, 출력 포맷 확장
|
|
90
|
+
|
|
91
|
+
**배치 자동 진행 (치명적 버그 수정):** `start_batch`가 큐를 진행하기 위해 이전에 활성 폴링이 필요했습니다. 이제 생성된 각 whisper-cli 자식 프로세스에 `on('exit')` 핸들러가 연결됩니다. 프로세스가 종료되면 배치가 exit 콜백을 통해 즉시 자동 진행됩니다 — 폴링 오버헤드와 API 호출 비용이 없습니다. 동시 exit 핸들러 + `check_batch_progress` 호출 간의 이중 생성을 뮤텍스로 방지합니다.
|
|
92
|
+
|
|
93
|
+
**개인 정보 아키텍처:**
|
|
94
|
+
- `WHISPER_PRIVACY_MODE` 환경 변수 — `true`로 설정 시 모든 도구 응답은 메타데이터만 반환합니다(파일명, 단어 수, 저장 경로). 전사 텍스트가 Claude의 API에 전송되지 않습니다. 전사본은 로컬 파일로만 존재합니다.
|
|
95
|
+
- `WHISPER_CONSENT_ACKNOWLEDGED` 환경 변수 — `true`로 설정 시 민감하지 않은 콘텐츠에 대한 일회성 세션 동의 게이트를 억제합니다.
|
|
96
|
+
- `transcribe_audio`, `transcribe_batch`, `start_batch`, `check_progress`에 `privacy_mode` 호출별 파라미터. 전역 환경 변수를 양방향으로 재정의. 토글에 재시작 불필요.
|
|
97
|
+
- 개인 정보 모드 게이트(`checkPrivacyGate()`) — 유효 개인 정보 모드가 활성화된 경우 모든 작업 전에 실행. 첫 번째 호출 시 활성화(공개 표시), 두 번째 호출 시 해제(허용). 각 작업 후 초기화. 세션 동의 게이트와 완전히 독립적.
|
|
98
|
+
- 세션 동의 게이트(`transcriptPolicy()`) — 기본 모드에서 첫 번째 전사본 반환 호출 전에 세션당 한 번 실행. `sessionConsentGiven` 플래그로 소비.
|
|
99
|
+
- `PRIVACY.md` — HIPAA, GDPR, 변호사-의뢰인 특권, FERPA, SOX, PCI-DSS, NDA/영업 비밀을 다루는 전체 컴플라이언스 문서.
|
|
100
|
+
- 전사 텍스트를 반환하는 모든 도구의 도구 설명 개인 정보 경고.
|
|
101
|
+
|
|
102
|
+
**출력 포맷 확장:**
|
|
103
|
+
- `vtt` — `-ovtt`를 통한 WebVTT 자막 출력. `transcribe_audio`, `generate_subtitles`, `start_batch`, 백그라운드 모드에서 사용 가능.
|
|
104
|
+
- `lrc` — `-olrc`를 통한 LRC 가사/카라오케 포맷. `transcribe_audio` 및 백그라운드 모드에서 사용 가능.
|
|
105
|
+
- `csv` — `-ocsv`를 통한 타임스탬프가 있는 CSV. `transcribe_audio` 및 백그라운드 모드에서 사용 가능.
|
|
106
|
+
- `output_format` 기본값이 모든 도구 및 코드 경로에서 `"text"`에서 `"timestamps"`로 변경됨. 일반 텍스트는 이제 선택 사항.
|
|
107
|
+
|
|
108
|
+
**버그 수정:**
|
|
109
|
+
- 버그 1: `output_format`이 백그라운드 작업에 전달되지 않음 — 요청된 포맷에 관계없이 기본 `"text"`가 사용되었습니다. 기본값을 `"timestamps"`로 변경하고 올바르게 전달하도록 수정.
|
|
110
|
+
- 버그 2: 백그라운드 작업 출력 이동 작업의 조용한 `catch {}` 가 실패를 삼켰습니다. 이동 후 명시적 `existsSync` 확인과 상세 실패 메시지를 추가.
|
|
111
|
+
- 버그 3: 백그라운드 생성 지점에 비개인 정보 백그라운드 작업에 대해 동의 게이트가 의도적으로 `check_progress`로 연기되는 이유를 설명하는 설계 주석 추가.
|
|
112
|
+
|
|
113
|
+
**추가:**
|
|
114
|
+
- 임시 디렉터리 자동 정리 — `cleanupOldJobFiles()`가 시작 시 실행되어 `%TEMP%\whisper-mcp-jobs\`에서 7일이 지난 `.json` 및 `.log` 파일을 삭제합니다.
|
|
115
|
+
- `check_config`가 이제 개인 정보 모드 상태를 보고합니다.
|
|
116
|
+
- 시작 로그에 개인 정보 모드 켜짐/꺼짐이 보고됩니다.
|
|
117
|
+
- `Job` 인터페이스에 `privacyMode: boolean` 필드가 추가됩니다.
|
|
118
|
+
- `BatchState` 인터페이스에 `privacyMode: boolean` 필드가 추가됩니다.
|
|
119
|
+
- `BackgroundFormat` 타입이 `json`을 제외합니다(백그라운드 모드의 json은 지원되지 않음 — `text`로 폴백).
|
|
149
120
|
|
|
150
121
|
---
|
|
151
122
|
|
|
152
|
-
## 계획됨 — Bun 마이그레이션
|
|
123
|
+
## 계획됨 — v2.4.0: Bun 마이그레이션
|
|
153
124
|
|
|
154
|
-
|
|
125
|
+
런타임을 Node.js에서 [Bun](https://bun.sh)으로 마이그레이션합니다.
|
|
155
126
|
|
|
156
127
|
Claude Desktop은 모든 세션 시작 시 MCP 서버를 새로 생성하므로 시작 시간이 임계 경로에 있습니다. Bun은 컴파일 단계 없이 TypeScript를 네이티브로 실행하고, Node보다 상당히 빠르게 시작하며, I/O도 빠릅니다.
|
|
157
128
|
|
|
@@ -167,30 +138,25 @@ Claude Desktop은 모든 세션 시작 시 MCP 서버를 새로 생성하므로
|
|
|
167
138
|
- 모든 도구 동작 및 출력 포맷
|
|
168
139
|
- 최종 사용자의 Claude Desktop 설정
|
|
169
140
|
|
|
170
|
-
**개인 정보 이후, v2.3.0 이전에 마이그레이션하는 이유:** 코드베이스는 지금이 마이그레이션하기 가장 쉬운 상태입니다. 도구 추가 후 마이그레이션하면 작업량만 늘어나고 이점이 없습니다. 개인 정보 아키텍처는 위에서 설명한 대로 먼저 출시되어야 합니다.
|
|
171
|
-
|
|
172
141
|
---
|
|
173
142
|
|
|
174
|
-
##
|
|
175
|
-
|
|
176
|
-
whisper-windows-mcp는 이중 라이선스를 적용합니다.
|
|
177
|
-
|
|
178
|
-
**비상업적 사용:** MIT — 개인, 교육, 비상업적 목적의 사용은 무료입니다. [LICENSE](LICENSE)를 참조하세요.
|
|
143
|
+
## 계획됨 — v2.5.0: 외부 도구 통합을 위한 향상된 출력 포맷
|
|
179
144
|
|
|
180
|
-
|
|
145
|
+
다운스트림 분석 및 통합 워크플로우를 대상으로 하는 확장된 출력 포맷 지원. 정확한 범위는 v2.3.0 이후 사용자 피드백을 기반으로 결정됩니다.
|
|
181
146
|
|
|
182
|
-
|
|
147
|
+
---
|
|
183
148
|
|
|
184
|
-
## 계획됨 — v2.
|
|
149
|
+
## 계획됨 — v2.6.0: 실시간 마이크 전사 모드
|
|
185
150
|
|
|
186
|
-
|
|
187
|
-
SRT와 함께 WebVTT(`.vtt`) 출력. VTT는 YouTube, HTML5 `<video>`, 대부분의 최신 플레이어가 사용하는 웹 표준입니다. whisper-cli가 네이티브로 지원합니다. `transcribe_audio`, `generate_subtitles`, `spawnDetached`에 `vtt`를 유효한 출력 포맷으로 추가. `buildArgs`와 관련된 모든 도구 스키마, README, 한국어 문서를 업데이트합니다.
|
|
151
|
+
라이브 마이크 입력에서의 실시간 전사. 선택된 녹음 장치에서 오디오를 청크 단위로 whisper에 스트리밍하여 완료된 전사 세그먼트를 롤링 방식으로 반환합니다.
|
|
188
152
|
|
|
189
|
-
|
|
190
|
-
|
|
153
|
+
**설계 제약:**
|
|
154
|
+
- 장치 선택은 명시적이어야 함 — 조용한 기본 장치 캡처 없음
|
|
155
|
+
- 사용자가 Claude Desktop 상호작용을 통해 스트림을 중지할 수 있어야 함
|
|
156
|
+
- 한 번에 하나의 whisper 인스턴스 제약을 위반해서는 안 됨
|
|
157
|
+
- 지연 시간 대 정확도 절충은 사용자가 설정 가능해야 함
|
|
191
158
|
|
|
192
|
-
|
|
193
|
-
`-ocsv`를 통한 CSV(`.csv`) 출력. 세그먼트 타이밍이 있는 구조화된 표 형식 데이터 — 다운스트림 분석, 클립 정렬 워크플로우, 스프레드시트 도구 가져오기에 유용합니다. 구현 비용이 없습니다 — 네이티브 CLI 플래그.
|
|
159
|
+
**상태:** 설계 단계. whisper.cpp의 안정적인 스트리밍 API에 의존합니다.
|
|
194
160
|
|
|
195
161
|
---
|
|
196
162
|
|
|
@@ -225,7 +191,7 @@ yt-dlp를 통해 YouTube URL에서 직접 전사. 단일 단계에서 음성 다
|
|
|
225
191
|
### 화자 분리 (pyannote-audio)
|
|
226
192
|
화자 ID 레이블이 있는 완전한 모노 화자 분리 — 채널 구성에 관계없이 전체 녹음에서 화자 전환을 표시합니다. 내장 `--diarize` 스테레오 플래그(v2.2.0) 및 TinyDiarize와는 다릅니다.
|
|
227
193
|
|
|
228
|
-
**구현:** [pyannote-audio](https://github.com/pyannote/pyannote-audio)가 필요 — Hugging Face 모델 접근 토큰이 필요한 Python 기반 라이브러리.
|
|
194
|
+
**구현:** [pyannote-audio](https://github.com/pyannote/pyannote-audio)가 필요 — Hugging Face 모델 접근 토큰이 필요한 Python 기반 라이브러리. 완전히 별개의 의존성 스택.
|
|
229
195
|
|
|
230
196
|
**상태:** 자체 설정 문서가 있는 선택적 고급 기능으로 계획됨. 메인 패키지에 포함되지 않음.
|
|
231
197
|
|
|
@@ -247,15 +213,25 @@ Whisper의 `--translate` 플래그는 영어만 대상으로 합니다. 임의
|
|
|
247
213
|
|
|
248
214
|
---
|
|
249
215
|
|
|
216
|
+
## 라이선싱
|
|
217
|
+
|
|
218
|
+
whisper-windows-mcp는 이중 라이선스를 적용합니다.
|
|
219
|
+
|
|
220
|
+
**비상업적 사용:** MIT — 개인, 교육, 비상업적 목적의 사용은 무료입니다. [LICENSE](LICENSE)를 참조하세요.
|
|
221
|
+
|
|
222
|
+
**상업적 사용:** 비즈니스, 전문적 또는 수익 창출 목적의 사용에는 별도의 상업용 라이선스가 필요합니다. [COMMERCIAL-LICENSE.md](COMMERCIAL-LICENSE.md)를 참조하세요.
|
|
223
|
+
|
|
224
|
+
---
|
|
225
|
+
|
|
250
226
|
## 배포
|
|
251
227
|
|
|
252
|
-
[npm](https://www.npmjs.com/package/whisper-windows-mcp), [mcpservers.org](https://mcpservers.org), [Glama](https://glama.ai)에서 사용
|
|
228
|
+
[npm](https://www.npmjs.com/package/whisper-windows-mcp), [mcpservers.org](https://mcpservers.org), [Glama](https://glama.ai), [awesome-mcp-servers](https://github.com/punkpeye/awesome-mcp-servers)에서 사용 가능 (PR 제출됨).
|
|
253
229
|
|
|
254
230
|
---
|
|
255
231
|
|
|
256
232
|
## 다국어 문서
|
|
257
233
|
|
|
258
|
-
|
|
234
|
+
각 릴리스 후 다음 파일을 영어 문서에 맞게 업데이트해야 합니다:
|
|
259
235
|
|
|
260
236
|
**일본어 (`*.ja.md`)** — `README.ja.md` / `TROUBLESHOOTING.ja.md` / `ROADMAP.ja.md` / `PRIVACY.ja.md` / `SECURITY.ja.md`
|
|
261
237
|
|
|
@@ -271,9 +247,9 @@ Whisper의 `--translate` 플래그는 영어만 대상으로 합니다. 임의
|
|
|
271
247
|
|
|
272
248
|
**스페인어 (`*.es.md`)** — `README.es.md` / `TROUBLESHOOTING.es.md` / `ROADMAP.es.md` / `PRIVACY.es.md` / `SECURITY.es.md`
|
|
273
249
|
|
|
274
|
-
|
|
250
|
+
**폴란드어 (`*.pl.md`)** — `README.pl.md` / `TROUBLESHOOTING.pl.md` / `ROADMAP.pl.md` / `PRIVACY.pl.md` / `SECURITY.pl.md`
|
|
275
251
|
|
|
276
|
-
|
|
252
|
+
**루마니아어 (`*.ro.md`)** — `README.ro.md` / `TROUBLESHOOTING.ro.md` / `ROADMAP.ro.md` / `PRIVACY.ro.md` / `SECURITY.ro.md`
|
|
277
253
|
|
|
278
254
|
다른 언어로의 커뮤니티 기여를 환영합니다.
|
|
279
255
|
|
package/ROADMAP.pl.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# whisper-windows-mcp — Plan rozwoju
|
|
2
2
|
|
|
3
|
-
Aktualna wersja: **v2.
|
|
3
|
+
Aktualna wersja: **v2.3.0**
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -54,7 +54,7 @@ Architektura odłączonego procesu: `transcribe_audio` z `background=true` uruch
|
|
|
54
54
|
### ✅ v2.0.0 — Bezpieczne ścieżki Unicode + SRT w tle
|
|
55
55
|
**Nazwy plików Unicode:** Pliki z niezgodnymi z ASCII znakami w nazwach powodowały ciche niepowodzenia transkrypcji w tle. Naprawiono przez kierowanie całego wyjścia przez oczyszczoną tymczasową ścieżkę opartą na ID zadania, następnie przenoszenie wyniku do właściwego miejsca docelowego po zakończeniu.
|
|
56
56
|
|
|
57
|
-
**SRT w trybie tle:** `spawnDetached` wcześniej na stałe kodował `-otxt` niezależnie od żądanego formatu
|
|
57
|
+
**SRT w trybie tle:** `spawnDetached` wcześniej na stałe kodował `-otxt` niezależnie od żądanego formatu. Naprawiono dodając parametr `outputFormat` do `spawnDetached`, obsługując wyjście `text` i `srt` w trybie tle.
|
|
58
58
|
|
|
59
59
|
### ✅ v2.0.1 — Poprawki błędów (włączone do v2.2.0)
|
|
60
60
|
- `--max-context 0` zakodowane na stałe w `buildArgs` i `spawnDetached` — zapobiega pętlom halucynacji na długim audio.
|
|
@@ -73,103 +73,161 @@ Architektura odłączonego procesu: `transcribe_audio` z `background=true` uruch
|
|
|
73
73
|
- Narzędzie `switch_model` — waliduje rozszerzenie `.bin`, ograniczenie katalogu, sprawdzenie blokady procesu.
|
|
74
74
|
- Zaktualizowano `recommendedModel()` do rekomendowania `large-v3-turbo` dla VRAM 6GB+.
|
|
75
75
|
|
|
76
|
-
### ✅ v2.2.0 — Rozszerzenie jakości, parametrów i sprzętu
|
|
76
|
+
### ✅ v2.2.0 — Rozszerzenie jakości, parametrów i sprzętu
|
|
77
77
|
- Interfejs `WhisperOptions` zastępujący argumenty pozycyjne w `buildArgs`.
|
|
78
78
|
- Nowe parametry w `transcribe_audio`: `temperature`, `prompt`, `condition_on_prev_text`, `no_speech_thold`, `beam_size`, `best_of`, `gpu_device`, `processors`, `word_timestamps`, `max_segment_length`, `split_on_word`, `diarize`, `vad_model`, `offset_t`, `duration`.
|
|
79
79
|
- Nowe parametry w `generate_subtitles`: `temperature`, `prompt`, `beam_size`, `best_of`, `diarize`, `vad_model`.
|
|
80
80
|
- Zrefaktoryzowano `spawnDetached` — wszystkie flagi jakości są teraz stosowane w trybie tle/partia.
|
|
81
81
|
- Naprawiono wyjście partii — `readBatchProgress` teraz przenosi tymczasowe wyjście do końcowego miejsca docelowego przed weryfikacją.
|
|
82
82
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
## Krytyczny błąd — Automatyczne przesuwanie partii (potwierdzony, oczekuje naprawy)
|
|
83
|
+
**Uwaga dotycząca zgodności flag:** `gpu_device` / `--device` zostało dodane w whisper.cpp v1.8.4. Gotowe binarium Vulkan w wydaniach jest w wersji v1.8.3 — ten parametr jest akceptowany przez narzędzie, ale nie będzie miał efektu dopóki użytkownicy nie zaktualizują do binarium v1.8.4+.
|
|
86
84
|
|
|
87
|
-
###
|
|
85
|
+
### ✅ v2.2.2 — Łatka
|
|
86
|
+
- Naprawa podwójnej licencji — LICENSE i LICENSE-COMMERCIAL.md poprawione.
|
|
87
|
+
- Drobne poprawki dokumentacji.
|
|
88
88
|
|
|
89
|
-
|
|
89
|
+
### ✅ v2.3.0 — Automatyczne przesuwanie partii, architektura prywatności, rozszerzenie formatów wyjściowych
|
|
90
90
|
|
|
91
|
-
**
|
|
91
|
+
**Automatyczne przesuwanie partii (krytyczna naprawa błędu):** `start_batch` wcześniej wymagało aktywnego odpytywania do przesuwania kolejki. Do każdego uruchomionego procesu potomnego whisper-cli jest teraz dołączony handler `on('exit')`. Gdy proces wychodzi, partia samodzielnie przesuwa się przez callback wyjścia z zerowym kosztem odpytywania i zerowymi wywołaniami API. Mutex zapobiega podwójnemu uruchomieniu między równoległym handlerem wyjścia a wywołaniami `check_batch_progress`.
|
|
92
92
|
|
|
93
|
-
**
|
|
93
|
+
**Architektura prywatności:**
|
|
94
|
+
- Zmienna środowiskowa `WHISPER_PRIVACY_MODE` — gdy `true`, wszystkie odpowiedzi narzędzi zwracają tylko metadane (nazwa pliku, liczba słów, ścieżka zapisu). Żaden tekst transkrypcji nie jest nigdy przesyłany do API Claude. Transkrypcje istnieją tylko jako lokalne pliki.
|
|
95
|
+
- Zmienna środowiskowa `WHISPER_CONSENT_ACKNOWLEDGED` — gdy `true`, pomija jednorazową bramę zgody dla sesji dla treści niepoufnych.
|
|
96
|
+
- Parametr `privacy_mode` dla pojedynczego wywołania w `transcribe_audio`, `transcribe_batch`, `start_batch` i `check_progress`. Zastępuje globalną zmienną środowiskową w obu kierunkach. Nie wymaga restartu do przełączania per wywołanie.
|
|
97
|
+
- Brama trybu prywatności (`checkPrivacyGate()`) — uruchamia się przed każdą operacją, gdy efektywny tryb prywatności jest aktywny.
|
|
98
|
+
- Brama zgody sesji (`transcriptPolicy()`) — uruchamia się raz na sesję przed pierwszym wywołaniem zwracającym transkrypcję w trybie standardowym.
|
|
99
|
+
- `PRIVACY.md` — pełna dokumentacja zgodności obejmująca HIPAA, RODO, tajemnicę adwokacką, FERPA, SOX, PCI-DSS i NDA/tajemnicę handlową.
|
|
94
100
|
|
|
95
|
-
|
|
101
|
+
**Rozszerzenie formatów wyjściowych:**
|
|
102
|
+
- `vtt` — wyjście WebVTT przez `-ovtt`. Dostępne w `transcribe_audio`, `generate_subtitles`, `start_batch` i trybie tle.
|
|
103
|
+
- `lrc` — format LRC tekstu/karaoke przez `-olrc`. Dostępne w `transcribe_audio` i trybie tle.
|
|
104
|
+
- `csv` — CSV ze znacznikami czasu przez `-ocsv`. Dostępne w `transcribe_audio` i trybie tle.
|
|
105
|
+
- Domyślny `output_format` zmieniony z `"text"` na `"timestamps"` we wszystkich narzędziach i ścieżkach kodu.
|
|
96
106
|
|
|
97
|
-
|
|
107
|
+
**Naprawki błędów:**
|
|
108
|
+
- Błąd 1: `output_format` nie był przekazywany do zadań w tle — niezależnie od żądanego formatu używany był domyślny `"text"`. Naprawiono przez zmianę domyślnego na `"timestamps"` i poprawne przekazywanie.
|
|
109
|
+
- Błąd 2: Cichy `catch {}` w operacji przenoszenia wyjścia zadania w tle ukrywał niepowodzenia. Dodano jawne sprawdzenie `existsSync` ze szczegółowym komunikatem o błędzie po przeniesieniu.
|
|
110
|
+
- Błąd 3: Dodano komentarz projektowy w punkcie uruchamiania w tle dokumentujący, dlaczego brama zgody jest celowo odroczona do `check_progress` dla zadań w tle bez trybu prywatności.
|
|
98
111
|
|
|
99
|
-
|
|
100
|
-
|
|
112
|
+
**Dodatkowo:**
|
|
113
|
+
- Automatyczne czyszczenie katalogu tymczasowego — `cleanupOldJobFiles()` uruchamia się przy starcie, usuwa pliki `.json` i `.log` starsze niż 7 dni z `%TEMP%\whisper-mcp-jobs\`.
|
|
114
|
+
- `check_config` teraz raportuje status trybu prywatności.
|
|
115
|
+
- Dziennik startowy raportuje włączenie/wyłączenie trybu prywatności.
|
|
101
116
|
|
|
102
|
-
|
|
103
|
-
Gdy `WHISPER_PRIVACY_MODE` nie jest włączony (domyślnie), każda odpowiedź narzędzia zawierająca tekst transkrypcji musi być poprzedzona ujawnieniem przy pierwszym użyciu w sesji.
|
|
117
|
+
---
|
|
104
118
|
|
|
105
|
-
|
|
106
|
-
Utwórz `PRIVACY.md` w katalogu głównym repozytorium obejmujący pełne wskazówki dotyczące prywatności i ramy zgodności.
|
|
119
|
+
## Planowane — v2.4.0: Migracja do Bun
|
|
107
120
|
|
|
108
|
-
|
|
109
|
-
Dodaj automatyczne czyszczenie ukończonych plików zadań po konfigurowalnym oknie retencji (domyślnie: 7 dni).
|
|
121
|
+
Migracja środowiska uruchomieniowego z Node.js do [Bun](https://bun.sh).
|
|
110
122
|
|
|
111
|
-
|
|
123
|
+
Ponieważ Claude Desktop uruchamia serwer MCP na nowo przy każdym starcie sesji, czas uruchamiania jest na ścieżce krytycznej. Bun uruchamia TypeScript natywnie bez kroku kompilacji, startuje znacznie szybciej niż Node i ma szybszy I/O.
|
|
112
124
|
|
|
113
|
-
|
|
125
|
+
**Co się zmienia:**
|
|
126
|
+
- Eliminacja kroku budowania `tsc` i katalogu `dist/`
|
|
127
|
+
- Użytkownicy uruchamiają kod TypeScript bezpośrednio
|
|
128
|
+
- `tsconfig.json` staje się opcjonalny
|
|
129
|
+
- Aktualizacja skryptów `package.json`
|
|
130
|
+
- Aktualizacja przepływu pracy publikacji npm
|
|
114
131
|
|
|
115
|
-
|
|
132
|
+
**Co się nie zmienia:**
|
|
133
|
+
- Kod źródłowy `src/index.ts` — Bun jest kompatybilny z istniejącym TypeScript i wbudowanymi API Node.js
|
|
134
|
+
- Całe zachowanie narzędzi i formaty wyjściowe
|
|
135
|
+
- Konfiguracja Claude Desktop dla użytkowników końcowych
|
|
116
136
|
|
|
117
137
|
---
|
|
118
138
|
|
|
119
|
-
##
|
|
120
|
-
|
|
121
|
-
whisper-windows-mcp używa podwójnego licencjonowania.
|
|
122
|
-
|
|
123
|
-
**Użytek niekomercyjny:** MIT — bezpłatny do użytku osobistego, edukacyjnego i niekomercyjnego. Zobacz [LICENSE](LICENSE).
|
|
139
|
+
## Planowane — v2.5.0: Rozszerzone formaty wyjściowe dla integracji zewnętrznych narzędzi
|
|
124
140
|
|
|
125
|
-
|
|
141
|
+
Rozszerzona obsługa formatów wyjściowych skierowana na przepływy pracy analizy i integracji. Dokładny zakres zostanie określony na podstawie opinii użytkowników po v2.3.0.
|
|
126
142
|
|
|
127
|
-
|
|
143
|
+
---
|
|
128
144
|
|
|
129
|
-
## Planowane — v2.
|
|
145
|
+
## Planowane — v2.6.0: Tryb transkrypcji na żywo z mikrofonu
|
|
130
146
|
|
|
131
|
-
|
|
132
|
-
Wyjście WebVTT (`.vtt`) wraz z SRT. Standard internetowy używany przez YouTube, HTML5 `<video>` i większość nowoczesnych odtwarzaczy.
|
|
147
|
+
Transkrypcja w czasie rzeczywistym z wejścia mikrofonu na żywo. Strumieniowanie audio z wybranego urządzenia nagrywającego do whisper w fragmentach, zwracając kolejne segmenty transkrypcji w miarę ich ukończenia.
|
|
133
148
|
|
|
134
|
-
|
|
135
|
-
|
|
149
|
+
**Ograniczenia projektowe:**
|
|
150
|
+
- Wybór urządzenia musi być jawny — bez cichego przechwytywania domyślnego urządzenia
|
|
151
|
+
- Użytkownik musi mieć możliwość zatrzymania strumienia przez interakcję z Claude Desktop
|
|
152
|
+
- Nie może kolidować z ograniczeniem jednej instancji whisper jednocześnie
|
|
153
|
+
- Kompromis między opóźnieniem a dokładnością musi być konfigurowalny przez użytkownika
|
|
136
154
|
|
|
137
|
-
|
|
138
|
-
Wyjście CSV (`.csv`) przez `-ocsv`. Strukturalne dane tabelaryczne z synchronizacją segmentów.
|
|
155
|
+
**Status:** Faza projektowania. Zależy od stabilnego API strumieniowania w whisper.cpp.
|
|
139
156
|
|
|
140
157
|
---
|
|
141
158
|
|
|
142
159
|
## Planowane — Przyszłe wydania
|
|
143
160
|
|
|
144
161
|
### TinyDiarize
|
|
145
|
-
Obsługa flagi `--tinydiarize` z wariantami modeli obsługującymi `tdrz
|
|
162
|
+
Obsługa flagi `--tinydiarize` z wariantami modeli obsługującymi `tdrz` (np. `large-v2-tdrz`). W przeciwieństwie do flagi `--diarize` stereo, TinyDiarize działa na nagraniach mono. Wymaga pobrania specjalnego wariantu modelu. Niższa dokładność niż diaryzacja oparta na pyannote, ale zero dodatkowych zależności poza plikiem modelu.
|
|
163
|
+
|
|
164
|
+
**Status:** Planowane. Zależy od obsługi wariantów modeli tdrz w `download_model`.
|
|
146
165
|
|
|
147
166
|
### Transkrypcja URL YouTube
|
|
148
|
-
Bezpośrednia transkrypcja z URL YouTube przez yt-dlp. Wymaga zainstalowanego yt-dlp w PATH.
|
|
167
|
+
Bezpośrednia transkrypcja z URL YouTube przez yt-dlp. Pobieranie audio i transkrypcja w jednym kroku. Wymaga zainstalowanego yt-dlp w PATH.
|
|
168
|
+
|
|
169
|
+
**Ograniczenie projektowe:** yt-dlp jest opcjonalny. Narzędzie musi degradować się elegancko z jasnymi instrukcjami instalacji jeśli nie zostanie znalezione. Brak zmian w podstawowej funkcjonalności dla użytkowników, którzy tego nie potrzebują.
|
|
149
170
|
|
|
150
171
|
### Narzędzia przepływu pracy projektów wideo
|
|
151
|
-
Dla użytkowników zarządzających dużymi projektami edycji wideo z folderami klipów źródłowych i edytowanych
|
|
172
|
+
Dla użytkowników zarządzających dużymi projektami edycji wideo z folderami klipów źródłowych i edytowanych:
|
|
173
|
+
|
|
174
|
+
1. Skanowanie folderu źródłowego i podfolderu klipów
|
|
175
|
+
2. Rozmyte dopasowywanie transkrypcji edytowanych klipów do transkrypcji źródłowych w celu zlokalizowania punktów pochodzenia
|
|
176
|
+
3. Wyświetlanie opisowych nazw plików sugerowanych przez Claude na podstawie treści transkrypcji, wymagające jawnego potwierdzenia użytkownika przed wykonaniem jakiegokolwiek przemianowania
|
|
177
|
+
4. Wyszukiwanie transkrypcji w katalogu projektu z wynikami w kodach czasowych
|
|
178
|
+
|
|
179
|
+
**Ograniczenia projektowe:**
|
|
180
|
+
- Pliki źródłowe są **nigdy nie przemianowywane ani modyfikowane**
|
|
181
|
+
- Wszystkie przemianowania wymagają **jawnego potwierdzenia użytkownika**
|
|
182
|
+
- Wyszukiwanie jest osobnym narzędziem, używalnym niezależnie
|
|
183
|
+
- Analiza i dopasowywanie odbywają się lokalnie — Claude jest wywoływany tylko gdy użytkownik przegląda wyniki, minimalizując wywołania API
|
|
184
|
+
|
|
185
|
+
**Status:** Faza projektowania.
|
|
152
186
|
|
|
153
187
|
### Diaryzacja mówców (pyannote-audio)
|
|
154
|
-
Pełna diaryzacja mówców mono z etykietami ID mówcy
|
|
188
|
+
Pełna diaryzacja mówców mono z etykietami ID mówcy — oznacza przejścia mówców przez całe nagranie niezależnie od konfiguracji kanałów. Różni się od wbudowanej flagi `--diarize` stereo (v2.2.0) i TinyDiarize.
|
|
189
|
+
|
|
190
|
+
**Implementacja:** Wymaga [pyannote-audio](https://github.com/pyannote/pyannote-audio) — biblioteki opartej na Pythonie z wymogiem tokenu dostępu do modeli Hugging Face. Całkowicie oddzielny stos zależności.
|
|
191
|
+
|
|
192
|
+
**Status:** Opcjonalna zaawansowana funkcja z własną dokumentacją konfiguracji. Nie jest włączona do głównego pakietu.
|
|
155
193
|
|
|
156
194
|
### Tłumaczenie na języki inne niż angielski
|
|
157
195
|
Flaga `--translate` Whisper jest skierowana tylko na angielski. Obsługa dowolnych języków docelowych wymaga zewnętrznego API tłumaczenia lub lokalnego modelu tłumaczenia.
|
|
158
196
|
|
|
197
|
+
**Opcje rozważane:** LibreTranslate (samohosted, lokalny priorytet), lokalny LLM tłumaczący lub jawna dokumentacja poza zakresem.
|
|
198
|
+
|
|
199
|
+
**Status:** Odroczone, oczekuje decyzji projektowej dotyczącej lokalnego priorytetu vs zależności API.
|
|
200
|
+
|
|
159
201
|
### Czyszczenie i formatowanie transkrypcji
|
|
160
|
-
Pipeline post-przetwarzania:
|
|
202
|
+
Pipeline post-przetwarzania:
|
|
203
|
+
- Usuwanie słów wypełniaczy i fałszywych startów (opcjonalne, kontrolowane przez użytkownika)
|
|
204
|
+
- Podziały akapitów na naturalnych granicach tematów
|
|
205
|
+
- Formatowanie uwzględniające mówców w połączeniu z wyjściem diaryzacji
|
|
206
|
+
- Eksport do PDF lub DOCX
|
|
207
|
+
|
|
208
|
+
**Status:** Planowane. Wariant uwzględniający mówców zależy od diaryzacji.
|
|
209
|
+
|
|
210
|
+
---
|
|
211
|
+
|
|
212
|
+
## Licencjonowanie
|
|
213
|
+
|
|
214
|
+
whisper-windows-mcp używa podwójnego licencjonowania.
|
|
215
|
+
|
|
216
|
+
**Użytek niekomercyjny:** MIT — bezpłatny do użytku osobistego, edukacyjnego i niekomercyjnego. Zobacz [LICENSE](LICENSE).
|
|
217
|
+
|
|
218
|
+
**Użytek komercyjny:** Wymagana jest osobna umowa licencji komercyjnej dla jakiegokolwiek użytku biznesowego, zawodowego lub generującego przychody. Warunki i dane kontaktowe — w [COMMERCIAL-LICENSE.md](COMMERCIAL-LICENSE.md).
|
|
161
219
|
|
|
162
220
|
---
|
|
163
221
|
|
|
164
222
|
## Dystrybucja
|
|
165
223
|
|
|
166
|
-
Dostępne na [npm](https://www.npmjs.com/package/whisper-windows-mcp), [mcpservers.org](https://mcpservers.org)
|
|
224
|
+
Dostępne na [npm](https://www.npmjs.com/package/whisper-windows-mcp), [mcpservers.org](https://mcpservers.org), [Glama](https://glama.ai) i [awesome-mcp-servers](https://github.com/punkpeye/awesome-mcp-servers).
|
|
167
225
|
|
|
168
226
|
---
|
|
169
227
|
|
|
170
228
|
## Dokumentacja wielojęzyczna
|
|
171
229
|
|
|
172
|
-
|
|
230
|
+
Po każdym wydaniu należy zaktualizować następujące pliki, aby odpowiadały dokumentacji angielskiej:
|
|
173
231
|
|
|
174
232
|
**Japoński (`*.ja.md`)** — `README.ja.md` / `TROUBLESHOOTING.ja.md` / `ROADMAP.ja.md` / `PRIVACY.ja.md` / `SECURITY.ja.md`
|
|
175
233
|
|
|
@@ -187,6 +245,8 @@ Dokumentacja w językach japońskim, koreańskim, wietnamskim, indonezyjskim, uk
|
|
|
187
245
|
|
|
188
246
|
**Polski (`*.pl.md`)** — `README.pl.md` / `TROUBLESHOOTING.pl.md` / `ROADMAP.pl.md` / `PRIVACY.pl.md` / `SECURITY.pl.md`
|
|
189
247
|
|
|
248
|
+
**Rumuński (`*.ro.md`)** — `README.ro.md` / `TROUBLESHOOTING.ro.md` / `ROADMAP.ro.md` / `PRIVACY.ro.md` / `SECURITY.ro.md`
|
|
249
|
+
|
|
190
250
|
Wkład społeczności dla innych języków jest mile widziany.
|
|
191
251
|
|
|
192
252
|
---
|