Browse Source

Merge pull request #203 from yidasanqian/main

Byaidu 1 year ago
parent
commit
b24b55ade1
5 changed files with 33 additions and 1 deletions
  1. 1 0
      README.md
  2. 1 0
      README_zh-CN.md
  3. 3 1
      pdf2zh/converter.py
  4. 2 0
      pdf2zh/gui.py
  5. 26 0
      pdf2zh/translator.py

+ 1 - 0
README.md

@@ -197,6 +197,7 @@ The table below outlines the required [environment variables](https://chatgpt.co
 |**DeepLX**|`deeplx`|`DEEPLX_ENDPOINT`|`https://api.deepl.com/translate`|See [DeepLX](https://github.com/OwO-Network/DeepLX)|
 |**Ollama**|`ollama`|`OLLAMA_HOST`, `OLLAMA_MODEL`|`http://127.0.0.1:11434`, `gemma2`|See [Ollama](https://github.com/ollama/ollama)|
 |**OpenAI**|`openai`|`OPENAI_BASE_URL`, `OPENAI_API_KEY`, `OPENAI_MODEL`|`https://api.openai.com/v1`, `[Your Key]`, `gpt-4o-mini`|See [OpenAI](https://platform.openai.com/docs/overview)|
+|**AzureOpenAI**|`azure-openai`|`AZURE_OPENAI_BASE_URL`, `AZURE_OPENAI_API_KEY`, `AZURE_OPENAI_MODEL`,`AZURE_OPENAI_API_VERSION`|`[Your Endpoint]`, `[Your Key]`, `gpt-4o-mini`,`2024-06-01`|See [Azure OpenAI](https://learn.microsoft.com/zh-cn/azure/ai-services/openai/chatgpt-quickstart?tabs=command-line%2Cjavascript-keyless%2Ctypescript-keyless%2Cpython&pivots=programming-language-python)|
 |**Zhipu**|`zhipu`|`ZHIPU_API_KEY`, `ZHIPU_MODEL`|`[Your Key]`, `glm-4-flash`|See [Zhipu](https://open.bigmodel.cn/dev/api/thirdparty-frame/openai-sdk)|
 |**Silicon**|`silicon`|`SILICON_API_KEY`, `SILICON_MODEL`|`[Your Key]`, `Qwen/Qwen2.5-7B-Instruct`|See [SiliconCloud](https://docs.siliconflow.cn/quickstart)|
 |**Azure**|`azure`|`AZURE_ENDPOINT`, `AZURE_API_KEY`|`https://api.translator.azure.cn`, `[Your Key]`|See [Azure](https://docs.azure.cn/en-us/ai-services/translator/text-translation-overview)|

+ 1 - 0
README_zh-CN.md

@@ -197,6 +197,7 @@ pdf2zh example.pdf -li en -lo ja
 |**DeepLX**|`deeplx`|`DEEPLX_ENDPOINT`|`https://api.deepl.com/translate`|See [DeepLX](https://github.com/OwO-Network/DeepLX)|
 |**Ollama**|`ollama`|`OLLAMA_HOST`, `OLLAMA_MODEL`|`http://127.0.0.1:11434`, `gemma2`|See [Ollama](https://github.com/ollama/ollama)|
 |**OpenAI**|`openai`|`OPENAI_BASE_URL`, `OPENAI_API_KEY`, `OPENAI_MODEL`|`https://api.openai.com/v1`, `[Your Key]`, `gpt-4o-mini`|See [OpenAI](https://platform.openai.com/docs/overview)|
+|**AzureOpenAI**|`azure-openai`|`AZURE_OPENAI_BASE_URL`, `AZURE_OPENAI_API_KEY`, `AZURE_OPENAI_MODEL`,`AZURE_OPENAI_API_VERSION`|`[Your Endpoint]`, `[Your Key]`, `gpt-4o-mini`,`2024-06-01`|See [Azure OpenAI](https://learn.microsoft.com/zh-cn/azure/ai-services/openai/chatgpt-quickstart?tabs=command-line%2Cjavascript-keyless%2Ctypescript-keyless%2Cpython&pivots=programming-language-python)|
 |**Zhipu**|`zhipu`|`ZHIPU_API_KEY`, `ZHIPU_MODEL`|`[Your Key]`, `glm-4-flash`|See [Zhipu](https://open.bigmodel.cn/dev/api/thirdparty-frame/openai-sdk)|
 |**Silicon**|`silicon`|`SILICON_API_KEY`, `SILICON_MODEL`|`[Your Key]`, `Qwen/Qwen2.5-7B-Instruct`|See [SiliconCloud](https://docs.siliconflow.cn/quickstart)|
 |**Azure**|`azure`|`AZURE_ENDPOINT`, `AZURE_API_KEY`|`https://api.translator.azure.cn`, `[Your Key]`|See [Azure](https://docs.azure.cn/en-us/ai-services/translator/text-translation-overview)|

+ 3 - 1
pdf2zh/converter.py

@@ -17,6 +17,7 @@ import unicodedata
 from tenacity import retry, wait_fixed
 from pdf2zh import cache
 from pdf2zh.translator import (
+    AzureOpenAITranslator,
     BaseTranslator,
     GoogleTranslator,
     BingTranslator,
@@ -140,7 +141,8 @@ class TranslateConverter(PDFConverterEx):
         param = service.split(":", 1)
         service_name = param[0]
         service_model = param[1] if len(param) > 1 else None
-        for translator in [GoogleTranslator, BingTranslator, DeepLTranslator, DeepLXTranslator, OllamaTranslator, OpenAITranslator, ZhipuTranslator, SiliconTranslator, AzureTranslator, TencentTranslator]:
+        for translator in [GoogleTranslator, BingTranslator, DeepLTranslator, DeepLXTranslator, OllamaTranslator, AzureOpenAITranslator,
+                           OpenAITranslator, ZhipuTranslator, SiliconTranslator, AzureTranslator, TencentTranslator]:
             if service_name == translator.name:
                 self.translator = translator(service, lang_out, lang_in, service_model)
         if not self.translator:

+ 2 - 0
pdf2zh/gui.py

@@ -10,6 +10,7 @@ from pdf2zh.translator import (
     DeepLTranslator,
     DeepLXTranslator,
     OllamaTranslator,
+    AzureOpenAITranslator,
     OpenAITranslator,
     ZhipuTranslator,
     SiliconTranslator,
@@ -30,6 +31,7 @@ service_map: dict[str, BaseTranslator] = {
     "DeepL": DeepLTranslator,
     "DeepLX": DeepLXTranslator,
     "Ollama": OllamaTranslator,
+    "AzureOpenAI": AzureOpenAITranslator,
     "OpenAI": OpenAITranslator,
     "Zhipu": ZhipuTranslator,
     "Silicon": SiliconTranslator,

+ 26 - 0
pdf2zh/translator.py

@@ -216,6 +216,32 @@ class OpenAITranslator(BaseTranslator):
             messages=self.prompt(text),
         )
         return response.choices[0].message.content.strip()
+    
+
+class AzureOpenAITranslator(BaseTranslator):
+    name = "azure-openai"
+    envs = {
+        "AZURE_OPENAI_BASE_URL": None, # e.g. "https://xxx.openai.azure.com"
+        "AZURE_OPENAI_API_KEY": None,
+        "AZURE_OPENAI_MODEL": "gpt-4o-mini"
+    }
+
+    def __init__(self, service, lang_out, lang_in, model, base_url=None, api_key=None):
+        base_url = os.getenv("AZURE_OPENAI_BASE_URL", self.envs["AZURE_OPENAI_BASE_URL"])
+        api_version = os.getenv("AZURE_OPENAI_API_VERSION", "2024-06-01")
+        if not model:
+            model = os.getenv("AZURE_OPENAI_MODEL", self.envs["AZURE_OPENAI_MODEL"])
+        super().__init__(service, lang_out, lang_in, model)
+        self.options = {"temperature": 0}  
+        self.client = openai.AzureOpenAI(azure_endpoint=base_url, azure_deployment=model, api_version=api_version, api_key=api_key)
+
+    def translate(self, text) -> str:
+        response = self.client.chat.completions.create(
+            model=self.model,
+            **self.options,
+            messages=self.prompt(text),
+        )
+        return response.choices[0].message.content.strip()    
 
 
 class ZhipuTranslator(OpenAITranslator):