GameSentenceMiner 2.14.5__py3-none-any.whl → 2.14.7__py3-none-any.whl
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.
- GameSentenceMiner/obs.py +1 -1
- GameSentenceMiner/ocr/owocr_helper.py +21 -5
- GameSentenceMiner/util/configuration.py +1 -1
- GameSentenceMiner/util/get_overlay_coords.py +17 -3
- gamesentenceminer-2.14.7.dist-info/METADATA +169 -0
- {gamesentenceminer-2.14.5.dist-info → gamesentenceminer-2.14.7.dist-info}/RECORD +10 -10
- gamesentenceminer-2.14.5.dist-info/METADATA +0 -51
- {gamesentenceminer-2.14.5.dist-info → gamesentenceminer-2.14.7.dist-info}/WHEEL +0 -0
- {gamesentenceminer-2.14.5.dist-info → gamesentenceminer-2.14.7.dist-info}/entry_points.txt +0 -0
- {gamesentenceminer-2.14.5.dist-info → gamesentenceminer-2.14.7.dist-info}/licenses/LICENSE +0 -0
- {gamesentenceminer-2.14.5.dist-info → gamesentenceminer-2.14.7.dist-info}/top_level.txt +0 -0
GameSentenceMiner/obs.py
CHANGED
@@ -378,8 +378,16 @@ def text_callback(text, orig_text, time, img=None, came_from_ss=False, filtering
|
|
378
378
|
previous_orig_text = orig_text_string
|
379
379
|
previous_ocr1_result = previous_text
|
380
380
|
if crop_coords and get_ocr_optimize_second_scan():
|
381
|
+
x1, y1, x2, y2 = crop_coords
|
382
|
+
x1 = max(0, min(x1, img.width))
|
383
|
+
y1 = max(0, min(y1, img.height))
|
384
|
+
x2 = max(x1, min(x2, img.width))
|
385
|
+
y2 = max(y1, min(y2, img.height))
|
381
386
|
previous_img_local.save(os.path.join(get_temporary_directory(), "pre_oneocrcrop.png"))
|
382
|
-
|
387
|
+
try:
|
388
|
+
previous_img_local = previous_img_local.crop((x1, y1, x2, y2))
|
389
|
+
except ValueError:
|
390
|
+
logger.warning("Error cropping image, using original image")
|
383
391
|
second_ocr_queue.put((previous_text, stable_time, previous_img_local, filtering, pre_crop_image))
|
384
392
|
# threading.Thread(target=do_second_ocr, args=(previous_text, stable_time, previous_img_local, filtering), daemon=True).start()
|
385
393
|
previous_img = None
|
@@ -468,8 +476,6 @@ def add_ss_hotkey(ss_hotkey="ctrl+shift+g"):
|
|
468
476
|
img = run.apply_ocr_config_to_image(img, ocr_config, is_secondary=True)
|
469
477
|
do_second_ocr("", datetime.now(), img, TextFiltering(lang=get_ocr_language()), ignore_furigana_filter=True, ignore_previous_result=True)
|
470
478
|
|
471
|
-
if not manual:
|
472
|
-
keyboard.add_hotkey(get_ocr_manual_ocr_hotkey().lower(), ocr_secondary_rectangles)
|
473
479
|
secret_ss_hotkey = "F14"
|
474
480
|
filtering = TextFiltering(lang=get_ocr_language())
|
475
481
|
cropper = ScreenCropper()
|
@@ -487,19 +493,29 @@ def add_ss_hotkey(ss_hotkey="ctrl+shift+g"):
|
|
487
493
|
hotkey_reg = None
|
488
494
|
try:
|
489
495
|
hotkey_reg = keyboard.add_hotkey(ss_hotkey, capture)
|
496
|
+
if not manual:
|
497
|
+
secondary_hotkey_reg = keyboard.add_hotkey(get_ocr_manual_ocr_hotkey().lower(), ocr_secondary_rectangles)
|
490
498
|
if "f13" in ss_hotkey.lower():
|
491
|
-
keyboard.add_hotkey(secret_ss_hotkey, capture_main_monitor)
|
499
|
+
secret_hotkey_reg = keyboard.add_hotkey(secret_ss_hotkey, capture_main_monitor)
|
492
500
|
print(f"Press {ss_hotkey} to take a screenshot.")
|
493
501
|
except Exception as e:
|
494
502
|
if hotkey_reg:
|
495
503
|
keyboard.remove_hotkey(hotkey_reg)
|
504
|
+
if secondary_hotkey_reg:
|
505
|
+
keyboard.remove_hotkey(secondary_hotkey_reg)
|
506
|
+
if secret_hotkey_reg:
|
507
|
+
keyboard.remove_hotkey(secret_hotkey_reg)
|
496
508
|
logger.error(f"Error setting up screenshot hotkey with keyboard, Attempting Backup: {e}")
|
497
509
|
logger.debug(e)
|
498
510
|
pynput_hotkey = ss_hotkey.replace("ctrl", "<ctrl>").replace("shift", "<shift>").replace("alt", "<alt>")
|
511
|
+
secret_ss_hotkey = secret_hotkey_reg.replace("ctrl", "<ctrl>").replace("shift", "<shift>").replace("alt", "<alt>")
|
512
|
+
secondary_ss_hotkey = secondary_hotkey_reg.replace("ctrl", "<ctrl>").replace("shift", "<shift>").replace("alt", "<alt>")
|
499
513
|
try:
|
500
514
|
from pynput import keyboard as pynput_keyboard
|
501
515
|
listener = pynput_keyboard.GlobalHotKeys({
|
502
|
-
pynput_hotkey: capture
|
516
|
+
pynput_hotkey: capture,
|
517
|
+
secondary_ss_hotkey: ocr_secondary_rectangles,
|
518
|
+
secret_ss_hotkey: capture_main_monitor
|
503
519
|
})
|
504
520
|
listener.start()
|
505
521
|
print(f"Press {pynput_hotkey} to take a screenshot.")
|
@@ -17,7 +17,6 @@ from dataclasses_json import dataclass_json
|
|
17
17
|
|
18
18
|
from importlib import metadata
|
19
19
|
|
20
|
-
import requests
|
21
20
|
|
22
21
|
|
23
22
|
OFF = 'OFF'
|
@@ -361,6 +360,7 @@ def get_current_version():
|
|
361
360
|
|
362
361
|
def get_latest_version():
|
363
362
|
try:
|
363
|
+
import requests
|
364
364
|
response = requests.get(f"https://pypi.org/pypi/{PACKAGE_NAME}/json")
|
365
365
|
latest_version = response.json()["info"]["version"]
|
366
366
|
return latest_version
|
@@ -134,10 +134,24 @@ class OverlayProcessor:
|
|
134
134
|
composite_img = Image.new("RGBA", (monitor_width, monitor_height), (0, 0, 0, 0))
|
135
135
|
|
136
136
|
for crop_coords in crop_coords_list:
|
137
|
-
|
137
|
+
# Ensure crop coordinates are within image bounds
|
138
|
+
x1, y1, x2, y2 = crop_coords
|
139
|
+
x1 = max(0, min(x1, full_screenshot.width))
|
140
|
+
y1 = max(0, min(y1, full_screenshot.height))
|
141
|
+
x2 = max(x1, min(x2, full_screenshot.width))
|
142
|
+
y2 = max(y1, min(y2, full_screenshot.height))
|
143
|
+
|
144
|
+
# Skip if the coordinates result in an invalid box
|
145
|
+
if x1 >= x2 or y1 >= y2:
|
146
|
+
continue
|
147
|
+
try:
|
148
|
+
cropped_image = full_screenshot.crop((x1, y1, x2, y2))
|
149
|
+
except ValueError:
|
150
|
+
logger.warning("Error cropping image, using original image")
|
151
|
+
return full_screenshot
|
138
152
|
# Paste the cropped image onto the canvas at its original location
|
139
|
-
paste_x = math.floor(
|
140
|
-
paste_y = math.floor(
|
153
|
+
paste_x = math.floor(x1)
|
154
|
+
paste_y = math.floor(y1)
|
141
155
|
composite_img.paste(cropped_image, (paste_x, paste_y))
|
142
156
|
|
143
157
|
return composite_img
|
@@ -0,0 +1,169 @@
|
|
1
|
+
Metadata-Version: 2.4
|
2
|
+
Name: GameSentenceMiner
|
3
|
+
Version: 2.14.7
|
4
|
+
Summary: A tool for mining sentences from games. Update: Overlay?
|
5
|
+
Author-email: Beangate <bpwhelan95@gmail.com>
|
6
|
+
License: MIT License
|
7
|
+
Project-URL: Homepage, https://github.com/bpwhelan/GameSentenceMiner
|
8
|
+
Project-URL: Repository, https://github.com/bpwhelan/GameSentenceMiner
|
9
|
+
Classifier: Programming Language :: Python :: 3
|
10
|
+
Classifier: License :: OSI Approved :: MIT License
|
11
|
+
Classifier: Operating System :: OS Independent
|
12
|
+
Requires-Python: >=3.10
|
13
|
+
Description-Content-Type: text/markdown
|
14
|
+
License-File: LICENSE
|
15
|
+
Requires-Dist: requests~=2.32.3
|
16
|
+
Requires-Dist: watchdog~=5.0.2
|
17
|
+
Requires-Dist: DateTime~=5.5
|
18
|
+
Requires-Dist: pyperclip~=1.9.0
|
19
|
+
Requires-Dist: soundfile~=0.12.1
|
20
|
+
Requires-Dist: toml~=0.10.2
|
21
|
+
Requires-Dist: psutil~=6.0.0
|
22
|
+
Requires-Dist: rapidfuzz~=3.9.7
|
23
|
+
Requires-Dist: plyer~=2.1.0
|
24
|
+
Requires-Dist: keyboard~=0.13.5
|
25
|
+
Requires-Dist: websockets~=15.0.1
|
26
|
+
Requires-Dist: openai-whisper==20240930; sys_platform == "win32"
|
27
|
+
Requires-Dist: openai-whisper; sys_platform != "win32"
|
28
|
+
Requires-Dist: stable-ts-whisperless
|
29
|
+
Requires-Dist: silero-vad~=5.1.2
|
30
|
+
Requires-Dist: ttkbootstrap~=1.10.1
|
31
|
+
Requires-Dist: dataclasses_json~=0.6.7
|
32
|
+
Requires-Dist: win10toast; sys_platform == "win32"
|
33
|
+
Requires-Dist: numpy==2.2.6
|
34
|
+
Requires-Dist: pystray
|
35
|
+
Requires-Dist: pywin32; sys_platform == "win32"
|
36
|
+
Requires-Dist: pygetwindow; sys_platform == "win32"
|
37
|
+
Requires-Dist: flask
|
38
|
+
Requires-Dist: groq
|
39
|
+
Requires-Dist: matplotlib
|
40
|
+
Requires-Dist: sounddevice
|
41
|
+
Requires-Dist: google-genai
|
42
|
+
Requires-Dist: owocr
|
43
|
+
Requires-Dist: oneocr
|
44
|
+
Requires-Dist: openai
|
45
|
+
Requires-Dist: scikit-image
|
46
|
+
Requires-Dist: opencv-python
|
47
|
+
Requires-Dist: betterproto==2.0.0b7
|
48
|
+
Requires-Dist: obsws-python~=1.7.2
|
49
|
+
Requires-Dist: numpy==2.2.6
|
50
|
+
Requires-Dist: regex
|
51
|
+
Dynamic: license-file
|
52
|
+
|
53
|
+
# GSM - An Immersion toolkit for Games.
|
54
|
+
|
55
|
+
### English | [日本語](../docs/ja/README.md) | [简体中文](../docs/zh/README.md).
|
56
|
+
|
57
|
+
An application designed to assist with language learning through games.
|
58
|
+
|
59
|
+
Short Demo (Watch this first): https://www.youtube.com/watch?v=FeFBL7py6HY
|
60
|
+
|
61
|
+
Installation: https://youtu.be/h5ksXallc-o
|
62
|
+
|
63
|
+
Discord: https://discord.gg/yP8Qse6bb8
|
64
|
+
|
65
|
+
## Features
|
66
|
+
|
67
|
+
### Anki Card Enhancement
|
68
|
+
|
69
|
+
GSM significantly enhances your Anki cards with rich contextual information:
|
70
|
+
|
71
|
+
* **Automated Audio Capture**: Automatically records the voice line associated with the text.
|
72
|
+
|
73
|
+
* **Automatic Trim**: Some simple math around the time that the text event came in, in combination with a "Voice Activation Detection" (VAD) library gives us neatly cut audio.
|
74
|
+
* **Manual Trim**: If Automatic voiceline trim is not perfect, it's possible to [open the audio in an external program](https://youtu.be/LKFQFy2Qm64) for trimming.
|
75
|
+
|
76
|
+
* **Screenshot**: Captures a screenshot of the game at the moment the voice line is spoken.
|
77
|
+
|
78
|
+
* **Multi-Line**: It's possible to capture multiple lines at once with sentence audio with GSM's very own Texthooker.
|
79
|
+
|
80
|
+
* **AI Translation**: Integrates AI to provide quick translations of the captured sentence. Custom Prompts also supported. (Optional, Bring your own Key)
|
81
|
+
|
82
|
+
|
83
|
+
#### Game Example (Has Audio)
|
84
|
+
|
85
|
+
https://github.com/user-attachments/assets/df6bc38e-d74d-423e-b270-8a82eec2394c
|
86
|
+
|
87
|
+
---
|
88
|
+
|
89
|
+
#### VN Example (Has Audio)
|
90
|
+
|
91
|
+
https://github.com/user-attachments/assets/ee670fda-1a8b-4dec-b9e6-072264155c6e
|
92
|
+
|
93
|
+
### OCR
|
94
|
+
|
95
|
+
GSM runs a fork of [OwOCR](https://github.com/AuroraWright/owocr/) to provide accurate text capture from games that do not have a hook. Here are some improvements GSM makes on stock OwOCR:
|
96
|
+
|
97
|
+
* **Easier Setup**: With GSM's managed Python install, setup is only a matter of clicking a few buttons.
|
98
|
+
|
99
|
+
* **Exclusion Zones**: Instead of choosing an area to OCR, you can choose an area to exclude from OCR. Useful if you have a static interface in your game and text appears randomly throughout.
|
100
|
+
|
101
|
+
* **Two-Pass OCR**: To cut down on API calls and keep output clean, GSM features a "Two-Pass" OCR System. A Local OCR will be constantly running, and when the text on screen stabilizes, it will run a second, more accurate scan that gets sent to clipboard/WebSocket.
|
102
|
+
|
103
|
+
* **Consistent Audio Timing**: With the two-pass system, we can still get accurate audio recorded and into Anki without the use of crazy offsets or hacks.
|
104
|
+
|
105
|
+
* **More Language Support**: Stock OwOCR is hard-coded to Japanese, while in GSM you can use a variety of languages.
|
106
|
+
|
107
|
+
|
108
|
+
https://github.com/user-attachments/assets/07240472-831a-40e6-be22-c64b880b0d66
|
109
|
+
|
110
|
+
|
111
|
+
|
112
|
+
### Game Launcher Capabilities (WIP)
|
113
|
+
|
114
|
+
This is probably the feature I care least about, but if you are lazy like me, you may find this helpful.
|
115
|
+
|
116
|
+
* **Launch**: GSM can launch your games directly, simplifying the setup process.
|
117
|
+
|
118
|
+
* **Hook**: Streamlines the process of hooking your games (Agent).
|
119
|
+
|
120
|
+
This feature simplifies the process of launching games and (potentially) hooking them, making the entire workflow more efficient.
|
121
|
+
|
122
|
+
<img width="2560" height="1392" alt="GameSentenceMiner_1zuov0R9xK" src="https://github.com/user-attachments/assets/205769bb-3dd2-493b-9383-2d6e2ca05c2d" />
|
123
|
+
|
124
|
+
## Basic Requirements
|
125
|
+
|
126
|
+
* **Anki card creation tool**: [Yomitan](https://github.com/yomidevs/yomitan), [JL](https://github.com/rampaa/JL), etc.
|
127
|
+
|
128
|
+
* **A method of getting text from the game**: [Agent](https://github.com/0xDC00/agent), [Textractor](https://github.com/Artikash/Textractor), [LunaTranslator](https://github.com/HIllya51/LunaTranslator), GSM's OCR, etc.
|
129
|
+
|
130
|
+
* **A game :)**
|
131
|
+
|
132
|
+
## Documentation
|
133
|
+
|
134
|
+
For help with installation, setup, and other information, please visit the project's [Wiki](https://github.com/bpwhelan/GameSentenceMiner/wiki).
|
135
|
+
|
136
|
+
## FAQ
|
137
|
+
|
138
|
+
### How Does It Work?
|
139
|
+
|
140
|
+
This is a common question, and understanding this process will help clarify any issues you might encounter while using GSM.
|
141
|
+
|
142
|
+
1. The beginning of the voice line is marked by a text event. This usually comes from Textractor, Agent, or another texthooker. GSM can listen for a clipboard copy and/or a WebSocket server (configurable in GSM).
|
143
|
+
|
144
|
+
2. The end of the voice line is detected using a Voice Activity Detection (VAD) library running locally. ([Example](https://github.com/snakers4/silero-vad))
|
145
|
+
|
146
|
+
In essence, GSM relies on accurately timed text events to capture the corresponding audio.
|
147
|
+
|
148
|
+
GSM provides settings to accommodate less-than-ideal hooks. However, if you experience significant audio inconsistencies, they likely stem from a poorly timed hook, loud background music, or other external factors, rather than GSM itself. The core audio trimming logic has been stable and effective for many users across various games.
|
149
|
+
|
150
|
+
## Contact
|
151
|
+
|
152
|
+
If you encounter issues, please ask for help in my [Discord](https://discord.gg/yP8Qse6bb8) or create an issue here.
|
153
|
+
|
154
|
+
## Acknowledgements
|
155
|
+
|
156
|
+
* [OwOCR](https://github.com/AuroraWright/owocr) for their outstanding OCR implementation, which I've integrated into GSM.
|
157
|
+
|
158
|
+
* [chaiNNer](https://github.com/chaiNNer-org/chaiNNer) for the idea of installing Python within an Electron app.
|
159
|
+
|
160
|
+
* [OBS](https://obsproject.com/) and [FFMPEG](https://ffmpeg.org/), without which GSM would not be possible.
|
161
|
+
|
162
|
+
* [Renji's Texthooker](https://github.com/Renji-XD/texthooker-ui)
|
163
|
+
|
164
|
+
* https://github.com/Saplling/transparent-texthooker-overlay
|
165
|
+
|
166
|
+
## Donations
|
167
|
+
|
168
|
+
If you've found this or any of my other projects helpful, please consider supporting my work through [GitHub Sponsors](https://github.com/sponsors/bpwhelan), or [Ko-fi](https://ko-fi.com/beangate).
|
169
|
+
|
@@ -3,7 +3,7 @@ GameSentenceMiner/anki.py,sha256=xTXCACDM_u9natCFnbqdxEX24F9bTsdoI7PoskWbdkk,230
|
|
3
3
|
GameSentenceMiner/config_gui.py,sha256=dTYBe3ZI9tsOiOtT2WEMnodj3q5-U4Kj5l1l1qutlsw,137549
|
4
4
|
GameSentenceMiner/gametext.py,sha256=fgBgLchezpauWELE9Y5G3kVCLfAneD0X4lJFoI3FYbs,10351
|
5
5
|
GameSentenceMiner/gsm.py,sha256=GdqegZnKrTMVRvp43bK7oNlWj5OxLx2PNdVWyHL9Gc4,28282
|
6
|
-
GameSentenceMiner/obs.py,sha256=
|
6
|
+
GameSentenceMiner/obs.py,sha256=JmtO7Ojcm14Q8P_bz8TdS24rwDdwQasg2gnO2J0KcuQ,20598
|
7
7
|
GameSentenceMiner/vad.py,sha256=zFReBMvNEEaQ_YEozCTCaMdV-o40FwtlxYRb17cYZio,19125
|
8
8
|
GameSentenceMiner/ai/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
9
9
|
GameSentenceMiner/ai/ai_prompting.py,sha256=D1KyHER_sj4jYvOKGRbp8FkKZSKWzAaXHbpmZLLFctg,23998
|
@@ -22,7 +22,7 @@ GameSentenceMiner/ocr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3h
|
|
22
22
|
GameSentenceMiner/ocr/gsm_ocr_config.py,sha256=QyBarjb6Wjt-oyor1sIT9hG-KrGdi6wODLyCrHXun6E,6008
|
23
23
|
GameSentenceMiner/ocr/ocrconfig.py,sha256=_tY8mjnzHMJrLS8E5pHqYXZjMuLoGKYgJwdhYgN-ny4,6466
|
24
24
|
GameSentenceMiner/ocr/owocr_area_selector.py,sha256=Rm1_nuZotJhfOfoJ_3mesh9udtOBjYqKhnAvSief6fo,29181
|
25
|
-
GameSentenceMiner/ocr/owocr_helper.py,sha256=
|
25
|
+
GameSentenceMiner/ocr/owocr_helper.py,sha256=6R6IbdwpjWmIrXnUvyQ_0kXRYhJe2tphqyapoxc_PsQ,28857
|
26
26
|
GameSentenceMiner/ocr/ss_picker.py,sha256=0IhxUdaKruFpZyBL-8SpxWg7bPrlGpy3lhTcMMZ5rwo,5224
|
27
27
|
GameSentenceMiner/owocr/owocr/__init__.py,sha256=87hfN5u_PbL_onLfMACbc0F5j4KyIK9lKnRCj6oZgR0,49
|
28
28
|
GameSentenceMiner/owocr/owocr/__main__.py,sha256=XQaqZY99EKoCpU-gWQjNbTs7Kg17HvBVE7JY8LqIE0o,157
|
@@ -36,11 +36,11 @@ GameSentenceMiner/tools/audio_offset_selector.py,sha256=8Stk3BP-XVIuzRv9nl9Eqd2D
|
|
36
36
|
GameSentenceMiner/tools/ss_selector.py,sha256=cbjMxiKOCuOfbRvLR_PCRlykBrGtm1LXd6u5czPqkmc,4793
|
37
37
|
GameSentenceMiner/tools/window_transparency.py,sha256=GtbxbmZg0-UYPXhfHff-7IKZyY2DKe4B9GdyovfmpeM,8166
|
38
38
|
GameSentenceMiner/util/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
39
|
-
GameSentenceMiner/util/configuration.py,sha256=
|
39
|
+
GameSentenceMiner/util/configuration.py,sha256=NnKcMyFV4y6gB6AwFUP-B-tdfk0_Awh5bJ6FHtXr6Vk,40017
|
40
40
|
GameSentenceMiner/util/db.py,sha256=2bO0rD4i8A1hhsRBER-wgZy9IK17ibRbI8DHxdKvYsI,16598
|
41
41
|
GameSentenceMiner/util/electron_config.py,sha256=KfeJToeFFVw0IR5MKa-gBzpzaGrU-lyJbR9z-sDEHYU,8767
|
42
42
|
GameSentenceMiner/util/ffmpeg.py,sha256=iqsdp3TbBv6KMACJxkUF3e5VWak3jHPZdIEMrUdKFtE,23073
|
43
|
-
GameSentenceMiner/util/get_overlay_coords.py,sha256=
|
43
|
+
GameSentenceMiner/util/get_overlay_coords.py,sha256=VtrT25DOjqMgo-eRFRMovuq6LUnoY8GrpbkfDsvgSjM,13855
|
44
44
|
GameSentenceMiner/util/gsm_utils.py,sha256=Piwv88Q9av2LBeN7M6QDi0Mp0_R2lNbkcI6ekK5hd2o,11851
|
45
45
|
GameSentenceMiner/util/model.py,sha256=R-_RYTYLSDNgBoVTPuPBcIHeOznIqi_vBzQ7VQ20WYk,6727
|
46
46
|
GameSentenceMiner/util/notification.py,sha256=-qk3kTKEERzmMxx5XMh084HCyFmbfqz0XjY1hTKhCeQ,4202
|
@@ -69,9 +69,9 @@ GameSentenceMiner/web/templates/index.html,sha256=VrhrkQKcOAPuoWRcilFLDXjvNf6WTO
|
|
69
69
|
GameSentenceMiner/web/templates/text_replacements.html,sha256=tV5c8mCaWSt_vKuUpbdbLAzXZ3ATZeDvQ9PnnAfqY0M,8598
|
70
70
|
GameSentenceMiner/web/templates/utility.html,sha256=3flZinKNqUJ7pvrZk6xu__v67z44rXnaK7UTZ303R-8,16946
|
71
71
|
GameSentenceMiner/wip/__init___.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
72
|
-
gamesentenceminer-2.14.
|
73
|
-
gamesentenceminer-2.14.
|
74
|
-
gamesentenceminer-2.14.
|
75
|
-
gamesentenceminer-2.14.
|
76
|
-
gamesentenceminer-2.14.
|
77
|
-
gamesentenceminer-2.14.
|
72
|
+
gamesentenceminer-2.14.7.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
73
|
+
gamesentenceminer-2.14.7.dist-info/METADATA,sha256=IgXqdCs45fJE7nrR3BSQMjFK_GbEZK-vdwekFSq4DOk,7330
|
74
|
+
gamesentenceminer-2.14.7.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
75
|
+
gamesentenceminer-2.14.7.dist-info/entry_points.txt,sha256=2APEP25DbfjSxGeHtwBstMH8mulVhLkqF_b9bqzU6vQ,65
|
76
|
+
gamesentenceminer-2.14.7.dist-info/top_level.txt,sha256=V1hUY6xVSyUEohb0uDoN4UIE6rUZ_JYx8yMyPGX4PgQ,18
|
77
|
+
gamesentenceminer-2.14.7.dist-info/RECORD,,
|
@@ -1,51 +0,0 @@
|
|
1
|
-
Metadata-Version: 2.4
|
2
|
-
Name: GameSentenceMiner
|
3
|
-
Version: 2.14.5
|
4
|
-
Summary: A tool for mining sentences from games. Update: Overlay?
|
5
|
-
Author-email: Beangate <bpwhelan95@gmail.com>
|
6
|
-
License: MIT License
|
7
|
-
Project-URL: Homepage, https://github.com/bpwhelan/GameSentenceMiner
|
8
|
-
Project-URL: Repository, https://github.com/bpwhelan/GameSentenceMiner
|
9
|
-
Classifier: Programming Language :: Python :: 3
|
10
|
-
Classifier: License :: OSI Approved :: MIT License
|
11
|
-
Classifier: Operating System :: OS Independent
|
12
|
-
Requires-Python: >=3.10
|
13
|
-
Description-Content-Type: text/markdown
|
14
|
-
License-File: LICENSE
|
15
|
-
Requires-Dist: requests~=2.32.3
|
16
|
-
Requires-Dist: watchdog~=5.0.2
|
17
|
-
Requires-Dist: DateTime~=5.5
|
18
|
-
Requires-Dist: pyperclip~=1.9.0
|
19
|
-
Requires-Dist: soundfile~=0.12.1
|
20
|
-
Requires-Dist: toml~=0.10.2
|
21
|
-
Requires-Dist: psutil~=6.0.0
|
22
|
-
Requires-Dist: rapidfuzz~=3.9.7
|
23
|
-
Requires-Dist: plyer~=2.1.0
|
24
|
-
Requires-Dist: keyboard~=0.13.5
|
25
|
-
Requires-Dist: websockets~=15.0.1
|
26
|
-
Requires-Dist: openai-whisper==20240930; sys_platform == "win32"
|
27
|
-
Requires-Dist: openai-whisper; sys_platform != "win32"
|
28
|
-
Requires-Dist: stable-ts-whisperless
|
29
|
-
Requires-Dist: silero-vad~=5.1.2
|
30
|
-
Requires-Dist: ttkbootstrap~=1.10.1
|
31
|
-
Requires-Dist: dataclasses_json~=0.6.7
|
32
|
-
Requires-Dist: win10toast; sys_platform == "win32"
|
33
|
-
Requires-Dist: numpy==2.2.6
|
34
|
-
Requires-Dist: pystray
|
35
|
-
Requires-Dist: pywin32; sys_platform == "win32"
|
36
|
-
Requires-Dist: pygetwindow; sys_platform == "win32"
|
37
|
-
Requires-Dist: flask
|
38
|
-
Requires-Dist: groq
|
39
|
-
Requires-Dist: matplotlib
|
40
|
-
Requires-Dist: sounddevice
|
41
|
-
Requires-Dist: google-genai
|
42
|
-
Requires-Dist: owocr
|
43
|
-
Requires-Dist: oneocr
|
44
|
-
Requires-Dist: openai
|
45
|
-
Requires-Dist: scikit-image
|
46
|
-
Requires-Dist: opencv-python
|
47
|
-
Requires-Dist: betterproto==2.0.0b7
|
48
|
-
Requires-Dist: obsws-python~=1.7.2
|
49
|
-
Requires-Dist: numpy==2.2.6
|
50
|
-
Requires-Dist: regex
|
51
|
-
Dynamic: license-file
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|