whisper-windows-mcp 1.9.0 → 2.0.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/README.ja.md +310 -0
- package/README.md +1 -1
- package/ROADMAP.ja.md +121 -0
- package/TROUBLESHOOTING.ja.md +209 -0
- package/dist/index.js +70 -16
- package/package.json +1 -1
package/README.ja.md
ADDED
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
# whisper-windows-mcp
|
|
2
|
+
|
|
3
|
+
Windows向けのMCP(Model Context Protocol)サーバーです。[whisper.cpp](https://github.com/ggml-org/whisper.cpp)を使用して、Claude Desktopで音声・動画ファイルをローカルで文字起こしできます。GPU加速、多言語対応、バッチ処理に対応しています。インターネット接続不要。音声データは一切外部に送信されません。
|
|
4
|
+
|
|
5
|
+
> **なぜこのツールが存在するか**
|
|
6
|
+
> 人気のある`whisper-mcp`パッケージはmacOS向けに作られており、Unix環境を前提としています。Windowsでは動作しません。このパッケージは、Claude DesktopでローカルAI文字起こしを使いたいWindowsユーザーのために作られました。
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## できること
|
|
11
|
+
|
|
12
|
+
インストール後、Claude Desktopで以下のように話しかけるだけで使えます:
|
|
13
|
+
|
|
14
|
+
- *「C:\Users\Me\Downloads\meeting.mp3を文字起こしして」*
|
|
15
|
+
- *「このフォルダの録音ファイルをすべて文字起こしして、テキストファイルに保存して」*
|
|
16
|
+
- *「この動画の日本語と英語の字幕ファイルを作って」*
|
|
17
|
+
- *「このフォルダのファイルをすべてバッチ文字起こしして」*
|
|
18
|
+
- *「これらのファイルの文字起こしにどれくらいかかる?」*
|
|
19
|
+
- *「GPU加速が有効かどうか確認して」*
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## 必要なもの
|
|
24
|
+
|
|
25
|
+
1. **Node.js 18以降** — [nodejs.org](https://nodejs.org)
|
|
26
|
+
2. **Vulkan GPU対応のwhisper.cppバイナリ** — ステップ1参照
|
|
27
|
+
3. **Whisperモデルファイル** — ステップ2参照
|
|
28
|
+
4. **FFmpeg** — 動画ファイルやWAV/MP3以外の音声形式に必要
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## ステップ1 — whisper.cppバイナリのインストール
|
|
33
|
+
|
|
34
|
+
### オプションA — ビルド済みVulkanリリース(推奨)
|
|
35
|
+
|
|
36
|
+
[リリースページ](https://github.com/eviscerations/whisper-windows-mcp/releases/tag/v1.4.0)から`whisper-vulkan-win-x64.zip`をダウンロードしてください。
|
|
37
|
+
|
|
38
|
+
これは**Vulkan GPU加速**を有効にしてカスタムコンパイルされたビルドです。AMD、NVIDIA、Intel GPUで動作します。ベンダー固有のSDKは不要です。
|
|
39
|
+
|
|
40
|
+
`C:\whisper\Release\`に展開してください。以下のファイルが揃っていることを確認してください:
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
C:\whisper\Release\whisper-cli.exe
|
|
44
|
+
C:\whisper\Release\ggml-vulkan.dll
|
|
45
|
+
C:\whisper\Release\ggml.dll
|
|
46
|
+
C:\whisper\Release\ggml-base.dll
|
|
47
|
+
C:\whisper\Release\ggml-cpu.dll
|
|
48
|
+
C:\whisper\Release\whisper.dll
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
GPU加速は自動的に有効になります。追加設定は不要です。
|
|
52
|
+
|
|
53
|
+
### オプションB — ソースからビルド
|
|
54
|
+
|
|
55
|
+
必要なもの:Git、CMake、「C++によるデスクトップ開発」ワークロードを含むVisual Studio Build Tools 2022以降、[lunarg.com](https://vulkan.lunarg.com/sdk/home#windows)のVulkan SDK。
|
|
56
|
+
|
|
57
|
+
```
|
|
58
|
+
git clone https://github.com/ggml-org/whisper.cpp
|
|
59
|
+
cd whisper.cpp
|
|
60
|
+
cmake -B build -DGGML_VULKAN=ON -DCMAKE_BUILD_TYPE=Release
|
|
61
|
+
cmake --build build --config Release --target whisper-cli
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
`build\bin\Release\`のバイナリを`C:\whisper\Release\`にコピーしてください。
|
|
65
|
+
|
|
66
|
+
> **注意:** GitHub上の公式whisper.cpp WindowsリリースにはVulkanビルドが含まれていません。上記のビルド済みリリースを使用するか、`-DGGML_VULKAN=ON`でソースからビルドしてください。
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## ステップ2 — Whisperモデルのダウンロード
|
|
71
|
+
|
|
72
|
+
| モデル | サイズ | 速度 | 精度 | 用途 |
|
|
73
|
+
|---|---|---|---|---|
|
|
74
|
+
| `ggml-tiny.en.bin` | 75 MB | 非常に速い | 基本 | 動作確認用 |
|
|
75
|
+
| `ggml-base.en.bin` | 142 MB | 速い | 良い | 日常的な英語 |
|
|
76
|
+
| `ggml-small.en.bin` | 466 MB | 普通 | より良い | 重要な録音 |
|
|
77
|
+
| `ggml-medium.en.bin` | 1.5 GB | GPU使用時は速い | 非常に良い | 高品質な英語 |
|
|
78
|
+
| `ggml-large-v3.bin` | 2.9 GB | GPU使用時は速い | 最高 | 多言語・最高精度 |
|
|
79
|
+
|
|
80
|
+
**英語のみ**の場合:`base.en`または`medium.en`がおすすめです。
|
|
81
|
+
**多言語対応**(自動検出、外国語、翻訳)の場合:最良の結果を得るには`large-v3`を使用してください。
|
|
82
|
+
|
|
83
|
+
Hugging Faceからダウンロード:
|
|
84
|
+
```
|
|
85
|
+
https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-medium.en.bin
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
`C:\whisper\models\`に保存してください。
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## ステップ3 — FFmpegのインストール
|
|
93
|
+
|
|
94
|
+
動画ファイルやネイティブ以外の音声形式に必要です。
|
|
95
|
+
|
|
96
|
+
wingetでインストール:
|
|
97
|
+
```
|
|
98
|
+
winget install ffmpeg
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
または[ffmpeg.org](https://ffmpeg.org/download.html)からダウンロードしてPATHに追加してください。
|
|
102
|
+
|
|
103
|
+
確認:
|
|
104
|
+
```
|
|
105
|
+
ffmpeg -version
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## ステップ4 — MCPサーバーのインストール
|
|
111
|
+
|
|
112
|
+
```
|
|
113
|
+
npm install -g whisper-windows-mcp
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## ステップ5 — Claude Desktopの設定
|
|
119
|
+
|
|
120
|
+
Claude Desktop → 設定 → 開発者 → 設定ファイルを編集 を開いてください。
|
|
121
|
+
|
|
122
|
+
`whisper`エントリを追加してください:
|
|
123
|
+
|
|
124
|
+
```json
|
|
125
|
+
{
|
|
126
|
+
"mcpServers": {
|
|
127
|
+
"whisper": {
|
|
128
|
+
"command": "npx",
|
|
129
|
+
"args": ["-y", "whisper-windows-mcp"],
|
|
130
|
+
"env": {
|
|
131
|
+
"WHISPER_CLI_PATH": "C:\\whisper\\Release\\whisper-cli.exe",
|
|
132
|
+
"WHISPER_MODEL": "C:\\whisper\\models\\ggml-medium.en.bin"
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
設定ファイルの場所:`C:\Users\ユーザー名\AppData\Roaming\Claude\claude_desktop_config.json`
|
|
140
|
+
|
|
141
|
+
> パスには必ず**バックスラッシュを2つ**使用してください(`C:\\whisper\\...`)。
|
|
142
|
+
|
|
143
|
+
保存後、Claude Desktopを**完全に再起動**してください。設定 → 開発者に**whisper**が緑色の実行中バッジで表示されれば成功です。
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## ステップ6 — 動作確認
|
|
148
|
+
|
|
149
|
+
Claude Desktopで以下を入力してください:
|
|
150
|
+
|
|
151
|
+
> *「whisperの設定を確認して」*
|
|
152
|
+
|
|
153
|
+
次に:
|
|
154
|
+
|
|
155
|
+
> *「システムのハードウェアを確認して」*
|
|
156
|
+
|
|
157
|
+
GPUが検出され、Vulkan加速が有効であることを確認できます。
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
## 利用可能なツール
|
|
162
|
+
|
|
163
|
+
### `transcribe_audio`(音声文字起こし)
|
|
164
|
+
単一ファイルを文字起こしします。ブロッキング(デフォルト)またはバックグラウンドモードに対応。
|
|
165
|
+
|
|
166
|
+
| パラメータ | 説明 |
|
|
167
|
+
|---|---|
|
|
168
|
+
| `file_path` | ファイルの絶対パス(必須) |
|
|
169
|
+
| `language` | 言語コード(`en`、`ja`、`es`など)または`auto`で自動検出。デフォルト:`en` |
|
|
170
|
+
| `output_format` | `text`(デフォルト)、`timestamps`、`json`、`srt` |
|
|
171
|
+
| `save_to_file` | ソースファイルの隣に.txtとして保存 |
|
|
172
|
+
| `background` | バックグラウンドジョブとして実行し、ジョブIDをすぐに返す。10分超のファイルに推奨。`check_progress`で監視。 |
|
|
173
|
+
| `threads` | CPUスレッド数の上書き |
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
### `check_progress`(進捗確認)
|
|
178
|
+
`transcribe_audio`(background=true)で開始したジョブを監視します。経過時間、最後に処理したタイムスタンプ、完了時の文字起こし全文を返します。
|
|
179
|
+
|
|
180
|
+
---
|
|
181
|
+
|
|
182
|
+
### `start_batch`(バッチ開始)
|
|
183
|
+
フォルダ内の未文字起こしファイルを自動的に順次文字起こしします。時間順(短い順)にソートし、バックグラウンドジョブとして1つずつ処理し、各出力を検証します。
|
|
184
|
+
|
|
185
|
+
---
|
|
186
|
+
|
|
187
|
+
### `check_batch_progress`(バッチ進捗確認)
|
|
188
|
+
実行中のバッチを監視します。現在のファイルが完了すると自動的に次のファイルに進みます。全体の進捗、現在のファイルとタイムスタンプ、失敗したファイルを返します。
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
### `transcribe_batch`(インタラクティブバッチ)
|
|
193
|
+
1ファイルずつプレビューと確認を挟みながら処理します。進行状況を確認しながら作業したい場合に便利です。
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
### `generate_subtitles`(字幕生成)
|
|
198
|
+
SRT字幕ファイルを生成します。言語自動検出と英語翻訳出力に対応。
|
|
199
|
+
|
|
200
|
+
| パラメータ | 説明 |
|
|
201
|
+
|---|---|
|
|
202
|
+
| `file_path` | ファイルのパス(必須) |
|
|
203
|
+
| `language` | 言語コードまたは`auto`で自動検出。デフォルト:`en` |
|
|
204
|
+
| `translate_to_english` | 英語翻訳の`.en.srt`も生成する。ソースが英語でない場合のみ適用。 |
|
|
205
|
+
| `threads` | CPUスレッド数の上書き |
|
|
206
|
+
|
|
207
|
+
ネイティブと翻訳の両方を要求した場合、2つのファイルが保存されます:
|
|
208
|
+
- `ファイル名.ja.srt` — 元の言語
|
|
209
|
+
- `ファイル名.en.srt` — 英語翻訳
|
|
210
|
+
|
|
211
|
+
> whisperの組み込み翻訳は**英語へのみ**翻訳できます。他の言語への翻訳には別途翻訳ツールが必要です。
|
|
212
|
+
|
|
213
|
+
---
|
|
214
|
+
|
|
215
|
+
### `analyze_media`(メディア分析)
|
|
216
|
+
文字起こし前にファイルを分析します。時間、サイズ、コーデック、CPUとGPUでの推定文字起こし時間を返します。フォルダの場合は、すべてのファイルをテーブル形式で表示します。
|
|
217
|
+
|
|
218
|
+
---
|
|
219
|
+
|
|
220
|
+
### `check_config`(設定確認)
|
|
221
|
+
whisper-cli.exe、モデルファイル、FFmpegがすべてアクセス可能かを確認します。問題が発生した場合はまずこれを実行してください。
|
|
222
|
+
|
|
223
|
+
---
|
|
224
|
+
|
|
225
|
+
### `check_system`(システム確認)
|
|
226
|
+
GPUハードウェアを検出し、Vulkan加速が利用可能かを確認します。GPU名、VRAM、`ggml-vulkan.dll`の有無、ハードウェアに適したモデルサイズを報告します。
|
|
227
|
+
|
|
228
|
+
---
|
|
229
|
+
|
|
230
|
+
## 対応フォーマット
|
|
231
|
+
|
|
232
|
+
| 種類 | フォーマット |
|
|
233
|
+
|---|---|
|
|
234
|
+
| ネイティブ(変換不要) | `mp3`、`wav` |
|
|
235
|
+
| 動画(FFmpegで自動変換) | `mp4`、`mkv`、`avi`、`mov`、`webm`、`flv`、`wmv`、`m4v`、`ts`、`3gp` |
|
|
236
|
+
| 音声(FFmpegで自動変換) | `m4a`、`ogg`、`flac` |
|
|
237
|
+
|
|
238
|
+
---
|
|
239
|
+
|
|
240
|
+
## GPU加速
|
|
241
|
+
|
|
242
|
+
ビルド済みVulkanリリースにより、GPU加速が自動的に有効になります。AMD Radeon RX Vega 56(GCN第5世代)で動作確認済み。Vulkan 1.0以上をサポートするGPU(NVIDIA、Intel Arcを含む)であれば動作するはずです。
|
|
243
|
+
|
|
244
|
+
**パフォーマンス比較(medium.enモデル、約5分の音声ファイル):**
|
|
245
|
+
|
|
246
|
+
| ハードウェア | 処理時間 |
|
|
247
|
+
|---|---|
|
|
248
|
+
| CPUのみ(Ryzen 7 2700x、8スレッド) | 8〜12分 |
|
|
249
|
+
| GPU(Vega 56、Vulkan経由) | 20〜40秒 |
|
|
250
|
+
|
|
251
|
+
文字起こし中のGPU使用率は約15〜20%。ファイル間はアイドル状態に戻ります。
|
|
252
|
+
|
|
253
|
+
---
|
|
254
|
+
|
|
255
|
+
## 多言語対応
|
|
256
|
+
|
|
257
|
+
Whisperは話されている言語を自動検出し、その言語で文字起こしができます。組み込みの翻訳モデルは**英語へのみ**翻訳します。
|
|
258
|
+
|
|
259
|
+
多言語コンテンツには`large-v3`が**必須**です。英語専用モデル(`*.en.bin`)は英語以外の音声に`[FOREIGN]`を出力します — いかなる状況でも他の言語を検出・文字起こしすることはできません。
|
|
260
|
+
|
|
261
|
+
**外国語動画の字幕作成の例:**
|
|
262
|
+
1. `language=auto`と`translate_to_english=true`で字幕生成を依頼
|
|
263
|
+
2. Whisperが言語を検出し、元の言語のSRTを生成
|
|
264
|
+
3. 2回目のパスで英語翻訳SRTを生成
|
|
265
|
+
4. VLCで「字幕」→「字幕ファイルを追加」からどちらのファイルも読み込み可能
|
|
266
|
+
|
|
267
|
+
---
|
|
268
|
+
|
|
269
|
+
## フリープランユーザー向け設計
|
|
270
|
+
|
|
271
|
+
このツールはClaude APIの呼び出し回数を最小限に抑えるように設計されています。スキャン、分析、キュー管理、実行、検証を含む文字起こしワークフロー全体で、60ファイルのバッチ処理に必要なClaude操作は20回以下を目標としています。
|
|
272
|
+
|
|
273
|
+
---
|
|
274
|
+
|
|
275
|
+
## 環境変数(オプション)
|
|
276
|
+
|
|
277
|
+
| 変数 | 説明 |
|
|
278
|
+
|---|---|
|
|
279
|
+
| `WHISPER_CLI_PATH` | whisper-cli.exeのパス(必須) |
|
|
280
|
+
| `WHISPER_MODEL` | モデル.binファイルのパス(必須) |
|
|
281
|
+
| `WHISPER_THREADS` | CPUスレッド数の上書き |
|
|
282
|
+
| `FFMPEG_PATH` | ffmpegがPATHにない場合のパス |
|
|
283
|
+
|
|
284
|
+
---
|
|
285
|
+
|
|
286
|
+
## トラブルシューティング
|
|
287
|
+
|
|
288
|
+
詳細は[TROUBLESHOOTING.md](TROUBLESHOOTING.md)(英語)をご覧ください。
|
|
289
|
+
|
|
290
|
+
簡易チェックリスト:
|
|
291
|
+
- 設定のパスには**バックスラッシュを2つ**使用(`C:\\whisper\\...`)
|
|
292
|
+
- 設定したパスに`whisper-cli.exe`が存在する
|
|
293
|
+
- 設定したパスにモデル`.bin`ファイルが存在する
|
|
294
|
+
- FFmpegがインストールされPATHが通っている(`ffmpeg -version`が動作する)
|
|
295
|
+
- 設定変更後にClaude Desktopを完全に再起動した
|
|
296
|
+
- 設定 → 開発者でwhisperが**実行中**と表示されている
|
|
297
|
+
|
|
298
|
+
---
|
|
299
|
+
|
|
300
|
+
## ライセンス
|
|
301
|
+
|
|
302
|
+
MIT
|
|
303
|
+
|
|
304
|
+
---
|
|
305
|
+
|
|
306
|
+
## コントリビュート
|
|
307
|
+
|
|
308
|
+
プルリクエスト歓迎です。計画中の機能については[ROADMAP.md](ROADMAP.md)をご覧ください。
|
|
309
|
+
|
|
310
|
+
上記以外のハードウェアでGPU加速をテストした方は、GPU型番、VRAM、使用モデル、確認したスループットをIssueで報告してください。
|
package/README.md
CHANGED
|
@@ -78,7 +78,7 @@ Copy the binaries from `build\bin\Release\` to `C:\whisper\Release\`.
|
|
|
78
78
|
| `ggml-large-v3.bin` | 2.9 GB | Fast on GPU | Excellent | Multilingual, best accuracy |
|
|
79
79
|
|
|
80
80
|
For **English-only** use: `base.en` or `medium.en` are the best starting points.
|
|
81
|
-
For **multilingual** use (auto-detect, foreign language, translation):
|
|
81
|
+
For **multilingual** use (auto-detect, foreign language, translation): `large-v3` is **required**. English-only models (`*.en.bin`) output `[FOREIGN]` on non-English audio and cannot be used for other languages.
|
|
82
82
|
|
|
83
83
|
Download from Hugging Face:
|
|
84
84
|
```
|
package/ROADMAP.ja.md
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# whisper-windows-mcp — ロードマップ
|
|
2
|
+
|
|
3
|
+
現在のバージョン:**v1.9.0**
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 完了済み
|
|
8
|
+
|
|
9
|
+
### ✅ v1.3.1 — プロセスロック
|
|
10
|
+
`tasklist /FI`を使用した`isWhisperRunning()`チェックを追加。競合するプロセスを生成する代わりに、明確なエラーとTask Managerの手順を返します。
|
|
11
|
+
|
|
12
|
+
### ✅ v1.4.0 — Vulkan GPU加速
|
|
13
|
+
VS Build Tools 2026とVulkan SDK 1.4.341.1を使用して`-DGGML_VULKAN=ON`でwhisper.cppをコンパイル。ビルド済みVulkanバイナリを`whisper-vulkan-win-x64.zip`として配布。
|
|
14
|
+
|
|
15
|
+
**AMD Radeon RX Vega 56での結果:** GPU使用率約16%。58分のファイルがGPUで約4.5分(CPU専用では約88分)で完了。
|
|
16
|
+
|
|
17
|
+
### ✅ v1.5.0 — システム診断
|
|
18
|
+
`check_system`ツール:`wmic`によるGPU検出、Vulkan DLL確認、VRAM報告、モデルサイズ推奨。
|
|
19
|
+
|
|
20
|
+
### ✅ v1.6.0 — メディアファイル事前分析
|
|
21
|
+
FFprobeを使用した`analyze_media`ツール:時間、サイズ、コーデック、文字起こし状態、CPUとGPUの推定時間。単一ファイルまたはフォルダスキャン、ソートオプション付き。
|
|
22
|
+
|
|
23
|
+
### ✅ v1.7.0 — バックグラウンド文字起こし + 進捗表示
|
|
24
|
+
デタッチドプロセスアーキテクチャ:`background=true`の`transcribe_audio`がwhisperをデタッチドプロセスとして起動し、即座にジョブIDを返す。`check_progress`がwhisperのstderrセグメントタイムスタンプをリアルタイムで解析。
|
|
25
|
+
|
|
26
|
+
### ✅ v1.8.0 — 検証付き順次バッチ処理
|
|
27
|
+
`start_batch`と`check_batch_progress`:自動順次処理、文字起こし検証(空または短すぎる出力の検出)、自動キュー進行、ファイルごとの進捗タイムスタンプ。
|
|
28
|
+
|
|
29
|
+
### ✅ v1.9.0 — 多言語対応と翻訳
|
|
30
|
+
`language=auto`による言語自動検出と`translate_to_english=true`によるデュアルSRT出力。`.3gp`と`.ts`フォーマットのサポートを追加。
|
|
31
|
+
|
|
32
|
+
**既知の制限:** Whisperの組み込み翻訳は英語へのみ対応。英語以外の言語には`large-v3`モデルが必要 — 英語専用モデル(`*.en.bin`)は英語以外の音声に`[FOREIGN]`を出力します。
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## 既知のバグ(次回リリース予定)
|
|
37
|
+
|
|
38
|
+
### Unicodeおよび特殊文字のファイル名
|
|
39
|
+
日本語・中国語・絵文字・括弧などのUnicode文字をファイル名に含む場合、バックグラウンド文字起こしがサイレントに失敗します — whisperは完了まで動作しますが、そのパスに出力ファイルを書き込めません。
|
|
40
|
+
|
|
41
|
+
**修正予定:** ジョブIDに基づくサニタイズされた一時パスに出力を書き込み、完了後に正しい宛先に移動します。
|
|
42
|
+
|
|
43
|
+
### バックグラウンドモードでSRT出力が未対応
|
|
44
|
+
`spawnDetached`が`-otxt`をハードコードしています。`generate_subtitles`は同期的にブロックするため、約4分を超えるファイルでMCPタイムアウトが発生します。
|
|
45
|
+
|
|
46
|
+
**修正予定:** `spawnDetached`に`outputFormat`パラメータを追加。バックグラウンドモードで`text`、`srt`、`timestamps`出力形式をサポートします。
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## 予定
|
|
51
|
+
|
|
52
|
+
### Priority 8 — ファイル名ベースの参照
|
|
53
|
+
すべてのツール出力で、位置インデックスではなく完全なソースファイル名を参照するようにします。
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
### 話者識別(ダイアライゼーション)
|
|
58
|
+
文字起こしでの話者の切り替えを識別します(名前を特定せず、例:`[話者A]`、`[話者B]`のようにマーク)。インタビュー、パネル討論、法廷録音に有用。
|
|
59
|
+
|
|
60
|
+
**実装:** [pyannote-audio](https://github.com/pyannote/pyannote-audio)が必要 — Hugging Faceアカウントとモデルアクセストークンが必要なPythonベースのライブラリ。現在のwhisper.cppパイプラインとは別の依存関係スタック。
|
|
61
|
+
|
|
62
|
+
**状況:** 別途セットアップドキュメントを用意するオプションの高度機能として計画中。メインパッケージには含めません。
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
### 動画プロジェクトワークフローツール(Premiere準備)
|
|
67
|
+
大規模な動画編集プロジェクトを管理するユーザー向けのツール:
|
|
68
|
+
|
|
69
|
+
1. 親ディレクトリのソースクリップ
|
|
70
|
+
2. `./clips/`サブディレクトリの編集済みクリップ
|
|
71
|
+
3. 文字起こしテキストの位置照合 — テキストのファジーマッチングによる編集済みクリップのソース内位置特定
|
|
72
|
+
4. Claudeが提案するディスクリプタによる半自動リネーム(実行前に明示的なユーザー確認が必要)
|
|
73
|
+
5. プロジェクトディレクトリ全体の文字起こし検索
|
|
74
|
+
|
|
75
|
+
**状況:** 設計フェーズ。実際のディレクトリ例をもとに実装予定。
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
### 英語以外の言語への翻訳
|
|
80
|
+
Whisperの`--translate`フラグは英語のみを対象としています。任意のターゲット言語(例:日本語→ドイツ語)をサポートするには、外部翻訳APIまたはローカル翻訳モデルが必要です。
|
|
81
|
+
|
|
82
|
+
**状況:** ローカルファーストかAPIへの依存かの設計判断待ちで保留中。
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
### 文字起こしのクリーンアップと整形
|
|
87
|
+
より読みやすくクリップスキャンしやすい後処理:
|
|
88
|
+
- フィラーワードと言い直しの削除(オプション、ユーザー制御)
|
|
89
|
+
- 自然なトピック境界での段落区切り
|
|
90
|
+
- ダイアライゼーションと組み合わせた話者を考慮した整形
|
|
91
|
+
|
|
92
|
+
**状況:** 計画中。
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
### 多言語ドキュメント
|
|
97
|
+
日本語ドキュメント(`README.ja.md`、`TROUBLESHOOTING.ja.md`、`ROADMAP.ja.md`)を作成済み。他の言語へのコミュニティ貢献を歓迎します。
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## 設計原則
|
|
102
|
+
|
|
103
|
+
**Claude APIの使用を最小限に。** スキャン、分析、キュー管理、実行、検証を含む60ファイルのバッチ処理ワークフロー全体で、必要なClaude操作は20回以下を目標としています。フリープランユーザーもこのツールを効果的に使用できる必要があります。
|
|
104
|
+
|
|
105
|
+
**常に1つのwhisperインスタンス。** 実行中に2つ目のプロセスを生成しない。
|
|
106
|
+
|
|
107
|
+
**ローカルファースト、デフォルトでプライベート。** 音声はマシンから外に出ない。コア機能にクラウドAPIは不要。
|
|
108
|
+
|
|
109
|
+
**モジュール型かつ組み合わせ可能。** ツールは独立しています。ユーザーは必要なものだけを使います。
|
|
110
|
+
|
|
111
|
+
**明示的なユーザー制御。** サイレントな一括操作なし。破壊的または不可逆なアクションは確認が必要。
|
|
112
|
+
|
|
113
|
+
**Unicodeセーフなパス処理。** すべてのファイルI/Oで、日本語、中国語、絵文字、特殊文字を含む非ASCIIファイル名を正しく処理する必要があります。
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## コントリビュート
|
|
118
|
+
|
|
119
|
+
プルリクエスト歓迎です。作業を開始する前に既存のIssueを確認してください。
|
|
120
|
+
|
|
121
|
+
上記以外のハードウェアでGPU加速をテストした方は、GPU型番、VRAM、使用モデル、確認したスループットをIssueで報告してください。
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
# whisper-windows-mcp — トラブルシューティング
|
|
2
|
+
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
## 簡易チェックリスト
|
|
6
|
+
|
|
7
|
+
詳しい調査の前に、以下をすべて確認してください:
|
|
8
|
+
|
|
9
|
+
- `claude_desktop_config.json`のパスに**バックスラッシュを2つ**使用している(`C:\\whisper\\...`)
|
|
10
|
+
- `WHISPER_CLI_PATH`に指定したパスに`whisper-cli.exe`が存在する
|
|
11
|
+
- `WHISPER_MODEL`に指定したパスにモデル`.bin`ファイルが存在する
|
|
12
|
+
- FFmpegがインストールされPATHが通っている(コマンドプロンプトで`ffmpeg -version`が動作する)
|
|
13
|
+
- 設定ファイル編集後にClaude Desktopを**完全に再起動**した(システムトレイから終了)
|
|
14
|
+
- 設定 → 開発者でwhisperが緑色の**実行中**バッジで表示されている
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## 「whisperに接続できない」またはツールが表示されない
|
|
19
|
+
|
|
20
|
+
**最も多い原因:** 設定ファイル編集後にClaude Desktopを完全に再起動していない。
|
|
21
|
+
|
|
22
|
+
1. システムトレイのClaudeアイコンを右クリック → 終了
|
|
23
|
+
2. Claude Desktopを再起動
|
|
24
|
+
3. 設定 → 開発者でwhisperの緑色の**実行中**バッジを確認
|
|
25
|
+
|
|
26
|
+
それでも表示されない場合:
|
|
27
|
+
|
|
28
|
+
1. `claude_desktop_config.json`のJSON構文エラーを確認(カンマの漏れ、括弧の不一致など)
|
|
29
|
+
2. すべてのパスでバックスラッシュを2つ使用していることを確認
|
|
30
|
+
3. Claude Desktopで`check_config`(設定確認)を実行して診断情報を取得
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## `check_config`がwhisper-cli.exeを見つけられない
|
|
35
|
+
|
|
36
|
+
設定のパスが実際のファイルの場所と一致していません。
|
|
37
|
+
|
|
38
|
+
ファイルの存在を確認:
|
|
39
|
+
```
|
|
40
|
+
dir C:\whisper\Release\whisper-cli.exe
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
別の場所にある場合は、設定の`WHISPER_CLI_PATH`を実際のパスに更新してください。
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## `check_config`がFFmpegを見つけられない
|
|
48
|
+
|
|
49
|
+
FFmpegがインストールされていないか、システムPATHに含まれていません。
|
|
50
|
+
|
|
51
|
+
wingetでインストール:
|
|
52
|
+
```
|
|
53
|
+
winget install ffmpeg
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
または[ffmpeg.org](https://ffmpeg.org/download.html)からダウンロードして、`bin`フォルダをシステムPATHに追加してください。
|
|
57
|
+
|
|
58
|
+
インストール後、新しいコマンドプロンプトで確認:
|
|
59
|
+
```
|
|
60
|
+
ffmpeg -version
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
FFmpegを標準以外の場所にインストールした場合は、Claude Desktop設定で`FFMPEG_PATH`環境変数を設定してください:
|
|
64
|
+
```json
|
|
65
|
+
"env": {
|
|
66
|
+
"FFMPEG_PATH": "C:\\ffmpeg\\bin\\ffmpeg.exe"
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## 文字起こし結果が`[FOREIGN]`タグばかりになる
|
|
73
|
+
|
|
74
|
+
**原因:** 英語専用モデル(例:`ggml-medium.en.bin`)を英語以外の音声に使用しています。英語専用モデルは他の言語を処理できず、認識できないすべてのセグメントに`[FOREIGN]`を出力します。
|
|
75
|
+
|
|
76
|
+
**修正方法:** `ggml-large-v3.bin`(多言語モデル)をダウンロードして使用してください。英語以外の文字起こし、言語自動検出、翻訳にはこのモデルが必要です。
|
|
77
|
+
|
|
78
|
+
```
|
|
79
|
+
https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-large-v3.bin
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
`C:\whisper\models\`に保存して設定を更新:
|
|
83
|
+
```json
|
|
84
|
+
"WHISPER_MODEL": "C:\\whisper\\models\\ggml-large-v3.bin"
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
> **注意:** 英語専用モデル(`*.en.bin`)は英語コンテンツでは速く精度が高いですが、他の言語は一切処理できません。多言語コンテンツを扱う場合は、ハードウェアに関わらず`large-v3`が正しいモデルです。
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## ファイル名にUnicodeや特殊文字が含まれる場合のバックグラウンドジョブの失敗
|
|
92
|
+
|
|
93
|
+
**原因:** パスに日本語・中国語・絵文字・括弧などのUnicode文字や特殊文字が含まれる場合、whisper-cli.exeが出力ファイルを書き込めません。
|
|
94
|
+
|
|
95
|
+
**現在の回避方法:** 文字起こし前にファイル名をASCII文字のみに変更してください。
|
|
96
|
+
|
|
97
|
+
```
|
|
98
|
+
ren "日本語ファイル名.mp4" "temp_transcribe.mp4"
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
**状況:** 既知のバグです。出力をサニタイズされた一時パスに書き込んでから正しい場所に移動する修正を計画中です。
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## バックグラウンドジョブが失敗して出力がない
|
|
106
|
+
|
|
107
|
+
**考えられる原因:**
|
|
108
|
+
|
|
109
|
+
1. **Unicodeファイル名** — 上記参照。
|
|
110
|
+
2. **モデルパスが間違っている** — `check_config`でパスを確認してください。
|
|
111
|
+
3. **プロセスが強制終了された** — 処理中にwhisper-cli.exeを強制終了すると出力ファイルが存在しません。再実行してください。
|
|
112
|
+
4. **VRAMが不足している** — より小さいモデルを試してください。
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
## バックグラウンドモードでSRT出力が作成されない
|
|
117
|
+
|
|
118
|
+
**原因:** バックグラウンドモード(`transcribe_audio`の`background=true`)は現在`.txt`出力のみに対応しています。
|
|
119
|
+
|
|
120
|
+
**回避方法:** 約4分未満のファイルには`generate_subtitles`をブロッキングモードで使用してください。長いファイルの場合は、先にバックグラウンドモードで`.txt`を作成してから、同じファイルで`generate_subtitles`を実行してください(再度文字起こしが行われます)。
|
|
121
|
+
|
|
122
|
+
**状況:** バックグラウンドモードでのSRT対応は将来のリリースで予定されています。
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## GPUが使用されていない(CPUが50%以上で高負荷)
|
|
127
|
+
|
|
128
|
+
**原因:** 標準のwhisper.cppリリースに付属するCPU専用バイナリを使用しています。
|
|
129
|
+
|
|
130
|
+
**修正方法:** [リリースページ](https://github.com/eviscerations/whisper-windows-mcp/releases/tag/v1.4.0)からVulkan対応ビルドをダウンロードして`C:\whisper\Release\`に展開してください。
|
|
131
|
+
|
|
132
|
+
GPU加速の確認方法:
|
|
133
|
+
- `check_system`(システム確認)を実行
|
|
134
|
+
- `✅ Vulkan binary: ggml-vulkan.dll found`が表示されることを確認
|
|
135
|
+
- 文字起こし中にタスクマネージャー → パフォーマンス → GPUでGPU使用率が15〜30%に上昇することを確認
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
## `check_system`のVRAM表示が実際と異なる
|
|
140
|
+
|
|
141
|
+
Windowsの既知の制限です。`wmic`コマンドはレジストリからVRAMを読み取りますが、多くのAMDカードでは物理VRAMの半分の値が表示されます。これは表示の問題のみで、whisperは実際の物理VRAMを完全に使用します。
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
## 「文字起こしが既に進行中」エラー
|
|
146
|
+
|
|
147
|
+
前のジョブの`whisper-cli.exe`プロセスが実行中です。完了を待つか:
|
|
148
|
+
|
|
149
|
+
1. タスクマネージャー → 詳細タブ
|
|
150
|
+
2. `whisper-cli.exe`を見つける
|
|
151
|
+
3. 右クリック → タスクの終了
|
|
152
|
+
|
|
153
|
+
その後、再試行してください。
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
## 言語自動検出が間違っている
|
|
158
|
+
|
|
159
|
+
Whisperの自動検出は音声の最初の30秒で行われます。ファイルの最初がコンテンツの大部分と異なる言語の場合、検出が間違う可能性があります。
|
|
160
|
+
|
|
161
|
+
**修正方法:** 自動検出に頼らず、言語を明示的に指定してください(例:`language=ja`)。
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## 字幕生成が全編「(外国語で話しています)」になる
|
|
166
|
+
|
|
167
|
+
Whisperが音声を検出したが文字起こしできていません。最も多い原因:
|
|
168
|
+
|
|
169
|
+
1. **間違ったモデル** — 英語専用モデルを英語以外の音声に使用。`large-v3`を使用してください。
|
|
170
|
+
2. **音声品質** — 雑音のある環境(厨房、群衆、反響)はmediumモデルでは難しい場合があります。`large-v3`を試してください。
|
|
171
|
+
3. **混合言語** — 2つの言語が交互に話されるファイルは、単一言語設定では少数派の言語がプレースホルダーになります。
|
|
172
|
+
|
|
173
|
+
---
|
|
174
|
+
|
|
175
|
+
## 字幕翻訳が英語にしか対応していない
|
|
176
|
+
|
|
177
|
+
これは仕様です。Whisperの組み込み`--translate`フラグは**英語へのみ**翻訳します。他の言語への翻訳は、生成された`.srt`ファイルを別途翻訳ツールで処理してください。
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
181
|
+
## 設定ファイルの場所
|
|
182
|
+
|
|
183
|
+
```
|
|
184
|
+
C:\Users\ユーザー名\AppData\Roaming\Claude\claude_desktop_config.json
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
`AppData`が表示されない場合:エクスプローラーで「表示」→「隠しファイル」を有効にしてください。
|
|
188
|
+
|
|
189
|
+
---
|
|
190
|
+
|
|
191
|
+
## 完全な設定例
|
|
192
|
+
|
|
193
|
+
```json
|
|
194
|
+
{
|
|
195
|
+
"mcpServers": {
|
|
196
|
+
"whisper": {
|
|
197
|
+
"command": "npx",
|
|
198
|
+
"args": ["-y", "whisper-windows-mcp"],
|
|
199
|
+
"env": {
|
|
200
|
+
"WHISPER_CLI_PATH": "C:\\whisper\\Release\\whisper-cli.exe",
|
|
201
|
+
"WHISPER_MODEL": "C:\\whisper\\models\\ggml-medium.en.bin",
|
|
202
|
+
"FFMPEG_PATH": "ffmpeg"
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
`FFMPEG_PATH`のデフォルトは`ffmpeg`(PATHにあることを前提)です。FFmpegが標準以外の場所にインストールされている場合のみ明示的に設定してください。
|
package/dist/index.js
CHANGED
|
@@ -60,30 +60,39 @@ const JOBS_DIR = join(tmpdir(), "whisper-mcp-jobs");
|
|
|
60
60
|
function ensureJobsDir() {
|
|
61
61
|
mkdirSync(JOBS_DIR, { recursive: true });
|
|
62
62
|
}
|
|
63
|
-
async function spawnDetached(filePath, model, language, threads) {
|
|
63
|
+
async function spawnDetached(filePath, model, language, threads, outputFormat = "text") {
|
|
64
64
|
ensureJobsDir();
|
|
65
65
|
const jobId = `job_${Date.now()}`;
|
|
66
66
|
const logPath = join(JOBS_DIR, `${jobId}.log`);
|
|
67
67
|
const jobPath = join(JOBS_DIR, `${jobId}.json`);
|
|
68
|
-
// Convert to WAV first if needed (fast, blocking
|
|
68
|
+
// Convert to WAV first if needed (fast, blocking)
|
|
69
69
|
let transcribeFrom = filePath;
|
|
70
70
|
let isTmp = false;
|
|
71
71
|
if (needsConversion(filePath)) {
|
|
72
72
|
transcribeFrom = await convertToWav(filePath);
|
|
73
73
|
isTmp = true;
|
|
74
74
|
}
|
|
75
|
-
//
|
|
76
|
-
|
|
77
|
-
const
|
|
75
|
+
// Use a clean ASCII job-ID-based output path to avoid Unicode filename issues.
|
|
76
|
+
// After completion, readJobProgress will move the file to the correct destination.
|
|
77
|
+
const tmpOutputBase = join(JOBS_DIR, jobId);
|
|
78
|
+
// Determine final destination path
|
|
79
|
+
const sourceBase = filePath.replace(/\.[^.]+$/, "");
|
|
80
|
+
const ext = outputFormat === "srt" ? ".srt" : ".txt";
|
|
81
|
+
// For SRT with language code (non-English), append language code
|
|
82
|
+
const outputPath = outputFormat === "srt" && language !== "en" && language !== "auto"
|
|
83
|
+
? `${sourceBase}.${language}.srt`
|
|
84
|
+
: `${sourceBase}${ext}`;
|
|
85
|
+
// Build args
|
|
86
|
+
const lang = language === "auto" ? "auto" : language;
|
|
78
87
|
const args = [
|
|
79
88
|
"-m", model,
|
|
80
89
|
"-f", transcribeFrom,
|
|
81
|
-
"-l",
|
|
90
|
+
"-l", lang,
|
|
82
91
|
"-t", String(threads),
|
|
83
|
-
"-otxt",
|
|
84
|
-
"-of",
|
|
92
|
+
outputFormat === "srt" ? "-osrt" : "-otxt",
|
|
93
|
+
"-of", tmpOutputBase,
|
|
85
94
|
];
|
|
86
|
-
// Spawn detached, redirect
|
|
95
|
+
// Spawn detached, redirect stdout+stderr to log file
|
|
87
96
|
const logFd = openSync(logPath, "w");
|
|
88
97
|
const child = spawn(WHISPER_CLI_PATH, args, {
|
|
89
98
|
detached: true,
|
|
@@ -100,6 +109,8 @@ async function spawnDetached(filePath, model, language, threads) {
|
|
|
100
109
|
transcribeFrom,
|
|
101
110
|
isTmp,
|
|
102
111
|
outputPath,
|
|
112
|
+
tmpOutputBase,
|
|
113
|
+
outputFormat,
|
|
103
114
|
logPath,
|
|
104
115
|
jobPath,
|
|
105
116
|
startTime: new Date().toISOString(),
|
|
@@ -146,9 +157,21 @@ async function readJobProgress(jobId) {
|
|
|
146
157
|
}
|
|
147
158
|
const lastSec = parseLastTimestamp(logContent);
|
|
148
159
|
const isRunning = await isPidRunning(job.pid);
|
|
149
|
-
const
|
|
160
|
+
const ext = job.outputFormat === "srt" ? ".srt" : ".txt";
|
|
161
|
+
const tmpOutput = `${job.tmpOutputBase}${ext}`;
|
|
162
|
+
const outputExists = existsSync(job.outputPath) || existsSync(tmpOutput);
|
|
150
163
|
// Completed
|
|
151
164
|
if (!isRunning && outputExists) {
|
|
165
|
+
// Move temp output file to correct destination if needed
|
|
166
|
+
const ext = job.outputFormat === "srt" ? ".srt" : ".txt";
|
|
167
|
+
const tmpOutput = `${job.tmpOutputBase}${ext}`;
|
|
168
|
+
if (existsSync(tmpOutput) && tmpOutput !== job.outputPath) {
|
|
169
|
+
try {
|
|
170
|
+
writeFileSync(job.outputPath, readFileSync(tmpOutput, "utf8"), "utf8");
|
|
171
|
+
unlinkSync(tmpOutput);
|
|
172
|
+
}
|
|
173
|
+
catch { }
|
|
174
|
+
}
|
|
152
175
|
job.status = "complete";
|
|
153
176
|
writeFileSync(job.jobPath, JSON.stringify(job, null, 2), "utf8");
|
|
154
177
|
// Clean up tmp wav if present
|
|
@@ -158,11 +181,14 @@ async function readJobProgress(jobId) {
|
|
|
158
181
|
}
|
|
159
182
|
catch { }
|
|
160
183
|
}
|
|
161
|
-
const
|
|
184
|
+
const outputContent = readFileSync(job.outputPath, "utf8").trim();
|
|
185
|
+
const preview = job.outputFormat === "srt"
|
|
186
|
+
? outputContent.split("\n").slice(0, 20).join("\n")
|
|
187
|
+
: outputContent.slice(0, 600);
|
|
162
188
|
return (`✅ Complete!\n\n` +
|
|
163
189
|
`Source: ${basename(job.sourceFile)}\n` +
|
|
164
190
|
`Output: ${job.outputPath}\n\n` +
|
|
165
|
-
`Preview:\n${
|
|
191
|
+
`Preview:\n${preview}${outputContent.length > 600 && job.outputFormat !== "srt" ? "..." : ""}`);
|
|
166
192
|
}
|
|
167
193
|
// Failed
|
|
168
194
|
if (!isRunning && !outputExists) {
|
|
@@ -536,7 +562,7 @@ function getFiles(dir, recursive) {
|
|
|
536
562
|
// ---------------------------------------------------------------------------
|
|
537
563
|
// MCP Server
|
|
538
564
|
// ---------------------------------------------------------------------------
|
|
539
|
-
const server = new Server({ name: "whisper-windows-mcp", version: "
|
|
565
|
+
const server = new Server({ name: "whisper-windows-mcp", version: "2.0.0" }, { capabilities: { tools: {} } });
|
|
540
566
|
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
541
567
|
tools: [
|
|
542
568
|
{
|
|
@@ -622,7 +648,12 @@ server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
|
622
648
|
},
|
|
623
649
|
translate_to_english: {
|
|
624
650
|
type: "boolean",
|
|
625
|
-
description: "Also generate an English translation .srt alongside the native language .srt. Only applies when language is not 'en'.",
|
|
651
|
+
description: "Also generate an English translation .srt alongside the native language .srt. Only applies when language is not 'en'. Not available in background mode.",
|
|
652
|
+
default: false,
|
|
653
|
+
},
|
|
654
|
+
background: {
|
|
655
|
+
type: "boolean",
|
|
656
|
+
description: "Run as a detached background job — recommended for files over 10 minutes. Returns a job ID to use with check_progress. translate_to_english is not available in background mode.",
|
|
626
657
|
default: false,
|
|
627
658
|
},
|
|
628
659
|
threads: { type: "number", description: `CPU threads. Defaults to ${WHISPER_THREADS} of ${SYSTEM_THREADS}.` },
|
|
@@ -880,7 +911,7 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
880
911
|
};
|
|
881
912
|
}
|
|
882
913
|
try {
|
|
883
|
-
const { jobId, pid } = await spawnDetached(filePath, model, language, threads);
|
|
914
|
+
const { jobId, pid } = await spawnDetached(filePath, model, language, threads, outputFormat === "srt" ? "srt" : "text");
|
|
884
915
|
return {
|
|
885
916
|
content: [{
|
|
886
917
|
type: "text",
|
|
@@ -1015,6 +1046,7 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
1015
1046
|
const filePath = args?.file_path;
|
|
1016
1047
|
const language = args?.language || "en";
|
|
1017
1048
|
const translateToEnglish = args?.translate_to_english || false;
|
|
1049
|
+
const background = args?.background || false;
|
|
1018
1050
|
const threads = Math.min(SYSTEM_THREADS, Math.max(1, Math.round(args?.threads || WHISPER_THREADS)));
|
|
1019
1051
|
if (!filePath)
|
|
1020
1052
|
return { content: [{ type: "text", text: "file_path is required." }], isError: true };
|
|
@@ -1026,6 +1058,28 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
1026
1058
|
if (await isWhisperRunning()) {
|
|
1027
1059
|
return { content: [{ type: "text", text: "Transcription already in progress. Wait for it to finish first." }], isError: true };
|
|
1028
1060
|
}
|
|
1061
|
+
// Background mode — detached SRT job
|
|
1062
|
+
if (background) {
|
|
1063
|
+
try {
|
|
1064
|
+
const { jobId, pid } = await spawnDetached(filePath, WHISPER_MODEL, language, threads, "srt");
|
|
1065
|
+
return {
|
|
1066
|
+
content: [{
|
|
1067
|
+
type: "text",
|
|
1068
|
+
text: `⏳ Background subtitle generation started.\n\n` +
|
|
1069
|
+
`Source: ${basename(filePath)}\n` +
|
|
1070
|
+
`Job ID: ${jobId}\n` +
|
|
1071
|
+
`PID: ${pid}\n` +
|
|
1072
|
+
`Language: ${language}\n\n` +
|
|
1073
|
+
`Call check_progress with job_id="${jobId}" to monitor.\n` +
|
|
1074
|
+
`Note: translate_to_english is not available in background mode. ` +
|
|
1075
|
+
`Run generate_subtitles again after completion to create the English translation.`,
|
|
1076
|
+
}],
|
|
1077
|
+
};
|
|
1078
|
+
}
|
|
1079
|
+
catch (err) {
|
|
1080
|
+
return { content: [{ type: "text", text: `Failed to start background subtitle job:\n\n${err?.message || String(err)}` }], isError: true };
|
|
1081
|
+
}
|
|
1082
|
+
}
|
|
1029
1083
|
try {
|
|
1030
1084
|
// Convert to WAV if needed
|
|
1031
1085
|
let transcribeFrom = filePath;
|
|
@@ -1165,7 +1219,7 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
1165
1219
|
async function main() {
|
|
1166
1220
|
const transport = new StdioServerTransport();
|
|
1167
1221
|
await server.connect(transport);
|
|
1168
|
-
console.error(`whisper-windows-mcp
|
|
1222
|
+
console.error(`whisper-windows-mcp v2.0.0 running | threads: ${WHISPER_THREADS}/${SYSTEM_THREADS}`);
|
|
1169
1223
|
}
|
|
1170
1224
|
main().catch((err) => {
|
|
1171
1225
|
console.error("Fatal error:", err);
|
package/package.json
CHANGED