GameSentenceMiner 2.15.2__tar.gz → 2.15.4__tar.gz

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.
Files changed (85) hide show
  1. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/config_gui.py +53 -26
  2. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/locales/en_us.json +4 -0
  3. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/locales/ja_jp.json +4 -0
  4. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/locales/zh_cn.json +4 -0
  5. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/obs.py +241 -194
  6. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/ocr/owocr_helper.py +1 -1
  7. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/owocr/owocr/ocr.py +2 -24
  8. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/util/configuration.py +1 -0
  9. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/util/get_overlay_coords.py +0 -1
  10. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/vad.py +3 -1
  11. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner.egg-info/PKG-INFO +1 -1
  12. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/PKG-INFO +1 -1
  13. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/pyproject.toml +1 -1
  14. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/__init__.py +0 -0
  15. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/ai/__init__.py +0 -0
  16. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/ai/ai_prompting.py +0 -0
  17. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/anki.py +0 -0
  18. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/assets/__init__.py +0 -0
  19. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/assets/icon.png +0 -0
  20. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/assets/icon128.png +0 -0
  21. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/assets/icon256.png +0 -0
  22. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/assets/icon32.png +0 -0
  23. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/assets/icon512.png +0 -0
  24. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/assets/icon64.png +0 -0
  25. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/assets/pickaxe.png +0 -0
  26. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/gametext.py +0 -0
  27. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/gsm.py +0 -0
  28. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/ocr/__init__.py +0 -0
  29. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/ocr/gsm_ocr_config.py +0 -0
  30. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/ocr/ocrconfig.py +0 -0
  31. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/ocr/owocr_area_selector.py +0 -0
  32. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/ocr/ss_picker.py +0 -0
  33. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/owocr/owocr/__init__.py +0 -0
  34. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/owocr/owocr/__main__.py +0 -0
  35. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/owocr/owocr/config.py +0 -0
  36. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/owocr/owocr/lens_betterproto.py +0 -0
  37. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/owocr/owocr/run.py +0 -0
  38. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/owocr/owocr/screen_coordinate_picker.py +0 -0
  39. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/tools/__init__.py +0 -0
  40. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/tools/audio_offset_selector.py +0 -0
  41. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/tools/furigana_filter_preview.py +0 -0
  42. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/tools/ss_selector.py +0 -0
  43. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/tools/window_transparency.py +0 -0
  44. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/util/__init__.py +0 -0
  45. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/util/communication/__init__.py +0 -0
  46. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/util/communication/send.py +0 -0
  47. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/util/communication/websocket.py +0 -0
  48. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/util/db.py +0 -0
  49. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/util/downloader/Untitled_json.py +0 -0
  50. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/util/downloader/__init__.py +0 -0
  51. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/util/downloader/download_tools.py +0 -0
  52. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/util/downloader/oneocr_dl.py +0 -0
  53. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/util/electron_config.py +0 -0
  54. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/util/ffmpeg.py +0 -0
  55. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/util/gsm_utils.py +0 -0
  56. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/util/model.py +0 -0
  57. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/util/notification.py +0 -0
  58. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/util/text_log.py +0 -0
  59. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/util/win10toast/__init__.py +0 -0
  60. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/util/win10toast/__main__.py +0 -0
  61. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/web/__init__.py +0 -0
  62. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/web/service.py +0 -0
  63. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/web/static/__init__.py +0 -0
  64. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/web/static/apple-touch-icon.png +0 -0
  65. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/web/static/favicon-96x96.png +0 -0
  66. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/web/static/favicon.ico +0 -0
  67. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/web/static/favicon.svg +0 -0
  68. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/web/static/site.webmanifest +0 -0
  69. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/web/static/style.css +0 -0
  70. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/web/static/web-app-manifest-192x192.png +0 -0
  71. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/web/static/web-app-manifest-512x512.png +0 -0
  72. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/web/templates/__init__.py +0 -0
  73. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/web/templates/index.html +0 -0
  74. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/web/templates/text_replacements.html +0 -0
  75. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/web/templates/utility.html +0 -0
  76. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/web/texthooking_page.py +0 -0
  77. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner/wip/__init___.py +0 -0
  78. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner.egg-info/SOURCES.txt +0 -0
  79. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner.egg-info/dependency_links.txt +0 -0
  80. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner.egg-info/entry_points.txt +0 -0
  81. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner.egg-info/requires.txt +0 -0
  82. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/GameSentenceMiner.egg-info/top_level.txt +0 -0
  83. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/LICENSE +0 -0
  84. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/README.md +0 -0
  85. {gamesentenceminer-2.15.2 → gamesentenceminer-2.15.4}/setup.cfg +0 -0
@@ -379,6 +379,7 @@ class ConfigApp:
379
379
  self.ai_enabled_value = tk.BooleanVar(value=self.settings.ai.enabled)
380
380
  self.ai_provider_value = tk.StringVar(value=self.settings.ai.provider)
381
381
  self.gemini_model_value = tk.StringVar(value=self.settings.ai.gemini_model)
382
+ self.use_cpu_for_inference_value = tk.BooleanVar(value=self.settings.vad.use_cpu_for_inference)
382
383
  self.groq_model_value = tk.StringVar(value=self.settings.ai.groq_model)
383
384
  self.gemini_api_key_value = tk.StringVar(value=self.settings.ai.gemini_api_key)
384
385
  self.groq_api_key_value = tk.StringVar(value=self.settings.ai.groq_api_key)
@@ -592,6 +593,7 @@ class ConfigApp:
592
593
  language=self.language_value.get(),
593
594
  cut_and_splice_segments=self.cut_and_splice_segments_value.get(),
594
595
  splice_padding=float(self.splice_padding_value.get()) if self.splice_padding_value.get() else 0.0,
596
+ use_cpu_for_inference=self.use_cpu_for_inference_value.get(),
595
597
  ),
596
598
  advanced=Advanced(
597
599
  audio_player_path=self.audio_player_path_value.get(),
@@ -1137,12 +1139,11 @@ class ConfigApp:
1137
1139
  ttk.Entry(vad_frame, textvariable=self.splice_padding_value).grid(row=self.current_row, column=3, sticky='EW', pady=2)
1138
1140
  self.current_row += 1
1139
1141
 
1140
- self.add_reset_button(vad_frame, "vad", self.current_row, 0, self.create_vad_tab)
1141
-
1142
- for col in range(5): vad_frame.grid_columnconfigure(col, weight=0)
1143
- for row in range(self.current_row): vad_frame.grid_rowconfigure(row, minsize=30)
1144
-
1145
- return vad_frame
1142
+ # Force CPU for Whisper
1143
+ use_cpu_i18n = vad_i18n.get('use_cpu_for_inference', {})
1144
+ HoverInfoLabelWidget(vad_frame, text=use_cpu_i18n.get('label', 'Force CPU'), tooltip=use_cpu_i18n.get('tooltip', 'Even if CUDA is installed, use CPU for Whisper'), row=self.current_row, column=0)
1145
+ ttk.Checkbutton(vad_frame, variable=self.use_cpu_for_inference_value, bootstyle="round-toggle").grid(row=self.current_row, column=1, sticky='W', pady=2)
1146
+ self.current_row += 1
1146
1147
 
1147
1148
  @new_tab
1148
1149
  def create_paths_tab(self):
@@ -1224,8 +1225,10 @@ class ConfigApp:
1224
1225
 
1225
1226
  self.add_reset_button(paths_frame, "paths", self.current_row, 0, self.create_paths_tab)
1226
1227
 
1227
- for col in range(3): paths_frame.grid_columnconfigure(col, weight=0)
1228
- for row in range(self.current_row): paths_frame.grid_rowconfigure(row, minsize=30)
1228
+ for col in range(3):
1229
+ paths_frame.grid_columnconfigure(col, weight=0)
1230
+ for row in range(self.current_row):
1231
+ paths_frame.grid_rowconfigure(row, minsize=30)
1229
1232
 
1230
1233
  return paths_frame
1231
1234
 
@@ -1368,8 +1371,10 @@ class ConfigApp:
1368
1371
 
1369
1372
  self.add_reset_button(anki_frame, "anki", self.current_row, 0, self.create_anki_tab)
1370
1373
 
1371
- for col in range(2): anki_frame.grid_columnconfigure(col, weight=0)
1372
- for row in range(self.current_row): anki_frame.grid_rowconfigure(row, minsize=30)
1374
+ for col in range(2):
1375
+ anki_frame.grid_columnconfigure(col, weight=0)
1376
+ for row in range(self.current_row):
1377
+ anki_frame.grid_rowconfigure(row, minsize=30)
1373
1378
 
1374
1379
  return anki_frame
1375
1380
 
@@ -1431,8 +1436,10 @@ class ConfigApp:
1431
1436
 
1432
1437
  self.add_reset_button(features_frame, "features", self.current_row, 0, self.create_features_tab)
1433
1438
 
1434
- for col in range(3): features_frame.grid_columnconfigure(col, weight=0)
1435
- for row in range(self.current_row): features_frame.grid_rowconfigure(row, minsize=30)
1439
+ for col in range(3):
1440
+ features_frame.grid_columnconfigure(col, weight=0)
1441
+ for row in range(self.current_row):
1442
+ features_frame.grid_rowconfigure(row, minsize=30)
1436
1443
 
1437
1444
  return features_frame
1438
1445
 
@@ -1533,8 +1540,10 @@ class ConfigApp:
1533
1540
 
1534
1541
  self.add_reset_button(screenshot_frame, "screenshot", self.current_row, 0, self.create_screenshot_tab)
1535
1542
 
1536
- for col in range(3): screenshot_frame.grid_columnconfigure(col, weight=0)
1537
- for row in range(self.current_row): screenshot_frame.grid_rowconfigure(row, minsize=30)
1543
+ for col in range(3):
1544
+ screenshot_frame.grid_columnconfigure(col, weight=0)
1545
+ for row in range(self.current_row):
1546
+ screenshot_frame.grid_rowconfigure(row, minsize=30)
1538
1547
 
1539
1548
  return screenshot_frame
1540
1549
 
@@ -1647,8 +1656,10 @@ class ConfigApp:
1647
1656
 
1648
1657
  self.add_reset_button(audio_frame, "audio", self.current_row, 0, self.create_audio_tab)
1649
1658
 
1650
- for col in range(5): audio_frame.grid_columnconfigure(col, weight=0)
1651
- for row in range(self.current_row): audio_frame.grid_rowconfigure(row, minsize=30)
1659
+ for col in range(5):
1660
+ audio_frame.grid_columnconfigure(col, weight=0)
1661
+ for row in range(self.current_row):
1662
+ audio_frame.grid_rowconfigure(row, minsize=30)
1652
1663
 
1653
1664
  return audio_frame
1654
1665
 
@@ -1752,8 +1763,10 @@ class ConfigApp:
1752
1763
 
1753
1764
  self.add_reset_button(obs_frame, "obs", self.current_row, 0, self.create_obs_tab)
1754
1765
 
1755
- for col in range(3): obs_frame.grid_columnconfigure(col, weight=0)
1756
- for row in range(self.current_row): obs_frame.grid_rowconfigure(row, minsize=30)
1766
+ for col in range(3):
1767
+ obs_frame.grid_columnconfigure(col, weight=0)
1768
+ for row in range(self.current_row):
1769
+ obs_frame.grid_rowconfigure(row, minsize=30)
1757
1770
 
1758
1771
  return obs_frame
1759
1772
 
@@ -1814,8 +1827,10 @@ class ConfigApp:
1814
1827
  row=self.current_row, column=1, sticky='W', pady=2)
1815
1828
  self.current_row += 1
1816
1829
 
1817
- for col in range(4): profiles_frame.grid_columnconfigure(col, weight=0)
1818
- for row in range(self.current_row): profiles_frame.grid_rowconfigure(row, minsize=30)
1830
+ for col in range(4):
1831
+ profiles_frame.grid_columnconfigure(col, weight=0)
1832
+ for row in range(self.current_row):
1833
+ profiles_frame.grid_rowconfigure(row, minsize=30)
1819
1834
 
1820
1835
  return profiles_frame
1821
1836
 
@@ -1945,8 +1960,10 @@ class ConfigApp:
1945
1960
 
1946
1961
  self.add_reset_button(advanced_frame, "advanced", self.current_row, 0, self.create_advanced_tab)
1947
1962
 
1948
- for col in range(4): advanced_frame.grid_columnconfigure(col, weight=0)
1949
- for row in range(self.current_row): advanced_frame.grid_rowconfigure(row, minsize=30)
1963
+ for col in range(4):
1964
+ advanced_frame.grid_columnconfigure(col, weight=0)
1965
+ for row in range(self.current_row):
1966
+ advanced_frame.grid_rowconfigure(row, minsize=30)
1950
1967
 
1951
1968
  return advanced_frame
1952
1969
 
@@ -1997,6 +2014,12 @@ class ConfigApp:
1997
2014
  self.groq_models_combobox = ttk.Combobox(ai_frame, textvariable=self.groq_model_value, values=RECOMMENDED_GROQ_MODELS, state="readonly")
1998
2015
  self.groq_models_combobox.grid(row=self.current_row, column=1, sticky='EW', pady=2)
1999
2016
  self.current_row += 1
2017
+
2018
+ # Force CPU for Whisper
2019
+ use_cpu_i18n = ai_i18n.get('use_cpu_for_inference', {})
2020
+ HoverInfoLabelWidget(ai_frame, text=use_cpu_i18n.get('label', 'Force CPU'), tooltip=use_cpu_i18n.get('tooltip', 'Even if CUDA is installed, use CPU for Whisper'), row=self.current_row, column=0)
2021
+ ttk.Checkbutton(ai_frame, variable=self.use_cpu_for_inference_value, bootstyle="round-toggle").grid(row=self.current_row, column=1, sticky='W', pady=2)
2022
+ self.current_row += 1
2000
2023
 
2001
2024
  groq_key_i18n = ai_i18n.get('groq_api_key', {})
2002
2025
  HoverInfoLabelWidget(ai_frame, text=groq_key_i18n.get('label', '...'), tooltip=groq_key_i18n.get('tooltip', '...'),
@@ -2067,8 +2090,10 @@ class ConfigApp:
2067
2090
 
2068
2091
  self.add_reset_button(ai_frame, "ai", self.current_row, 0, self.create_ai_tab)
2069
2092
 
2070
- for col in range(3): ai_frame.grid_columnconfigure(col, weight=0)
2071
- for row in range(self.current_row): ai_frame.grid_rowconfigure(row, minsize=30)
2093
+ for col in range(3):
2094
+ ai_frame.grid_columnconfigure(col, weight=0)
2095
+ for row in range(self.current_row):
2096
+ ai_frame.grid_rowconfigure(row, minsize=30)
2072
2097
 
2073
2098
  return ai_frame
2074
2099
 
@@ -2245,8 +2270,10 @@ class ConfigApp:
2245
2270
 
2246
2271
  self.add_reset_button(wip_frame, "wip", self.current_row, 0, self.create_wip_tab)
2247
2272
 
2248
- for col in range(2): wip_frame.grid_columnconfigure(col, weight=0)
2249
- for row in range(self.current_row): wip_frame.grid_rowconfigure(row, minsize=30)
2273
+ for col in range(2):
2274
+ wip_frame.grid_columnconfigure(col, weight=0)
2275
+ for row in range(self.current_row):
2276
+ wip_frame.grid_rowconfigure(row, minsize=30)
2250
2277
 
2251
2278
  return wip_frame
2252
2279
 
@@ -260,6 +260,10 @@
260
260
  "splice_padding": {
261
261
  "label": "Padding:",
262
262
  "tooltip": "Cut Detected Voice Segments and Paste them back together. More Padding = More Space between voicelines."
263
+ },
264
+ "use_cpu_for_inference": {
265
+ "label": "Force CPU:",
266
+ "tooltip": "Even if CUDA is installed, use CPU for Whisper"
263
267
  }
264
268
  },
265
269
  "features": {
@@ -259,6 +259,10 @@
259
259
  "splice_padding": {
260
260
  "label": "パディング:",
261
261
  "tooltip": "結合する音声セグメント間の間隔(秒)。"
262
+ },
263
+ "use_cpu_for_inference": {
264
+ "label": "CPU強制使用:",
265
+ "tooltip": "CUDAがインストールされていてもWhisperでCPUを使用します"
262
266
  }
263
267
  },
264
268
  "features": {
@@ -260,6 +260,10 @@
260
260
  "splice_padding": {
261
261
  "label": "填充:",
262
262
  "tooltip": "剪切检测到的语音片段并将其重新拼接。更多填充 = 语音间距更大。"
263
+ },
264
+ "use_cpu_for_inference": {
265
+ "label": "强制使用 CPU:",
266
+ "tooltip": "即使已安装 CUDA,也强制使用 CPU 运行 Whisper"
263
267
  }
264
268
  },
265
269
  "features": {