diff --git a/LunaTranslator/LunaTranslator/ocrengines/chatgptlike.py b/LunaTranslator/LunaTranslator/ocrengines/chatgptlike.py new file mode 100644 index 00000000..47537542 --- /dev/null +++ b/LunaTranslator/LunaTranslator/ocrengines/chatgptlike.py @@ -0,0 +1,118 @@ +from ocrengines.baseocrclass import baseocr +import base64 + + +class OCR(baseocr): + + def langmap(self): + return { + "zh": "Simplified Chinese", + "ja": "Japanese", + "en": "English", + "ru": "Russian", + "es": "Spanish", + "ko": "Korean", + "fr": "French", + "cht": "Traditional Chinese", + "vi": "Vietnamese", + "tr": "Turkish", + "pl": "Polish", + "uk": "Ukrainian", + "it": "Italian", + "ar": "Arabic", + "th": "Thai", + } + + def createdata(self, message): + try: + temperature = float(self.config["Temperature"]) + except: + temperature = 0.3 + + data = dict( + model=self.config["model"], + messages=message, + # optional + max_tokens=self.config["max_tokens"], + n=1, + # stop=None, + top_p=self.config["top_p"], + temperature=temperature, + frequency_penalty=self.config["frequency_penalty"], + ) + return data + + def createparam(self): + return None + + def createheaders(self): + return {"Authorization": "Bearer " + self.config["SECRET_KEY"]} + + def checkv1(self, api_url: str): + # 傻逼豆包大模型是非要v3,不是v1 + if api_url.endswith("/v3"): + return api_url + elif api_url.endswith("/v3/"): + return api_url[:-1] + # 智谱AI + elif api_url.endswith("/v4"): + return api_url + elif api_url.endswith("/v4/"): + return api_url[:-1] + # 正常的 + elif api_url.endswith("/v1"): + return api_url + elif api_url.endswith("/v1/"): + return api_url[:-1] + elif api_url.endswith("/"): + return api_url + "v1" + else: + return api_url + "/v1" + + def ocr(self, imagebinary): + + if self.config["use_custom_prompt"]: + prompt = self.config["custom_prompt"] + else: + prompt = f"Recognize the {self.srclang} text in the picture." + + base64_image = base64.b64encode(imagebinary).decode("utf-8") + message = [ + { + "role": "user", + "content": [ + {"type": "text", "text": prompt}, + { + "type": "image_url", + "image_url": { + "url": f"data:image/jpeg;base64,{base64_image}", + "detail": "low", + }, + }, + ], + } + ] + + response = self.proxysession.post( + self.createurl(), + headers=self.createheaders(), + params=self.createparam(), + json=self.createdata(message), + ) + try: + message = ( + response.json()["choices"][0]["message"]["content"] + .replace("\n\n", "\n") + .strip() + ) + return message + except: + raise Exception(response.text) + + def createurl(self): + url = self.config["apiurl"] + if url.endswith("/chat/completions"): + pass + else: + url = self.checkv1(url) + "/chat/completions" + return url diff --git a/LunaTranslator/LunaTranslator/ocrengines/geminiocr.py b/LunaTranslator/LunaTranslator/ocrengines/geminiocr.py index 6ef74b65..028a022d 100644 --- a/LunaTranslator/LunaTranslator/ocrengines/geminiocr.py +++ b/LunaTranslator/LunaTranslator/ocrengines/geminiocr.py @@ -4,6 +4,25 @@ from ocrengines.baseocrclass import baseocr class OCR(baseocr): + def langmap(self): + return { + "zh": "Simplified Chinese", + "ja": "Japanese", + "en": "English", + "ru": "Russian", + "es": "Spanish", + "ko": "Korean", + "fr": "French", + "cht": "Traditional Chinese", + "vi": "Vietnamese", + "tr": "Turkish", + "pl": "Polish", + "uk": "Ukrainian", + "it": "Italian", + "ar": "Arabic", + "th": "Thai", + } + def ocr(self, imagebinary): self.checkempty(["key"]) self.checkempty(["url"]) @@ -13,12 +32,15 @@ class OCR(baseocr): model = self.config["model"] image_data = base64.b64encode(imagebinary).decode("utf-8") - # Prepare the request payload + if self.config["use_custom_prompt"]: + prompt = self.config["custom_prompt"] + else: + prompt = f"Recognize the {self.srclang} text in the picture." payload = { "contents": [ { "parts": [ - {"text": "Ocr this picture"}, + {"text": prompt}, {"inlineData": {"mimeType": "image/png", "data": image_data}}, ] } diff --git a/LunaTranslator/files/defaultconfig/config.json b/LunaTranslator/files/defaultconfig/config.json index 090c5f7e..0cf89b42 100644 --- a/LunaTranslator/files/defaultconfig/config.json +++ b/LunaTranslator/files/defaultconfig/config.json @@ -1471,6 +1471,10 @@ "geminiocr": { "use": false, "name": "GeminiOCR" + }, + "chatgptlike": { + "use": false, + "name": "ChatGPT_兼容接口_OCR" } }, "fanyi": { diff --git a/LunaTranslator/files/defaultconfig/ocrsetting.json b/LunaTranslator/files/defaultconfig/ocrsetting.json index 2396c16d..0663a136 100644 --- a/LunaTranslator/files/defaultconfig/ocrsetting.json +++ b/LunaTranslator/files/defaultconfig/ocrsetting.json @@ -272,7 +272,83 @@ "args": { "key": "", "url": "https://generativelanguage.googleapis.com/v1", - "model": "gemini-1.5-flash" + "model": "gemini-1.5-flash", + "use_custom_prompt": false, + "custom_prompt": "" + }, + "argstype": { + "custom_prompt": { + "name": "自定义promt", + "type": "multiline", + "refswitch": "use_custom_prompt" + }, + "use_custom_prompt": { + "type": "switch_ref", + "name": "使用自定义promt" + } + } + }, + "chatgptlike": { + "args": { + "model": "gpt-4", + "apiurl": "https://api.openai.com/v1", + "SECRET_KEY": "", + "use_custom_prompt": false, + "custom_prompt": "", + "Temperature": 0.3, + "top_p": 0.3, + "max_tokens": 128, + "frequency_penalty": 0, + "s": "" + }, + "argstype": { + "SECRET_KEY": { + "rank": 1.1 + }, + "s": { + "type": "split", + "rank": 1.5 + }, + "apiurl": { + "name": "API接口地址", + "rank": 0 + }, + "model": { + "rank": 1 + }, + "top_p": { + "type": "spin", + "min": 0, + "max": 1, + "step": 0.01 + }, + "frequency_penalty": { + "type": "spin", + "min": 0, + "max": 2, + "step": 0.05 + }, + "max_tokens": { + "type": "intspin", + "min": 1, + "max": 4096, + "step": 1 + }, + "custom_prompt": { + "name": "自定义promt", + "type": "multiline", + "refswitch": "use_custom_prompt" + }, + "use_custom_prompt": { + "type": "switch_ref", + "name": "使用自定义promt" + }, + "Temperature": { + "type": "spin", + "min": 0, + "max": 1, + "step": 0.1 + } } }, "xunfei": { @@ -319,4 +395,4 @@ } } } -} +} \ No newline at end of file diff --git a/LunaTranslator/files/defaultconfig/translatorsetting.json b/LunaTranslator/files/defaultconfig/translatorsetting.json index a98f67b7..6dcd2402 100644 --- a/LunaTranslator/files/defaultconfig/translatorsetting.json +++ b/LunaTranslator/files/defaultconfig/translatorsetting.json @@ -363,7 +363,7 @@ "rank": 1 }, "API_KEY": { - "rank": 2 + "rank": 0.5 }, "流式输出": { "type": "switch", diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt index 88b7aa58..b6f7bd33 100644 --- a/plugins/CMakeLists.txt +++ b/plugins/CMakeLists.txt @@ -29,7 +29,7 @@ include(generate_product_version) set(VERSION_MAJOR 5) set(VERSION_MINOR 15) -set(VERSION_PATCH 10) +set(VERSION_PATCH 11) add_library(pch pch.cpp) target_precompile_headers(pch PUBLIC pch.h)