Skip to content

add homework for openAITranslator #71

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
92 changes: 26 additions & 66 deletions langchain/openai-translator/README-CN.md
Original file line number Diff line number Diff line change
@@ -1,93 +1,53 @@
# OpenAI-Translator

<p align="center">
<br> <a href="README.md"> English </a> | 中文
</p>
<p align="center">
<em>所有的代码和文档完全由 OpenAI 的 GPT-4 模型生成</em>
</p>
## 简介

## 介绍
OpenAI Translator 是一个基于人工智能的翻译工具,旨在将英文PDF书籍翻译成中文。该工具利用了大型语言模型(LLMs)如ChatGLM以及OpenAI的GPT-3和GPT-3.5 Turbo进行翻译。它是用Python构建的,具有灵活、模块化和面向对象的设计。

OpenAI 翻译器是一个使用 AI 技术将英文 PDF 书籍翻译成中文的工具。这个工具使用了大型语言模型 (LLMs),如 ChatGLM 和 OpenAI 的 GPT-3 以及 GPT-3.5 Turbo 来进行翻译。它是用 Python 构建的,并且具有灵活、模块化和面向对象的设计。
## 为什么选择这个项目
喜欢敲敲代码,顺便熟悉langchain
### 示例结果

## 为什么做这个项目
## 特点

在现今的环境中,缺乏非商业而且有效的 PDF 翻译工具。很多用户有包含敏感数据的 PDF 文件,他们更倾向于不将其上传到公共商业服务网站,以保护隐私。这个项目就是为了解决这个问题,为需要翻译他们的 PDF 文件同时又要保护数据隐私的用户提供解决方案。
- [X] 使用LLMs将PDF书籍翻译成Markdown。
- [X] 支持[OpenAI](https://platform.openai.com/docs/models)模型。
- [X] 通过YAML文件或Gradio构建界面进行灵活的配置。
- [X] 强大的超时和错误处理功能,确保翻译操作的稳健性。
- [X] 模块化和面向对象的设计,便于自定义和扩展。
- [x] 添加对翻译风格的支持。
- [X] 能够将图片插入到Markdown文件中。

## 示例结果
## 入门指南

OpenAI 翻译器目前还处于早期开发阶段,我正在积极地添加更多功能和改进其性能。我们非常欢迎任何反馈或贡献!
### 环境设置

![The_Old_Man_of_the_Sea](images/sample_image_0.png)
1. 克隆仓库 `https://github.com/ycAlex11/langchain-examples-.git`。

<p align="center">
<em>"老人与海"</em>
</p>
2. `OpenAI-Translator` 需要Python 3.10或更高版本。使用 `pip install -r requirements.txt` 安装依赖项。

## 特性
3. 设置你的OpenAI API密钥(`$OPENAI_API_KEY`)。你需要在config.yaml文件中指定它。

- [X] 使用大型语言模型 (LLMs) 将英文 PDF 书籍翻译成中文。
- [X] 支持 ChatGLM 和 OpenAI 模型。
- [X] 通过 YAML 文件或命令行参数灵活配置。
- [X] 对健壮的翻译操作进行超时和错误处理。
- [X] 模块化和面向对象的设计,易于定制和扩展。
- [x] 添加对其他语言和翻译方向的支持。
- [ ] 实现图形用户界面 (GUI) 以便更易于使用。
- [ ] 创建一个网络服务或 API,以便在网络应用中使用。
- [ ] 添加对多个 PDF 文件的批处理支持。
- [ ] 添加对保留源 PDF 的原始布局和格式的支持。
- [ ] 通过使用自定义训练的翻译模型来提高翻译质量。
### 使用方法

你可以通过指定一个配置文件来使用OpenAI-Translator。

## 开始使用
#### 使用配置文件:

### 环境准备

1.克隆仓库 `git clone [email protected]:DjangoPeng/openai-translator.git`。

2.OpenAI-翻译器 需要 Python 3.10 或更高版本。使用 `pip install -r requirements.txt` 安装依赖项。

3.设置您的 OpenAI API 密钥(`$OPENAI_API_KEY`)。您可以将其添加到环境变量中,或者在 config.yaml 文件中指定。

### 使用示例

您可以通过指定配置文件或提供命令行参数来使用 OpenAI-Translator 工具。

#### 使用配置文件

根据您的设置调整 `config.yaml` 文件:
根据你的设置修改`config.yaml`文件:

```yaml
model_name: "gpt-3.5-turbo"
input_file: "tests/test.pdf"
output_file_format: "markdown"
source_language: "English"
target_language: "Chinese"
api_key: "你的OpenAI API密钥"
style:""
```

然后命令行直接运行
然后运行工具

```bash
python ai_translator/main.py
```

![sample_out](images/sample_image_1.png)

#### 使用命令行参数

您也可以直接在命令行上指定设置。这是使用 OpenAI 模型的例子:

```bash
# 将您的 api_key 设置为环境变量
export OPENAI_API_KEY="sk-xxx"
python ai_translator/main.py --model_name "gpt-3.5-turbo" --input_file "your_input.pdf" --output_file_format "markdown" --source_language "English" --target_language "Chinese"
```

## 许可证

该项目采用 GPL-3.0 许可证。有关详细信息,请查看 [LICENSE](LICENSE) 文件。




```
59 changes: 12 additions & 47 deletions langchain/openai-translator/README.md
Original file line number Diff line number Diff line change
@@ -1,59 +1,38 @@
# OpenAI-Translator

<p align="center">
<br> English | <a href="README-CN.md">中文</a>
</p>
<p align="center">
<em>All the code and documentation are entirely generated by OpenAI's GPT-4 Model</em>
</p>


## Introduction

OpenAI Translator is an AI-powered translation tool designed to translate English PDF books to Chinese. The tool leverages large language models (LLMs) like ChatGLM and OpenAI's GPT-3 and GPT-3.5 Turbo for translation. It's built in Python and has a flexible, modular, and object-oriented design.

## Why this project

In the current landscape, there's a lack of non-commercial yet efficient PDF translation tools. Many users have PDF documents with sensitive data that they prefer not to upload to public commercial service websites due to privacy concerns. This project was developed to address this gap, providing a solution for users who need to translate their PDFs while maintaining data privacy.
Langchain prac cause I like programming

### Sample Results

The OpenAI Translator is still in its early stages of development, and I'm actively working on adding more features and improving its performance. We appreciate any feedback or contributions!

![The_Old_Man_of_the_Sea](images/sample_image_0.png)

<p align="center">
<em>"The Old Man and the Sea"</em>
</p>

## Features

- [X] Translation of English PDF books to Chinese using LLMs.
- [X] Support for both [ChatGLM](https://github.com/THUDM/ChatGLM-6B) and [OpenAI](https://platform.openai.com/docs/models) models.
- [X] Flexible configuration through a YAML file or command-line arguments.
- [X] Translation PDF books to MarkDown by using LLMs.
- [X] Support for [OpenAI](https://platform.openai.com/docs/models) models.
- [X] Flexible configuration through a YAML file or gradios building UI.
- [X] Timeouts and error handling for robust translation operations.
- [X] Modular and object-oriented design for easy customization and extension.
- [x] Add support for other languages and translation directions.
- [ ] Implement a graphical user interface (GUI) for easier use.
- [ ] Create a web service or API to enable usage in web applications.
- [ ] Add support for batch processing of multiple PDF files.
- [ ] Add support for preserving the original layout and formatting of the source PDF.
- [ ] Improve translation quality by using custom-trained translation models.
- [x] Add support for translation styles.
- [X] able to add images into MarkDown file


## Getting Started

### Environment Setup

1.Clone the repository `git clone git@github.com:DjangoPeng/openai-translator.git`.
1.Clone the repository `https://github.com/ycAlex11/langchain-examples-.git`.

2.The `OpenAI-Translator` requires Python 3.10 or later. Install the dependencies with `pip install -r requirements.txt`.

3.Set up your OpenAI API key(`$OPENAI_API_KEY`). You can either add it to your environment variables or specify it in the config.yaml file.
3.Set up your OpenAI API key(`$OPENAI_API_KEY`). You have to specify it in the config.yaml file.

### Usage

You can use OpenAI-Translator either by specifying a configuration file or by providing command-line arguments.
You can use OpenAI-Translator either by specifying a configuration file .

#### Using a configuration file:

Expand All @@ -65,26 +44,12 @@ input_file: "tests/test.pdf"
output_file_format: "markdown"
source_language: "English"
target_language: "Chinese"
api_key: "your OpenAI API key"
style:""
```

Then run the tool:

```bash
python ai_translator/main.py
```

![sample_out](images/sample_image_1.png)

#### Using command-line arguments:

You can also specify the settings directly on the command line. Here's an example of how to use the OpenAI model:

```bash
# Set your api_key as an env variable
export OPENAI_API_KEY="sk-xxx"
python ai_translator/main.py --model_name "gpt-3.5-turbo" --input_file "your_input.pdf" --output_file_format "markdown" --source_language "English" --target_language "Chinese"
```

## License

This project is licensed under the GPL-3.0 License. See the [LICENSE](LICENSE) file for details.
```
20 changes: 10 additions & 10 deletions langchain/openai-translator/ai_translator/book/content.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,15 +71,15 @@ def set_translation(self, translation, status):
def __str__(self):
return self.original.to_string(header=False, index=False)

def iter_items(self, translated=False):
target_df = self.translation if translated else self.original
for row_idx, row in target_df.iterrows():
for col_idx, item in enumerate(row):
yield (row_idx, col_idx, item)
# def iter_items(self, translated=False):
# target_df = self.translation if translated else self.original
# for row_idx, row in target_df.iterrows():
# for col_idx, item in enumerate(row):
# yield (row_idx, col_idx, item)

def update_item(self, row_idx, col_idx, new_value, translated=False):
target_df = self.translation if translated else self.original
target_df.at[row_idx, col_idx] = new_value
# def update_item(self, row_idx, col_idx, new_value, translated=False):
# target_df = self.translation if translated else self.original
# target_df.at[row_idx, col_idx] = new_value

def get_original_as_str(self):
return self.original.to_string(header=False, index=False)
# def get_original_as_str(self):
# return self.original.to_string(header=False, index=False)
13 changes: 7 additions & 6 deletions langchain/openai-translator/ai_translator/gradio_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@
from translator import PDFTranslator, TranslationConfig


def translation(input_file, source_language, target_language):
LOG.debug(f"[翻译任务]\n源文件: {input_file.name}\n源语言: {source_language}\n目标语言: {target_language}")

def translation(input_file, source_language, target_language,style):
LOG.debug(f"[翻译任务]\n源文件: {input_file.name}\n源语言: {source_language}\n目标语言: {target_language}\n翻译风格: {style}")
output_file_path = Translator.translate_pdf(
input_file.name, source_language=source_language, target_language=target_language)
input_file.name, source_language=source_language, target_language=target_language,style = style)

return output_file_path

Expand All @@ -24,7 +24,8 @@ def launch_gradio():
inputs=[
gr.File(label="上传PDF文件"),
gr.Textbox(label="源语言(默认:英文)", placeholder="English", value="English"),
gr.Textbox(label="目标语言(默认:中文)", placeholder="Chinese", value="Chinese")
gr.Textbox(label="目标语言(默认:中文)", placeholder="Chinese", value="Chinese"),
gr.Textbox(label="翻译风格(默认:中文)", placeholder="None", value=None),
],
outputs=[
gr.File(label="下载翻译文件")
Expand All @@ -44,7 +45,7 @@ def initialize_translator():
config.initialize(args)
# 实例化 PDFTranslator 类,并调用 translate_pdf() 方法
global Translator
Translator = PDFTranslator(config.model_name)
Translator = PDFTranslator(config.model_name,config.api_key,config.style)


if __name__ == "__main__":
Expand Down
6 changes: 3 additions & 3 deletions langchain/openai-translator/ai_translator/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
# 初始化配置单例
config = TranslationConfig()
config.initialize(args)

#print(config.style)
# 实例化 PDFTranslator 类,并调用 translate_pdf() 方法
translator = PDFTranslator(config.model_name)
translator.translate_pdf(config.input_file, config.output_file_format, pages=None)
translator = PDFTranslator(config.model_name,config.api_key,config.style)
translator.translate_pdf(config.input_file, config.output_file_format, pages=None,style = config.style)
18 changes: 16 additions & 2 deletions langchain/openai-translator/ai_translator/translator/pdf_parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,14 @@ def parse_pdf(self, pdf_file_path: str, pages: Optional[int] = None) -> Book:
pages_to_parse = pdf.pages
else:
pages_to_parse = pdf.pages[:pages]

img_num = 1
for pdf_page in pages_to_parse:
page = Page()

# Store the original text content
raw_text = pdf_page.extract_text()
tables = pdf_page.extract_tables()
images_in_page = pdf_page.images

# Remove each cell's content from the original text
for table_data in tables:
Expand All @@ -52,7 +53,20 @@ def parse_pdf(self, pdf_file_path: str, pages: Optional[int] = None) -> Book:
table = TableContent(tables)
page.add_content(table)
LOG.debug(f"[table]\n{table}")



if images_in_page:
page_height = pdf_page.height
for image in images_in_page:
image_bbox = (image['x0'], page_height - image['y1'], image['x1'], page_height - image['y0'])
cropped_page = pdf_page.crop(image_bbox)
image_obj = cropped_page.to_image(resolution=200)
#img_name = (pdf_file_path.replace('test.pdf', f'images/'))+str(img_num)+".jpg"
img_name = (pdf_file_path.replace('test.pdf', ''))+str(img_num)+".jpg"
#image_obj.save("tests/1.jpg")
image_obj.save(img_name)
page.contents.append(img_name)
img_num+=1
book.add_page(page)

return book
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
from utils import LOG

class PDFTranslator:
def __init__(self, model_name: str):
self.translate_chain = TranslationChain(model_name)
def __init__(self, model_name: str,api_key:str,style:str):
self.translate_chain = TranslationChain(model_name,api_key,style)
self.pdf_parser = PDFParser()
self.writer = Writer()

Expand All @@ -15,15 +15,16 @@ def translate_pdf(self,
output_file_format: str = 'markdown',
source_language: str = "English",
target_language: str = 'Chinese',
pages: Optional[int] = None):

pages: Optional[int] = None,
style: str = ''):
self.book = self.pdf_parser.parse_pdf(input_file, pages)

for page_idx, page in enumerate(self.book.pages):
for content_idx, content in enumerate(page.contents):
# Translate content.original
translation, status = self.translate_chain.run(content, source_language, target_language)
# Update the content in self.book.pages directly
self.book.pages[page_idx].contents[content_idx].set_translation(translation, status)
#图片的话就不用调langchain和chatgpt,只传文本和图表
if not isinstance(content, str):
# Translate content.original
translation, status = self.translate_chain.run(content, source_language, target_language,style)
# Update the content in self.book.pages directly
self.book.pages[page_idx].contents[content_idx].set_translation(translation, status)

return self.writer.save_translated_book(self.book, output_file_format)
Loading