From b493f7d4ae6c63165ab3d5eeebfc49a7e7ce3ce3 Mon Sep 17 00:00:00 2001 From: xunbu Date: Sun, 7 Sep 2025 14:39:52 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=B5=9E=E8=B5=8F=E6=B8=A0?= =?UTF-8?q?=E9=81=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 151 ++++++++++++++++++++++++++++++---------------- README_JP.md | 135 ++++++++++++++++++++++++----------------- README_ZH.md | 10 ++- images/赞赏码.jpg | Bin 0 -> 72727 bytes 4 files changed, 185 insertions(+), 111 deletions(-) create mode 100644 images/赞赏码.jpg diff --git a/README.md b/README.md index 1ded233..70af965 100644 --- a/README.md +++ b/README.md @@ -20,18 +20,26 @@ A lightweight local file translation tool based on a large language model.

-- ✅ **Supports Multiple Formats**: Can translate various files such as `pdf`, `docx`, `xlsx`, `md`, `txt`, `json`, `epub`, `srt`, and more. +- ✅ **Supports Multiple Formats**: Can translate various files such as `pdf`, `docx`, `xlsx`, `md`, `txt`, `json`, + `epub`, `srt`, and more. - ✅ **Automatic Glossary Generation**: Supports automatic generation of glossaries to ensure term alignment. -- ✅ **PDF Table, Formula, and Code Recognition**: With the `docling` and `mineru` PDF parsing engines, it can recognize and translate tables, formulas, and code frequently found in academic papers. -- ✅ **JSON Translation**: Supports specifying the values to be translated in JSON via JSON paths (using `jsonpath-ng` syntax). -- ✅ **Word/Excel Format-Preserving Translation**: Supports translating `docx` and `xlsx` files (currently not `doc` or `xls` files) while preserving the original formatting. -- ✅ **Multi-AI Platform Support**: Supports most AI platforms, enabling high-performance, concurrent AI translation with custom prompts. -- ✅ **Asynchronous Support**: Designed for high-performance scenarios, it offers complete asynchronous support, providing service interfaces for parallel multitasking. +- ✅ **PDF Table, Formula, and Code Recognition**: With the `docling` and `mineru` PDF parsing engines, it can recognize + and translate tables, formulas, and code frequently found in academic papers. +- ✅ **JSON Translation**: Supports specifying the values to be translated in JSON via JSON paths (using `jsonpath-ng` + syntax). +- ✅ **Word/Excel Format-Preserving Translation**: Supports translating `docx` and `xlsx` files (currently not `doc` or + `xls` files) while preserving the original formatting. +- ✅ **Multi-AI Platform Support**: Supports most AI platforms, enabling high-performance, concurrent AI translation with + custom prompts. +- ✅ **Asynchronous Support**: Designed for high-performance scenarios, it offers complete asynchronous support, + providing service interfaces for parallel multitasking. - ✅ **LAN and Multi-user Support**: Supports simultaneous use by multiple users on a local area network. - ✅ **Interactive Web Interface**: Provides an out-of-the-box Web UI and RESTful API for easy integration and use. -- ✅ **Small-Footprint, Multi-Platform "Lazy" Packages**: Windows and Mac "lazy" packages under 40MB (for versions not using `docling` for local PDF parsing). +- ✅ **Small-Footprint, Multi-Platform "Lazy" Packages**: Windows and Mac "lazy" packages under 40MB (for versions not + using `docling` for local PDF parsing). -> When translating `pdf` files, they are first converted to Markdown, which will **lose** the original layout. Users with layout requirements should take note. +> When translating `pdf` files, they are first converted to Markdown, which will **lose** the original layout. Users +> with layout requirements should take note. > QQ Discussion Group: 1047781902 @@ -45,10 +53,14 @@ ## All-in-One Packages -For users who want to get started quickly, we provide all-in-one packages on [GitHub Releases](https://github.com/xunbu/docutranslate/releases). Simply download, unzip, and enter your AI platform API-Key to start using. +For users who want to get started quickly, we provide all-in-one packages +on [GitHub Releases](https://github.com/xunbu/docutranslate/releases). Simply download, unzip, and enter your AI +platform API-Key to start using. -- **DocuTranslate**: Standard version, uses the online `minerU` engine to parse PDF documents. Choose this version if you don't need local PDF parsing (recommended). -- **DocuTranslate_full**: Full version, includes the built-in `docling` local PDF parsing engine. Choose this version if you need local PDF parsing. +- **DocuTranslate**: Standard version, uses the online `minerU` engine to parse PDF documents. Choose this version if + you don't need local PDF parsing (recommended). +- **DocuTranslate_full**: Full version, includes the built-in `docling` local PDF parsing engine. Choose this version if + you need local PDF parsing. ## Installation @@ -88,31 +100,36 @@ uv sync ## Core Concept: Workflow -The core of the new DocuTranslate is the **Workflow**. Each workflow is a complete, end-to-end translation pipeline designed specifically for a particular file type. You no longer interact with a monolithic class; instead, you select and configure a suitable workflow based on your file type. +The core of the new DocuTranslate is the **Workflow**. Each workflow is a complete, end-to-end translation pipeline +designed specifically for a particular file type. You no longer interact with a monolithic class; instead, you select +and configure a suitable workflow based on your file type. **The basic usage process is as follows:** -1. **Select a Workflow**: Choose a workflow based on your input file type (e.g., PDF/Word or TXT), such as `MarkdownBasedWorkflow` or `TXTWorkflow`. -2. **Build the Configuration**: Create the corresponding configuration object for the selected workflow (e.g., `MarkdownBasedWorkflowConfig`). This configuration object contains all the necessary sub-configurations, such as: +1. **Select a Workflow**: Choose a workflow based on your input file type (e.g., PDF/Word or TXT), such as + `MarkdownBasedWorkflow` or `TXTWorkflow`. +2. **Build the Configuration**: Create the corresponding configuration object for the selected workflow (e.g., + `MarkdownBasedWorkflowConfig`). This configuration object contains all the necessary sub-configurations, such as: * **Converter Config**: Defines how to convert the original file (e.g., PDF) to Markdown. * **Translator Config**: Defines which LLM, API-Key, target language, etc., to use. * **Exporter Config**: Defines specific options for the output format (e.g., HTML). 3. **Instantiate the Workflow**: Create a workflow instance using the configuration object. 4. **Execute the Translation**: Call the workflow's `.read_*()` and `.translate()` / `.translate_async()` methods. -5. **Export/Save the Result**: Call the `.export_to_*()` or `.save_as_*()` methods to get or save the translation result. +5. **Export/Save the Result**: Call the `.export_to_*()` or `.save_as_*()` methods to get or save the translation + result. ## Available Workflows -| Workflow | Use Case | Input Formats | Output Formats | Core Config Class | -|:---|:---|:---|:---|:---| +| Workflow | Use Case | Input Formats | Output Formats | Core Config Class | +|:----------------------------|:----------------------------------------------------------------------------------------------------------------------|:---------------------------------------------|:-----------------------|:------------------------------| | **`MarkdownBasedWorkflow`** | Processes rich text documents like PDF, Word, images, etc. The process is: `File -> Markdown -> Translate -> Export`. | `.pdf`, `.docx`, `.md`, `.png`, `.jpg`, etc. | `.md`, `.zip`, `.html` | `MarkdownBasedWorkflowConfig` | -| **`TXTWorkflow`** | Processes plain text documents. The process is: `txt -> Translate -> Export`. | `.txt` and other plain text formats | `.txt`, `.html` | `TXTWorkflowConfig` | -| **`JsonWorkflow`** | Processes JSON files. The process is: `json -> Translate -> Export`. | `.json` | `.json`, `.html` | `JsonWorkflowConfig` | -| **`DocxWorkflow`** | Processes docx files. The process is: `docx -> Translate -> Export`. | `.docx` | `.docx`, `.html` | `docxWorkflowConfig` | -| **`XlsxWorkflow`** | Processes xlsx files. The process is: `xlsx -> Translate -> Export`. | `.xlsx`, `.csv` | `.xlsx`, `.html` | `XlsxWorkflowConfig` | -| **`SrtWorkflow`** | Processes srt files. The process is: `srt -> Translate -> Export`. | `.srt` | `.srt`, `.html` | `SrtWorkflowConfig` | -| **`EpubWorkflow`** | Processes epub files. The process is: `epub -> Translate -> Export`. | `.epub` | `.epub`, `.html` | `EpubWorkflowConfig` | -| **`HtmlWorkflow`** | Processes html files. The process is: `html -> Translate -> Export`. | `.html`, `.htm` | `.html` | `HtmlWorkflowConfig` | +| **`TXTWorkflow`** | Processes plain text documents. The process is: `txt -> Translate -> Export`. | `.txt` and other plain text formats | `.txt`, `.html` | `TXTWorkflowConfig` | +| **`JsonWorkflow`** | Processes JSON files. The process is: `json -> Translate -> Export`. | `.json` | `.json`, `.html` | `JsonWorkflowConfig` | +| **`DocxWorkflow`** | Processes docx files. The process is: `docx -> Translate -> Export`. | `.docx` | `.docx`, `.html` | `docxWorkflowConfig` | +| **`XlsxWorkflow`** | Processes xlsx files. The process is: `xlsx -> Translate -> Export`. | `.xlsx`, `.csv` | `.xlsx`, `.html` | `XlsxWorkflowConfig` | +| **`SrtWorkflow`** | Processes srt files. The process is: `srt -> Translate -> Export`. | `.srt` | `.srt`, `.html` | `SrtWorkflowConfig` | +| **`EpubWorkflow`** | Processes epub files. The process is: `epub -> Translate -> Export`. | `.epub` | `.epub`, `.html` | `EpubWorkflowConfig` | +| **`HtmlWorkflow`** | Processes html files. The process is: `html -> Translate -> Export`. | `.html`, `.htm` | `.html` | `HtmlWorkflowConfig` | > In the interactive interface, you can export to PDF format. @@ -134,14 +151,16 @@ export DOCUTRANSLATE_PORT=8011 docutranslate -i ``` -- **Interactive Interface**: After starting the service, please visit `http://127.0.0.1:8010` (or your specified port) in your browser. +- **Interactive Interface**: After starting the service, please visit `http://127.0.0.1:8010` (or your specified port) + in your browser. - **API Documentation**: The complete API documentation (Swagger UI) is available at `http://127.0.0.1:8010/docs`. ## Usage ### Example 1: Translating a PDF File (using `MarkdownBasedWorkflow`) -This is the most common use case. We will use the `minerU` engine to convert the PDF to Markdown, and then use an LLM for translation. Here is an example using the asynchronous approach. +This is the most common use case. We will use the `minerU` engine to convert the PDF to Markdown, and then use an LLM +for translation. Here is an example using the asynchronous approach. ```python import asyncio @@ -207,7 +226,8 @@ if __name__ == "__main__": ### Example 2: Translating a TXT File (using `TXTWorkflow`) -For plain text files, the process is simpler as it doesn't require a document parsing (conversion) step. Here is an example using the asynchronous approach. +For plain text files, the process is simpler as it doesn't require a document parsing (conversion) step. Here is an +example using the asynchronous approach. ```python import asyncio @@ -254,7 +274,9 @@ if __name__ == "__main__": ### Example 3: Translating a JSON File (using `JsonWorkflow`) -Here is an example using the asynchronous approach. The `json_paths` item in `JsonTranslatorConfig` needs to specify the JSON paths to be translated (satisfying the `jsonpath-ng` syntax). Only values matching the JSON paths will be translated. +Here is an example using the asynchronous approach. The `json_paths` item in `JsonTranslatorConfig` needs to specify the +JSON paths to be translated (satisfying the `jsonpath-ng` syntax). Only values matching the JSON paths will be +translated. ```python import asyncio @@ -405,24 +427,26 @@ if __name__ == "__main__": ### 1. Get a Large Language Model API Key -The translation functionality relies on large language models. You need to obtain a `base_url`, `api_key`, and `model_id` from the respective AI platform. +The translation functionality relies on large language models. You need to obtain a `base_url`, `api_key`, and +`model_id` from the respective AI platform. -> Recommended models: Volcengine's `doubao-seed-1-6-250615`, `doubao-seed-1-6-flash-250715`, Zhipu's `glm-4-flash`, Alibaba Cloud's `qwen-plus`, `qwen-turbo`, Deepseek's `deepseek-chat`, etc. +> Recommended models: Volcengine's `doubao-seed-1-6-250615`, `doubao-seed-1-6-flash-250715`, Zhipu's `glm-4-flash`, +> Alibaba Cloud's `qwen-plus`, `qwen-turbo`, Deepseek's `deepseek-chat`, etc. -| Platform Name | Get API Key | baseurl | -|---|---|---| -| ollama | | http://127.0.0.1:11434/v1 | -| lm studio | | http://127.0.0.1:1234/v1 | -| openrouter | [Click to get](https://openrouter.ai/settings/keys) | https://openrouter.ai/api/v1 | -| openai | [Click to get](https://platform.openai.com/api-keys) | https://api.openai.com/v1/ | -| gemini | [Click to get](https://aistudio.google.com/u/0/apikey) | https://generativelanguage.googleapis.com/v1beta/openai/ | -| deepseek | [Click to get](https://platform.deepseek.com/api_keys) | https://api.deepseek.com/v1 | -| Zhipu AI | [Click to get](https://open.bigmodel.cn/usercenter/apikeys) | https://open.bigmodel.cn/api/paas/v4 | -| Tencent Hunyuan | [Click to get](https://console.cloud.tencent.com/hunyuan/api-key) | https://api.hunyuan.cloud.tencent.com/v1 | -| Alibaba Cloud Bailian | [Click to get](https://bailian.console.aliyun.com/?tab=model#/api-key) | https://dashscope.aliyuncs.com/compatible-mode/v1 | -| Volcengine | [Click to get](https://console.volcengine.com/ark/region:ark+cn-beijing/apiKey?apikey=%7B%7D) | https://ark.cn-beijing.volces.com/api/v3 | -| SiliconFlow | [Click to get](https://cloud.siliconflow.cn/account/ak) | https://api.siliconflow.cn/v1 | -| DMXAPI | [Click to get](https://www.dmxapi.cn/token) | https://www.dmxapi.cn/v1 | +| Platform Name | Get API Key | baseurl | +|-----------------------|-----------------------------------------------------------------------------------------------|----------------------------------------------------------| +| ollama | | http://127.0.0.1:11434/v1 | +| lm studio | | http://127.0.0.1:1234/v1 | +| openrouter | [Click to get](https://openrouter.ai/settings/keys) | https://openrouter.ai/api/v1 | +| openai | [Click to get](https://platform.openai.com/api-keys) | https://api.openai.com/v1/ | +| gemini | [Click to get](https://aistudio.google.com/u/0/apikey) | https://generativelanguage.googleapis.com/v1beta/openai/ | +| deepseek | [Click to get](https://platform.deepseek.com/api_keys) | https://api.deepseek.com/v1 | +| Zhipu AI | [Click to get](https://open.bigmodel.cn/usercenter/apikeys) | https://open.bigmodel.cn/api/paas/v4 | +| Tencent Hunyuan | [Click to get](https://console.cloud.tencent.com/hunyuan/api-key) | https://api.hunyuan.cloud.tencent.com/v1 | +| Alibaba Cloud Bailian | [Click to get](https://bailian.console.aliyun.com/?tab=model#/api-key) | https://dashscope.aliyuncs.com/compatible-mode/v1 | +| Volcengine | [Click to get](https://console.volcengine.com/ark/region:ark+cn-beijing/apiKey?apikey=%7B%7D) | https://ark.cn-beijing.volces.com/api/v3 | +| SiliconFlow | [Click to get](https://cloud.siliconflow.cn/account/ak) | https://api.siliconflow.cn/v1 | +| DMXAPI | [Click to get](https://www.dmxapi.cn/token) | https://www.dmxapi.cn/v1 | ### 2. PDF Parsing Engine (ignore if not translating PDFs) @@ -437,18 +461,23 @@ If you choose `mineru` as the document parsing engine (`convert_engine="mineru"` ### 2.2. docling Engine Configuration (local PDF parsing) -If you choose `docling` as the document parsing engine (`convert_engine="docling"`), it will download the required models from Hugging Face on first use. +If you choose `docling` as the document parsing engine (`convert_engine="docling"`), it will download the required +models from Hugging Face on first use. -> A better option is to download `docling_artifact.zip` from [GitHub releases](https://github.com/xunbu/docutranslate/releases) and unzip it to your working directory. +> A better option is to download `docling_artifact.zip` +> from [GitHub releases](https://github.com/xunbu/docutranslate/releases) and unzip it to your working directory. **Solution for network issues when downloading `docling` models:** 1. **Set a Hugging Face mirror (recommended)**: -* **Method A (environment variable)**: Set the system environment variable `HF_ENDPOINT` and restart your IDE or terminal. + +* **Method A (environment variable)**: Set the system environment variable `HF_ENDPOINT` and restart your IDE or + terminal. ``` HF_ENDPOINT=https://hf-mirror.com ``` * **Method B (set in code)**: Add the following code at the beginning of your Python script. + ```python import os @@ -456,9 +485,11 @@ os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com' ``` 2. **Offline use (download the model package in advance)**: + * Download `docling_artifact.zip` from [GitHub Releases](https://github.com/xunbu/docutranslate/releases). * Unzip it to your project directory. * Specify the model path in the configuration (if the model is not in the same directory as the script): + ```python from docutranslate.converter.x2md.converter_docling import ConverterDoclingConfig @@ -478,19 +509,25 @@ A: Use the `-p` parameter to specify a new port, or set the `DOCUTRANSLATE_PORT` A: Yes. Please use the `mineru` parsing engine, which has powerful OCR capabilities. **Q: Why is the first PDF translation so slow?** -A: If you are using the `docling` engine, it needs to download models from Hugging Face on its first run. Please refer to the "Network Issues Solution" above to speed up this process. +A: If you are using the `docling` engine, it needs to download models from Hugging Face on its first run. Please refer +to the "Network Issues Solution" above to speed up this process. **Q: How to use it in an intranet (offline) environment?** A: It is entirely possible. You need to meet the following conditions: -1. **Local LLM**: Use tools like [Ollama](https://ollama.com/) or [LM Studio](https://lmstudio.ai/) to deploy a language model locally, and fill in the `base_url` of the local model in `TranslatorConfig`. -2. **Local PDF parsing engine** (only needed for parsing PDFs): Use the `docling` engine and follow the "Offline use" instructions above to download the model package in advance. +1. **Local LLM**: Use tools like [Ollama](https://ollama.com/) or [LM Studio](https://lmstudio.ai/) to deploy a language + model locally, and fill in the `base_url` of the local model in `TranslatorConfig`. +2. **Local PDF parsing engine** (only needed for parsing PDFs): Use the `docling` engine and follow the "Offline use" + instructions above to download the model package in advance. **Q: How does the PDF parsing cache mechanism work?** -A: `MarkdownBasedWorkflow` automatically caches the results of document parsing (file to Markdown conversion) to avoid repeated parsing that consumes time and resources. The cache is stored in memory by default and records the last 10 parses. You can modify the cache size using the `DOCUTRANSLATE_CACHE_NUM` environment variable. +A: `MarkdownBasedWorkflow` automatically caches the results of document parsing (file to Markdown conversion) to avoid +repeated parsing that consumes time and resources. The cache is stored in memory by default and records the last 10 +parses. You can modify the cache size using the `DOCUTRANSLATE_CACHE_NUM` environment variable. **Q: How to make the software go through a proxy?** -A: The software does not use a proxy by default. You can enable it by setting the environment variable `DOCUTRANSLATE_PROXY_ENABLED` to `true`. +A: The software does not use a proxy by default. You can enable it by setting the environment variable +`DOCUTRANSLATE_PROXY_ENABLED` to `true`. ## Star History @@ -500,4 +537,12 @@ A: The software does not use a proxy by default. You can enable it by setting th Star History Chart - \ No newline at end of file + + +## Support the Author + +Welcome to support the author. Please kindly mention the reason for your appreciation in the notes. ❤ + +

+ 赞赏码 +

\ No newline at end of file diff --git a/README_JP.md b/README_JP.md index e4d4099..a6dce40 100644 --- a/README_JP.md +++ b/README_JP.md @@ -24,12 +24,14 @@ - ✅ **用語集の自動生成**:用語集を自動生成し、専門用語の統一を実現します。 - ✅ **PDFの表、数式、コード認識**:`docling`、`mineru` PDF解析エンジンにより、学術論文によく見られる表、数式、コードを認識し、翻訳します。 - ✅ **JSON翻訳**:JSON Path (`jsonpath-ng`構文仕様) を用いて、翻訳対象の値を指定できます。 -- ✅ **Word/Excelのフォーマットを維持した翻訳**:`docx`、`xlsx`ファイルの元のフォーマットを維持したまま翻訳をサポートします(現在`doc`、`xls`ファイルは未対応)。 +- ✅ **Word/Excelのフォーマットを維持した翻訳**:`docx`、`xlsx`ファイルの元のフォーマットを維持したまま翻訳をサポートします(現在 + `doc`、`xls`ファイルは未対応)。 - ✅ **マルチAIプラットフォーム対応**:ほとんどのAIプラットフォームをサポートし、カスタムプロンプトによる並列・高性能なAI翻訳を実現します。 - ✅ **非同期サポート**:高性能なシーン向けに設計され、完全な非同期サポートを提供し、マルチタスク並列処理が可能なサービスインターフェースを実現しています。 - ✅ **LAN、複数人利用をサポート**:LAN内での複数人による同時利用をサポートします。 - ✅ **インタラクティブなWeb UI**:すぐに使えるWeb UIとRESTful APIを提供し、統合や利用が容易です。 -- ✅ **小容量・マルチプラットフォーム対応の簡単パッケージ**:40MB未満のWindows、Mac用簡単パッケージ(`docling`によるローカルPDF解析を使用しないバージョン)。 +- ✅ **小容量・マルチプラットフォーム対応の簡単パッケージ**:40MB未満のWindows、Mac用簡単パッケージ(`docling` + によるローカルPDF解析を使用しないバージョン)。 > `pdf`を翻訳する際、一度Markdownに変換されるため、元のレイアウトが**失われます**。レイアウトを重視するユーザーはご注意ください。 @@ -46,7 +48,8 @@ ## 統合パッケージ -すぐに使い始めたいユーザーのために、[GitHub Releases](https://github.com/xunbu/docutranslate/releases) で統合パッケージを提供しています。ダウンロードして解凍し、お使いのAIプラットフォームのAPIキーを入力するだけで使用を開始できます。 +すぐに使い始めたいユーザーのために、[GitHub Releases](https://github.com/xunbu/docutranslate/releases) +で統合パッケージを提供しています。ダウンロードして解凍し、お使いのAIプラットフォームのAPIキーを入力するだけで使用を開始できます。 - **DocuTranslate**: 標準版。オンラインの`minerU`エンジンを使用してPDFドキュメントを解析します。ローカルでのPDF解析が不要な場合はこちらを選択してください(推奨)。 - **DocuTranslate_full**: 完全版。`docling`ローカルPDF解析エンジンを内蔵しています。ローカルでのPDF解析が必要な場合はこちらを選択してください。 @@ -90,31 +93,34 @@ uv sync ## 中心的な概念:ワークフロー (Workflow) -新バージョンのDocuTranslateの核心は**ワークフロー (Workflow)**です。各ワークフローは、特定のファイルタイプ専用に設計された、完全なエンドツーエンドの翻訳パイプラインです。もはや巨大なクラスと対話するのではなく、ファイルタイプに応じて適切なワークフローを選択し、設定します。 +新バージョンのDocuTranslateの核心は**ワークフロー (Workflow)** +です。各ワークフローは、特定のファイルタイプ専用に設計された、完全なエンドツーエンドの翻訳パイプラインです。もはや巨大なクラスと対話するのではなく、ファイルタイプに応じて適切なワークフローを選択し、設定します。 **基本的な使用手順は以下の通りです:** -1. **ワークフローの選択**:入力ファイルの種類(例:PDF/WordまたはTXT)に応じて、`MarkdownBasedWorkflow`や`TXTWorkflow`などのワークフローを選択します。 -2. **設定の構築**:選択したワークフローに対応する設定オブジェクト(例:`MarkdownBasedWorkflowConfig`)を作成します。この設定オブジェクトには、必要なすべてのサブ設定が含まれています。 - * **コンバータ設定 (Converter Config)**: 元のファイル(例:PDF)をMarkdownに変換する方法を定義します。 - * **翻訳機設定 (Translator Config)**: 使用するLLM、APIキー、ターゲット言語などを定義します。 - * **エクスポータ設定 (Exporter Config)**: 出力フォーマット(例:HTML)の特定のオプションを定義します。 -3. **ワークフローのインスタンス化**:設定オブジェクトを使用してワークフローのインスタンスを作成します。 -4. **翻訳の実行**:ワークフローの`.read_*()`および`.translate()` / `.translate_async()`メソッドを呼び出します。 -5. **結果のエクスポート/保存**:`.export_to_*()`または`.save_as_*()`メソッドを呼び出して、翻訳結果を取得または保存します。 +1. **ワークフローの選択**:入力ファイルの種類(例:PDF/WordまたはTXT)に応じて、`MarkdownBasedWorkflow`や`TXTWorkflow` + などのワークフローを選択します。 +2. **設定の構築**:選択したワークフローに対応する設定オブジェクト(例:`MarkdownBasedWorkflowConfig` + )を作成します。この設定オブジェクトには、必要なすべてのサブ設定が含まれています。 + * **コンバータ設定 (Converter Config)**: 元のファイル(例:PDF)をMarkdownに変換する方法を定義します。 + * **翻訳機設定 (Translator Config)**: 使用するLLM、APIキー、ターゲット言語などを定義します。 + * **エクスポータ設定 (Exporter Config)**: 出力フォーマット(例:HTML)の特定のオプションを定義します。 +3. **ワークフローのインスタンス化**:設定オブジェクトを使用してワークフローのインスタンスを作成します。 +4. **翻訳の実行**:ワークフローの`.read_*()`および`.translate()` / `.translate_async()`メソッドを呼び出します。 +5. **結果のエクスポート/保存**:`.export_to_*()`または`.save_as_*()`メソッドを呼び出して、翻訳結果を取得または保存します。 ## 利用可能なワークフロー -| ワークフロー | 適用シーン | 入力フォーマット | 出力フォーマット | 主要設定クラス | -| :--- | :--- | :--- | :--- | :--- | +| ワークフロー | 適用シーン | 入力フォーマット | 出力フォーマット | 主要設定クラス | +|:----------------------------|:-----------------------------------------------------------------------|:------------------------------------------|:-----------------------|:------------------------------| | **`MarkdownBasedWorkflow`** | PDF、Word、画像などのリッチテキストドキュメントを処理。フロー:`ファイル -> Markdown -> 翻訳 -> エクスポート`。 | `.pdf`, `.docx`, `.md`, `.png`, `.jpg` など | `.md`, `.zip`, `.html` | `MarkdownBasedWorkflowConfig` | -| **`TXTWorkflow`** | プレーンテキストドキュメントを処理。フロー:`txt -> 翻訳 -> エクスポート`。 | `.txt` およびその他のプレーンテキスト形式 | `.txt`, `.html` | `TXTWorkflowConfig` | -| **`JsonWorkflow`** | JSONファイルを処理。フロー:`json -> 翻訳 -> エクスポート`。 | `.json` | `.json`, `.html` | `JsonWorkflowConfig` | -| **`DocxWorkflow`** | DOCXファイルを処理。フロー:`docx -> 翻訳 -> エクスポート`。 | `.docx` | `.docx`, `.html` | `docxWorkflowConfig` | -| **`XlsxWorkflow`** | XLSXファイルを処理。フロー:`xlsx -> 翻訳 -> エクスポート`。 | `.xlsx`、`.csv` | `.xlsx`, `.html` | `XlsxWorkflowConfig` | -| **`SrtWorkflow`** | SRTファイルを処理。フロー:`srt -> 翻訳 -> エクスポート`。 | `.srt` | `.srt`, `.html` | `SrtWorkflowConfig` | -| **`EpubWorkflow`** | EPUBファイルを処理。フロー:`epub -> 翻訳 -> エクスポート`。 | `.epub` | `.epub`, `.html` | `EpubWorkflowConfig` | -| **`HtmlWorkflow`** | HTMLファイルを処理。フロー:`html -> 翻訳 -> エクスポート`。 | `.html`, `.htm` | `.html` | `HtmlWorkflowConfig` | +| **`TXTWorkflow`** | プレーンテキストドキュメントを処理。フロー:`txt -> 翻訳 -> エクスポート`。 | `.txt` およびその他のプレーンテキスト形式 | `.txt`, `.html` | `TXTWorkflowConfig` | +| **`JsonWorkflow`** | JSONファイルを処理。フロー:`json -> 翻訳 -> エクスポート`。 | `.json` | `.json`, `.html` | `JsonWorkflowConfig` | +| **`DocxWorkflow`** | DOCXファイルを処理。フロー:`docx -> 翻訳 -> エクスポート`。 | `.docx` | `.docx`, `.html` | `docxWorkflowConfig` | +| **`XlsxWorkflow`** | XLSXファイルを処理。フロー:`xlsx -> 翻訳 -> エクスポート`。 | `.xlsx`、`.csv` | `.xlsx`, `.html` | `XlsxWorkflowConfig` | +| **`SrtWorkflow`** | SRTファイルを処理。フロー:`srt -> 翻訳 -> エクスポート`。 | `.srt` | `.srt`, `.html` | `SrtWorkflowConfig` | +| **`EpubWorkflow`** | EPUBファイルを処理。フロー:`epub -> 翻訳 -> エクスポート`。 | `.epub` | `.epub`, `.html` | `EpubWorkflowConfig` | +| **`HtmlWorkflow`** | HTMLファイルを処理。フロー:`html -> 翻訳 -> エクスポート`。 | `.html`, `.htm` | `.html` | `HtmlWorkflowConfig` | > インタラクティブUIではPDF形式でのエクスポートが可能です @@ -136,8 +142,8 @@ export DOCUTRANSLATE_PORT=8011 docutranslate -i ``` -- **インタラクティブUI**: サービス起動後、ブラウザで `http://127.0.0.1:8010` (または指定したポート) にアクセスしてください。 -- **APIドキュメント**: 完全なAPIドキュメント (Swagger UI) は `http://127.0.0.1:8010/docs` にあります。 +- **インタラクティブUI**: サービス起動後、ブラウザで `http://127.0.0.1:8010` (または指定したポート) にアクセスしてください。 +- **APIドキュメント**: 完全なAPIドキュメント (Swagger UI) は `http://127.0.0.1:8010/docs` にあります。 ## 使用方法 @@ -256,7 +262,8 @@ if __name__ == "__main__": ### 例3: JSONファイルの翻訳 (`JsonWorkflow`を使用) -ここでは非同期方式を例にとります。`JsonTranslatorConfig`の`json_paths`項目で翻訳対象のJSONパスを指定する必要があります(`jsonpath-ng`構文仕様に準拠)。JSONパスにマッチした値のみが翻訳されます。 +ここでは非同期方式を例にとります。`JsonTranslatorConfig`の`json_paths`項目で翻訳対象のJSONパスを指定する必要があります( +`jsonpath-ng`構文仕様に準拠)。JSONパスにマッチした値のみが翻訳されます。 ```python import asyncio @@ -413,20 +420,20 @@ if __name__ == "__main__": `qwen-turbo`、deepseekの` > deepseek-chat`など。 -| プラットフォーム名 | APIキーの取得 | baseurl | -| :--- | :--- | :--- | -| ollama | | http://127.0.0.1:11434/v1 | -| lm studio | | http://127.0.0.1:1234/v1 | -| openrouter | [クリックして取得](https://openrouter.ai/settings/keys) | https://openrouter.ai/api/v1 | -| openai | [クリックして取得](https://platform.openai.com/api-keys) | https://api.openai.com/v1/ | -| gemini | [クリックして取得](https://aistudio.google.com/u/0/apikey) | https://generativelanguage.googleapis.com/v1beta/openai/ | -| deepseek | [クリックして取得](https://platform.deepseek.com/api_keys) | https://api.deepseek.com/v1 | -| 智谱ai | [クリックして取得](https://open.bigmodel.cn/usercenter/apikeys) | https://open.bigmodel.cn/api/paas/v4 | -| 腾讯混元 | [クリックして取得](https://console.cloud.tencent.com/hunyuan/api-key) | https://api.hunyuan.cloud.tencent.com/v1 | -| 阿里云百炼 | [クリックして取得](https://bailian.console.aliyun.com/?tab=model#/api-key) | https://dashscope.aliyuncs.com/compatible-mode/v1 | -| 火山引擎 | [クリックして取得](https://console.volcengine.com/ark/region:ark+cn-beijing/apiKey?apikey=%7B%7D) | https://ark.cn-beijing.volces.com/api/v3 | -| 硅基流动 | [クリックして取得](https://cloud.siliconflow.cn/account/ak) | https://api.siliconflow.cn/v1 | -| DMXAPI | [クリックして取得](https://www.dmxapi.cn/token) | https://www.dmxapi.cn/v1 | +| プラットフォーム名 | APIキーの取得 | baseurl | +|:-----------|:------------------------------------------------------------------------------------------|:---------------------------------------------------------| +| ollama | | http://127.0.0.1:11434/v1 | +| lm studio | | http://127.0.0.1:1234/v1 | +| openrouter | [クリックして取得](https://openrouter.ai/settings/keys) | https://openrouter.ai/api/v1 | +| openai | [クリックして取得](https://platform.openai.com/api-keys) | https://api.openai.com/v1/ | +| gemini | [クリックして取得](https://aistudio.google.com/u/0/apikey) | https://generativelanguage.googleapis.com/v1beta/openai/ | +| deepseek | [クリックして取得](https://platform.deepseek.com/api_keys) | https://api.deepseek.com/v1 | +| 智谱ai | [クリックして取得](https://open.bigmodel.cn/usercenter/apikeys) | https://open.bigmodel.cn/api/paas/v4 | +| 腾讯混元 | [クリックして取得](https://console.cloud.tencent.com/hunyuan/api-key) | https://api.hunyuan.cloud.tencent.com/v1 | +| 阿里云百炼 | [クリックして取得](https://bailian.console.aliyun.com/?tab=model#/api-key) | https://dashscope.aliyuncs.com/compatible-mode/v1 | +| 火山引擎 | [クリックして取得](https://console.volcengine.com/ark/region:ark+cn-beijing/apiKey?apikey=%7B%7D) | https://ark.cn-beijing.volces.com/api/v3 | +| 硅基流动 | [クリックして取得](https://cloud.siliconflow.cn/account/ak) | https://api.siliconflow.cn/v1 | +| DMXAPI | [クリックして取得](https://www.dmxapi.cn/token) | https://www.dmxapi.cn/v1 | ### 2. PDF解析エンジン(PDF翻訳が不要な場合は気にする必要はありません) @@ -434,26 +441,28 @@ if __name__ == "__main__": ドキュメント解析エンジンとして`mineru`を選択した場合(`convert_engine="mineru"`)、無料のトークンを申請する必要があります。 -1. [minerU公式サイト](https://mineru.net/apiManage/docs) にアクセスして登録し、APIを申請します。 -2. [APIトークン管理画面](https://mineru.net/apiManage/token) で新しいAPIトークンを作成します。 +1. [minerU公式サイト](https://mineru.net/apiManage/docs) にアクセスして登録し、APIを申請します。 +2. [APIトークン管理画面](https://mineru.net/apiManage/token) で新しいAPIトークンを作成します。 > **注意**: minerUトークンには14日間の有効期限があります。期限が切れた場合は再作成してください。 ### 2.2. doclingエンジンの設定 (ローカルPDF解析) -ドキュメント解析エンジンとして`docling`を選択した場合(`convert_engine="docling"`)、初回使用時にHugging Faceから必要なモデルがダウンロードされます。 +ドキュメント解析エンジンとして`docling`を選択した場合(`convert_engine="docling"`)、初回使用時にHugging +Faceから必要なモデルがダウンロードされます。 -> より良い選択肢は、[github releases](https://github.com/xunbu/docutranslate/releases)から`docling_artifact.zip`をダウンロードし、作業ディレクトリに展開することです。 +> より良い選択肢は、[github releases](https://github.com/xunbu/docutranslate/releases)から`docling_artifact.zip` +> をダウンロードし、作業ディレクトリに展開することです。 **`docling`モデルのダウンロードに関するネットワーク問題の解決策:** -1. **Hugging Faceミラーの設定 (推奨)**: +1. **Hugging Faceミラーの設定 (推奨)**: -* **方法 A (環境変数)**: システム環境変数 `HF_ENDPOINT` を設定し、IDEまたはターミナルを再起動します。 - ``` - HF_ENDPOINT=https://hf-mirror.com - ``` -* **方法 B (コード内での設定)**: Pythonスクリプトの先頭に以下のコードを追加します。 +* **方法 A (環境変数)**: システム環境変数 `HF_ENDPOINT` を設定し、IDEまたはターミナルを再起動します。 + ``` + HF_ENDPOINT=https://hf-mirror.com + ``` +* **方法 B (コード内での設定)**: Pythonスクリプトの先頭に以下のコードを追加します。 ```python import os @@ -461,11 +470,11 @@ import os os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com' ``` -2. **オフラインでの使用 (事前にモデルパッケージをダウンロード)**: +2. **オフラインでの使用 (事前にモデルパッケージをダウンロード)**: -* [GitHub Releases](https://github.com/xunbu/docutranslate/releases) から `docling_artifact.zip` をダウンロードします。 -* プロジェクトディレクトリに展開します。 -* 設定でモデルのパスを指定します(モデルがスクリプトと同じディレクトリにない場合): +* [GitHub Releases](https://github.com/xunbu/docutranslate/releases) から `docling_artifact.zip` をダウンロードします。 +* プロジェクトディレクトリに展開します。 +* 設定でモデルのパスを指定します(モデルがスクリプトと同じディレクトリにない場合): ```python from docutranslate.converter.x2md.converter_docling import ConverterDoclingConfig @@ -486,16 +495,20 @@ A: `-p` パラメータを使用して新しいポートを指定するか、`DO A: はい、サポートしています。強力なOCR機能を持つ`mineru`解析エンジンを使用してください。 **Q: 初回のPDF翻訳が非常に遅いのはなぜですか?** -A: `docling`エンジンを使用している場合、初回実行時にHugging Faceからモデルをダウンロードする必要があります。このプロセスを高速化するには、上記の「ネットワーク問題の解決策」を参照してください。 +A: `docling`エンジンを使用している場合、初回実行時にHugging +Faceからモデルをダウンロードする必要があります。このプロセスを高速化するには、上記の「ネットワーク問題の解決策」を参照してください。 **Q: LAN(オフライン)環境で使用するにはどうすればよいですか?** A: 完全に可能です。以下の条件を満たす必要があります: -1. **ローカルLLM**: [Ollama](https://ollama.com/) や [LM Studio](https://lmstudio.ai/) などのツールを使用して言語モデルをローカルにデプロイし、`TranslatorConfig`にローカルモデルの`base_url`を記入します。 -2. **ローカルPDF解析エンジン**(PDF解析が必要な場合のみ): `docling`エンジンを使用し、上記の「オフラインでの使用」の指示に従って事前にモデルパッケージをダウンロードします。 +1. **ローカルLLM**: [Ollama](https://ollama.com/) や [LM Studio](https://lmstudio.ai/) などのツールを使用して言語モデルをローカルにデプロイし、 + `TranslatorConfig`にローカルモデルの`base_url`を記入します。 +2. **ローカルPDF解析エンジン**(PDF解析が必要な場合のみ): `docling`エンジンを使用し、上記の「オフラインでの使用」の指示に従って事前にモデルパッケージをダウンロードします。 **Q: PDF解析のキャッシュメカニズムはどのように機能しますか?** -A: `MarkdownBasedWorkflow`は、ドキュメント解析(ファイルからMarkdownへの変換)の結果を自動的にキャッシュし、時間とリソースの重複消費を防ぎます。キャッシュはデフォルトでメモリに保存され、直近10回の解析結果が記録されます。キャッシュ数は`DOCUTRANSLATE_CACHE_NUM`環境変数で変更できます。 +A: `MarkdownBasedWorkflow` +は、ドキュメント解析(ファイルからMarkdownへの変換)の結果を自動的にキャッシュし、時間とリソースの重複消費を防ぎます。キャッシュはデフォルトでメモリに保存され、直近10回の解析結果が記録されます。キャッシュ数は +`DOCUTRANSLATE_CACHE_NUM`環境変数で変更できます。 **Q: ソフトウェアがプロキシ経由で通信するようにするにはどうすればよいですか?** A: デフォルトではプロキシを使用しません。環境変数`DOCUTRANSLATE_PROXY_ENABLED`を`true`に設定することで、プロキシ経由での通信が可能になります。 @@ -508,4 +521,12 @@ A: デフォルトではプロキシを使用しません。環境変数`DOCUTRA Star History Chart - \ No newline at end of file + + +## 応援サポート + +作者へのサポートを歓迎します。備考欄に応援の理由を記載していただけると幸いです。 + +

+ 赞赏码 +

\ No newline at end of file diff --git a/README_ZH.md b/README_ZH.md index 73407d2..3f3b617 100644 --- a/README_ZH.md +++ b/README_ZH.md @@ -512,4 +512,12 @@ A: 软件默认不使用代理,可以通过设置环境变量`DOCUTRANSLATE_PR Star History Chart - \ No newline at end of file + + +## 赞赏支持 + +欢迎支持作者,烦请在备注中说明一下赞赏原因哟 + +

+ 赞赏码 +

\ No newline at end of file diff --git a/images/赞赏码.jpg b/images/赞赏码.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1c67697931871d7f00c720d3b2f9dd8105b51206 GIT binary patch literal 72727 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 z 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