1. 环境准备
1.1 安装必要的Python库
在使用该脚本前,需要安装以下Python库:
pip install python-docx openai
2. 使用说明
2.1 输入API Key和Base URL
在执行脚本时,首先需要输入OpenAI的API Key和可选的Base URL。
api_key = input("请输入API key: ")
base_url_input = input("请输入base URL (如果没有,请直接回车): ")
api_key
:用于访问OpenAI API的密钥。base_url_input
:可选项,若未提供则使用默认URL。
2.2 设置并行线程数
根据需求设置并行处理的线程数,注意若出现故障或API限流问题,建议使用单线程。
xian_cheng_int = int(input("请输入线程数(线程数越多,单位时间内翻译的段落越多)(若出现故障/api限流问题,优先使用1个线程): "))
2.3 输入需要翻译的DOCX文件名
输入需要翻译的Word文档文件名(无后缀)。
file = input("当前文件夹的docx文件名(无后缀):")
2.4 脚本的主要功能
脚本会自动遍历文档中的所有段落,并使用OpenAI的GPT-3.5模型将其翻译为中文。翻译结果会保存在新的DOCX文件中。
3. 代码结构
3.1 translate_paragraph
函数
该函数用于翻译文档中的某一段落,并将翻译结果写回文档。
def translate_paragraph(j, number_paragraph):
# 获取段落内容并调用API进行翻译
# 将翻译后的内容写回文档并保存
3.2 main
函数
主函数,负责读取文档、管理翻译任务的多线程调度。
def main():
# 读取用户输入的文件名并打开文档
# 初始化段落索引列表
# 管理多线程翻译任务
3.3 全局变量和锁
lock
:全局锁,用于多线程环境下的数据同步。doc
:全局的文档对象。my_json_data
:全局的数据结构,存储段落的状态。
4.注意事项
- API Key的保护:确保API Key的安全,避免泄露。
- 文档格式:脚本假设文档中的每个段落都是独立的,如果有复杂的段落格式,可能需要调整代码。
- 线程数设置:根据实际需求和系统性能设置合适的线程数,避免过多线程导致系统负载过高或API限流。
- 错误处理:若遇到API调用超时或其他错误,脚本会跳过当前段落并继续处理下一个段落。
全部代码:
from docx import Document
from docx.shared import Pt
import openai
import threading
import time
# 获取用户输入的API key
api_key = input("请输入API key: ")
# 尝试获取用户输入的base URL,如果没有则使用默认值
base_url_input = input("请输入base URL (如果没有,请直接回车): ")
# 根据用户输入创建client实例
if base_url_input:
client = openai.OpenAI(api_key=api_key, base_url=base_url_input)
else:
client = openai.OpenAI(api_key=api_key)
# 获取用户输入的线程数
xian_cheng_int = int(input("请输入线程数(线程数越多,单位时间内翻译的段落越多)(若出现故障/api限流问题,优先使用1个线程): "))
print("客户端配置完成。")
# 创建全局锁
lock = threading.Lock()
def translate_paragraph(j, number_paragraph):
global doc
global lock
# 获取段落的内容
paragraph_text = doc.paragraphs[number_paragraph].text
print(paragraph_text)
# 创建对话列表
message = [
{"role": "system", "content": f"""Translate the following English (or other languages) into Chinese. If there is no text to translate, please copy the user's input as a reply. text:"{paragraph_text}" """}
]
try:
# 使用GPT-3.5对话模型进行翻译
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=message
)
translated_text = response.choices[0].message.content
print(translated_text)
with lock:
# 获取段落的第一个字符的字体大小
paragraph = doc.paragraphs[number_paragraph]
font_size = paragraph.runs[0].font.size if paragraph.runs else Pt(11)
# 清除段落内容并添加翻译后的内容
paragraph.clear()
new_content = paragraph.add_run(translated_text)
new_content.font.size = font_size if font_size else Pt(11)
# 保存修改后的文件
doc.save('Translation_file.docx')
my_json_data['ingT'].remove(j)
print("已保存文件")
except Exception as e:
print(f"API调用超时或其他错误: {e}")
def main():
global doc
global my_json_data
file = input("当前文件夹的docx文件名(无后缀):")
print(file)
# 打开已有的docx文件
doc = Document(f'{file}.docx')
docx_NT = [i + 1 for i in range(len(doc.paragraphs))]
print(docx_NT)
my_json_data = {
'docx': f'{file}.docx',
'ingT': [],
'NT': docx_NT
}
while my_json_data['NT']:
while len(my_json_data['ingT']) >= xian_cheng_int:
print(f"达到{xian_cheng_int}线程")
print("当前线程数:", len(my_json_data['ingT']))
time.sleep(1)
with lock:
if not my_json_data['NT']:
break
j = min(my_json_data['NT'])
my_json_data['ingT'].append(j)
my_json_data['NT'].remove(j)
print("正在处理段落:", j)
number_paragraph = j - 1
paragraph = doc.paragraphs[number_paragraph]
if paragraph.text.strip():
print("段落包含文字")
threading.Thread(target=translate_paragraph, args=(j, number_paragraph)).start()
else:
print("段落不包含文字")
with lock:
my_json_data['ingT'].remove(j)
print("翻译全部完成, 正在等待线程完成")
if __name__ == "__main__":
main()