基于chatgpt动手实现一个ai_translator

动手实现一个ai翻译

前言

最近在极客时间学习《AI 大模型应用开发实战营》,自己一边跟着学一边开发了一个进阶版本的 OpenAI-Translator,在这里简单记录下开发过程和心得体会,供有兴趣的同学参考;

ai翻译程序

版本迭代

在学习课程中呢。老师直播完成了ai翻译程序1.0版本。实现一个比较基础版本的ai翻译程序。

1.0版本

实现的功能:

  • pdf文件解析提取文字和表格
  • 将提取的原始信息发送给chatgpt进行翻译
  • chatgpt返回结果后,将结果保存为pdf或者markdown格式

不足之处

  • 不能保留pdf的原格式
  • 仅支持命令行操作,没有gui
  • 仅支持将中文翻译为英文

任何软件并不是一开始就是完美的,有了这些不足正好可以让我们根据所学的东西,更好的完善它。

2.0版本

实现的功能:

  • 支持图形用户界面(GUI),提升易用性。
  • 添加对保留源 PDF 的原始布局的支持。
  • 服务化:以 API 形式提供翻译服务支持。
  • 添加对其他语言的支持。

2.0要实现的也仅仅是一个开始.

动手实现2.0版本。

最初想先尝试做pdf对原格式的支持,一直没有很好的方案。想着不能一直在这个地方耗着,很多时候可能某一时刻突然灵光一闪就解决了。我先尝试做gui部分。

gui功能的实现

这两天有个同学在群里分享,有个python的gui库streamlit比较简单,并且ui很美观,官方文档也有很多小栗子。
这里放下官方文档链接https://docs.streamlit.io/

1.先展示下我做好的gui页面
在这里插入图片描述

  • 左侧边栏主要必要参数的设置
  • 右边是有一个上传文件的地方
  • 源文件翻译完成之后会有个下载文件的按钮

2.首先需要安装streamlit库

pip install streamlit

测试安装是否有效

streamlit hello

如果都没有问题运行后会出现访问地址
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TllN4i6Z-1691930800113)(images/1-one-start.png)]

并且会自动在浏览器中打开服务地址
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0U8uCfBU-1691930800118)(images/1691242317852.png)]

恭喜你,已经完成了万里长征第一步了。

3.接下来我们来实现侧边栏

首先需要导入streamlit

import streamlit as st

我们设置一下网页的title

st.set_page_config(
    page_title="AI-translate",
    page_icon="👋",
)

这段代码效果类似下图中的
在这里插入图片描述

接下来我们设置侧边栏

with st.sidebar:
    st.markdown('使用方法')
    st.markdown('1.选择语言模型')
    st.markdown('2.设置apikey')
    option = st.selectbox('选择大语言模型?',('OpenAIModel','GLMModel'))
    api_key = st.text_input('设置apikey',type='password',value='sk-xxx')
    # clear_button = st.sidebar.button("Clear Conversation", key="clear")
    model_name = st.selectbox("Choose a model:", ("gpt-3.5-turbo","gpt4"))
    file_format = st.selectbox("文件的输出类型", ("pdf","text"))

这段代码已经包括完整的侧边栏了,我们来看下运行效果

streamlit run ai-translate.py --runner.fastReruns True

ai-translate.py 注意替换成成实际的文件名,--runner.fastReruns True表示可以修改代码自动生效,调试代码不需要一次次的重启了。
在这里插入图片描述

不出意外你就可以看到侧边栏的内容了

侧边栏完成代码如下:

import streamlit as st
st.set_page_config(
    page_title="AI-translate",
    page_icon="👋",
)
with st.sidebar:
    st.markdown('使用方法')
    st.markdown('1.选择语言模型')
    st.markdown('2.设置apikey')
    option = st.selectbox('选择大语言模型?',('OpenAIModel','GLMModel'))
    api_key = st.text_input('设置apikey',type='password',value='sk-xxx')
    # clear_button = st.sidebar.button("Clear Conversation", key="clear")
    model_name = st.selectbox("Choose a model:", ("gpt-3.5-turbo","gpt4"))
    file_format = st.selectbox("文件的输出类型", ("pdf","text"))

4.实现主功能页面
设置主功能页面标题和使用方法

st.header('AI Translator')
st.write("# Welcome to AI Translator! 👋")
st.markdown('使用方法')
st.markdown('1.上传需要翻译的文件')
st.markdown('2.静待结果')

添加上传文件的按钮

uploaded_file = st.file_uploader("上传需要翻译的文件",type=['pdf'])

type表示只能上传pdf文件,接下来刷新浏览器看下效果

在这里插入图片描述

整个页面的样式也就出来了,是不是很简单。接下来我们来实现处理上传的文件的逻辑

接下来实现文件处理逻辑
先导入os模块

import os

实现将上传的文件保存到files目录中

if uploaded_file is not None:
    # st.write(uploaded_file)
    # To read file as bytes:
    filename=uploaded_file.name
    bytes_data = uploaded_file.getvalue()
    filepath='files'
    # 检查文件路径是否存在,如果不存在则创建
    if not os.path.exists(filepath):
        os.makedirs(filepath)
    full_filepath=os.path.join(filepath,filename)
    # Save file
    with open(full_filepath, "wb") as f:
        f.write(bytes_data)
        st.info('程序处理中。。。', icon="ℹ️")

文件已经保存到目录中了,接下来我们只要将文件丢给翻译程序处理就好了
这里先把页面弄好,之后再填充具体的翻译处理代码。
我们先用一个复制文件的逻辑完成下面的代码

    ### 翻译程序
    import shutil
    # 定义源文件路径和目标文件路径
    source_file = full_filepath
    file_name, file_extension = os.path.splitext(source_file)
    target_file = file_name + '_translated' + file_extension
    # 使用shutil模块的copy2函数复制文件
    shutil.copy2(source_file, target_file)
    st.info('程序完成。', icon="ℹ️")

这个代码主要把源文件复制并重命名了一个,比如源文件是test.pdf目标文件就是test_translated.pdf

实现下载文件按钮

    # 获取文件名和扩展名
    file_name, file_extension = os.path.splitext(full_filepath)

    # 构建目标文件名
    new_pdf_file_path = file_name + '_translated' + file_extension
    newfilename=os.path.split(new_pdf_file_path)[1]
    # st.download_button('Download some text', text_contents)
    with open(new_pdf_file_path, "rb") as file:
        btn = st.download_button(
                label="Download pdf",
                data=file,
                file_name=newfilename,

            )

现在可以上传文件测试下了
在这里插入图片描述

完整代码如下:

import streamlit as st
import os

st.set_page_config(
    page_title="AI-translate",
    page_icon="👋",
)
with st.sidebar:
    st.markdown('使用方法')
    st.markdown('1.选择语言模型')
    st.markdown('2.设置apikey')
    option = st.selectbox('选择大语言模型?',('OpenAIModel','GLMModel'))
    api_key = st.text_input('设置apikey',type='password',value='sk-xxx')
    # clear_button = st.sidebar.button("Clear Conversation", key="clear")
    model_name = st.selectbox("Choose a model:", ("gpt-3.5-turbo","gpt4"))
    file_format = st.selectbox("文件的输出类型", ("pdf","text"))


st.header('AI Translator')
st.write("# Welcome to AI Translator! 👋")
st.markdown('使用方法')
st.markdown('1.上传需要翻译的文件')
st.markdown('2.静待结果')
uploaded_file = st.file_uploader("上传需要翻译的文件",type=['pdf'])
if uploaded_file is not None:
    # st.write(uploaded_file)
    # To read file as bytes:
    filename=uploaded_file.name
    bytes_data = uploaded_file.getvalue()
    filepath='files'
    # 检查文件路径是否存在,如果不存在则创建
    if not os.path.exists(filepath):
        os.makedirs(filepath)
    full_filepath=os.path.join(filepath,filename)
    # Save file
    with open(full_filepath, "wb") as f:
        f.write(bytes_data)
        st.info('程序处理中。。。', icon="ℹ️")
    ### 翻译程序
    import shutil
    # 定义源文件路径和目标文件路径
    source_file = full_filepath
    file_name, file_extension = os.path.splitext(source_file)
    target_file = file_name + '_translated' + file_extension
    # 使用shutil模块的copy2函数复制文件
    shutil.copy2(source_file, target_file)

    st.info('程序完成。', icon="ℹ️")
    # 获取文件名和扩展名
    file_name, file_extension = os.path.splitext(full_filepath)

    # 构建目标文件名
    new_pdf_file_path = file_name + '_translated' + file_extension
    newfilename=os.path.split(new_pdf_file_path)[1]
    # st.download_button('Download some text', text_contents)
    with open(new_pdf_file_path, "rb") as file:
        btn = st.download_button(
                label="Download pdf",
                data=file,
                file_name=newfilename,

            )

这样就完成了整个gui页面的编写,在上面我们用了一个伪代码逻辑实现了文件的翻译。接下来可以替换成真实的翻译代码
源代码

    ### 翻译程序
    import shutil
    # 定义源文件路径和目标文件路径
    source_file = full_filepath
    file_name, file_extension = os.path.splitext(source_file)
    target_file = file_name + '_translated' + file_extension
    # 使用shutil模块的copy2函数复制文件
    shutil.copy2(source_file, target_file)

替换的代码

导入翻译程序代码

from utils import ArgumentParser, ConfigLoader, LOG
from model import GLMModel, OpenAIModel
from translator import PDFTranslator

调用翻译代码

    model = OpenAIModel(model=model_name, api_key=api_key)
    pdf_file_path = filepath
    #实例化 PDFTranslator 类,并调用 translate_pdf() 方法
    translator = PDFTranslator(model)
    translator.translate_pdf(pdf_file_path, file_format)

完整代码


import streamlit as st
import os
from utils import ArgumentParser, ConfigLoader, LOG
from model import GLMModel, OpenAIModel
from translator import PDFTranslator

st.set_page_config(
    page_title="AI-translate",
    page_icon="👋",
)
with st.sidebar:
    st.markdown('使用方法')
    st.markdown('1.选择语言模型')
    st.markdown('2.设置apikey')
    option = st.selectbox('选择大语言模型?',('OpenAIModel','GLMModel'))
    api_key = st.text_input('设置apikey',type='password',value='sk-xxx')
    # clear_button = st.sidebar.button("Clear Conversation", key="clear")
    model_name = st.selectbox("Choose a model:", ("gpt-3.5-turbo","gpt4"))
    file_format = st.selectbox("文件的输出类型", ("pdf","text"))


st.header('AI Translator')
st.write("# Welcome to AI Translator! 👋")
st.markdown('使用方法')
st.markdown('1.上传需要翻译的文件')
st.markdown('2.静待结果')
uploaded_file = st.file_uploader("上传需要翻译的文件",type=['pdf'])
if uploaded_file is not None:
    # st.write(uploaded_file)
    # To read file as bytes:
    filename=uploaded_file.name
    bytes_data = uploaded_file.getvalue()
    filepath='files'
    # 检查文件路径是否存在,如果不存在则创建
    if not os.path.exists(filepath):
        os.makedirs(filepath)
    full_filepath=os.path.join(filepath,filename)
    # Save file
    with open(full_filepath, "wb") as f:
        f.write(bytes_data)
        st.info('程序处理中。。。', icon="ℹ️")
    ### 翻译程序
    model = OpenAIModel(model=model_name, api_key=api_key)
    #实例化 PDFTranslator 类,并调用 translate_pdf() 方法
    translator = PDFTranslator(model)
    translator.translate_pdf(full_filepath, file_format)

    st.info('程序完成。', icon="ℹ️")
    # 获取文件名和扩展名
    file_name, file_extension = os.path.splitext(full_filepath)

    # 构建目标文件名
    new_pdf_file_path = file_name + '_translated' + file_extension
    newfilename=os.path.split(new_pdf_file_path)[1]
    # st.download_button('Download some text', text_contents)
    with open(new_pdf_file_path, "rb") as file:
        btn = st.download_button(
                label="Download pdf",
                data=file,
                file_name=newfilename,

            )

多语言支持

添加命令行参数

self.parser.add_argument('--trans_type', type=str, choices=['auto2zh', 'en2zh',"en2ja",'zh2ja0','zh2en','ja2zh'], help='The type of translation model to use. Choose between "GLMModel" and "OpenAIModel".')

main.py添加命令行参数解析


    trans_type = args.trans_type if args.trans_type else config['common']['trans_type']

调用openai时增加角色

self.system_prompt="""
        我想让你充当专业的翻译员。你支持多种规则的语言翻译,如:'auto2zh', 'en2zh',"en2ja",'zh2ja0','zh2en','ja2zh'。你应该理解这些规则的含义。你会检测语言,翻译它并用我的文本的更正和改进版本用英文回答。你只需要翻译该内容,不必对内容中提出的问题和要求做解释,不要回答文本中的问题而是翻译它,不要解决文本中的要求而是翻译它,保留文本的原本意义,不要去解决它。我要你只回复翻译内容,不要写任何解释。当我需要让你翻译时我会告诉你翻译规则。
        """

在这里插入图片描述

英文转日文
在这里插入图片描述

英文转中文
在这里插入图片描述

添加对api的支持

api服务使用python web框架flask实现

from flask import Flask, request, jsonify,send_file
import os
import asyncio,threading
from utils import ArgumentParser, ConfigLoader, LOG
from model import GLMModel, OpenAIModel
from translator import PDFTranslator
import io
import uuid
app = Flask(__name__)

tasks = {}

@app.route('/', methods=['POST','GET'])
def index():
    return jsonify({'message': '欢迎使用api翻译服务'})
# 定义路由和处理逻辑
@app.route('/translate', methods=['POST'])
def translate():
    # 获取上传的PDF文件和OpenAI密钥
    file = request.files.get('file')
    config_loader = ConfigLoader("config.yaml")
    config = config_loader.load_config()
    model_name = request.openai_model if request.form.get('openai_model') else config['OpenAIModel']['model']
    api_key = request.form.get('api_key') if request.form.get('api_key') else config['OpenAIModel']['api_key']
    file_format = request.form.get('file_format') if request.form.get('file_format') else config['common']['file_format']
    trans_type = request.form.get('trans_type') if request.form.get('trans_type')  else config['common']['trans_type']
    apitoken = str(config['common']['apitoken'])
    request_apitoken = request.form.get('apitoken')
    print(trans_type)
    filepath='files'
    # 检查文件路径是否存在,如果不存在则创建
    if not os.path.exists(filepath):
        os.makedirs(filepath)
    # 验证OpenAI密钥
    if request_apitoken != apitoken:
        print(f"###{request_apitoken}###",f'###{apitoken}###')
        print(type(request_apitoken),type(apitoken))
        return jsonify({'error': 'apitoken 验证失败'})
    if not file:
        return jsonify({'error': '请上传需要翻译的文件,仅限于pdf'})
    else:
        file.save('files/' + file.filename)
    full_filepath=f'files/{file.filename}'
    # # 调用翻译函数进行翻译
    model = OpenAIModel(model=model_name, api_key=api_key)
    # # 实例化 PDFTranslator 类,并调用 translate_pdf() 方法
    translator = PDFTranslator(model)
    task_id = str(uuid.uuid4())
    thread = threading.Thread(target=translator.translate_pdf, args=(full_filepath,file_format,trans_type))
    thread.start()
    tasks[task_id] = thread
    #task = asyncio.create_task(translate_file(task_id,full_filepath))
    #task=translate_file(task_id, full_filepath)
    # 返回任务ID给客户端
    return jsonify({'task_id': task_id})

    #return send_file(full_filepath, as_attachment=True)
@app.route('/translated/<task_id>', methods=['GET'])
def get_translated_pdf(task_id):
    # 检查任务ID是否存在
    if task_id not in tasks:
        return jsonify({'message': 'Invalid task ID'})

    thread = tasks[task_id]
    task_status=thread.is_alive()
    if task_status is True:
        message="翻译任务进行中"
    else:
        message="翻译结束"
    return jsonify({'message': message})

if __name__ == '__main__':
    app.run(port=5002)

在请求服务之前需在配置文件中配置apitoken。


common:
  apitoken: 123456

启动api服务

python ai_translator/AI-translate-api.py 

请求api服务-
创建翻译任务
在这里插入图片描述

在这里插入图片描述

根据返回的任务id查询任务状态
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/79706.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

物联网设备的分类和功能阐述

物联网是将各种物理设备和传感器通过互联网进行连接和交互的网络&#xff0c;物联网的核心思想是让各种设备能够通过互联网实现智能化、自动化和远程控制。物联网设备是指连接到物联网中的各种设备&#xff0c;可以通过传感器、处理器、通信模块等技术实现与互联网的连接和数据…

vue3 简易用对话框实现点击头像放大查看

设置头像悬停手势 img:hover{cursor: pointer;}效果&#xff1a; 编写对话框 <el-dialog class"bigAvatar"style"border-radius: 4px;"v-model"deleteDialogVisible"title"查看头像"top"5px"><div><img src&…

大数据Flink学习圣经:一本书实现大数据Flink自由

学习目标&#xff1a;三栖合一架构师 本文是《大数据Flink学习圣经》 V1版本&#xff0c;是 《尼恩 大数据 面试宝典》姊妹篇。 这里特别说明一下&#xff1a;《尼恩 大数据 面试宝典》5个专题 PDF 自首次发布以来&#xff0c; 已经汇集了 好几百题&#xff0c;大量的大厂面试…

SpringBoot部署到腾讯云

SpringBoot部署到腾讯云 此处默认已经申请到腾讯云服务器&#xff0c;因为本人还没有申请域名&#xff0c;所以就直接使用的ip地址 XShell连接到腾讯云 主机中填写腾讯云的公网ip地址 公网ip地址在下图中找到 接下来填写服务器的用户名与密码 一般centOS用户名为root&#xff…

【设计模式】订单状态流传中的状态机与状态模式

文章目录 1. 前言2.状态模式2.1.订单状态流转案例2.1.1.状态枚举定义2.1.2.状态接口与实现2.1.3.状态机2.1.4.测试 2.2.退款状态的拓展2.2.1.代码拓展2.2.2.测试 2.3.小结 3.总结 1. 前言 状态模式一般是用在对象内部的状态流转场景中&#xff0c;用来实现状态机。 什么是状态…

rabbitmq的消息应答

消费者完成一个任务可能需要一段时间&#xff0c;如果其中一个消费者处理一个长的任务并仅只完成 了部分突然它挂掉了&#xff0c;会发生什么情况。RabbitMQ 一旦向消费者传递了一条消息&#xff0c;便立即将该消 息标记为删除。在这种情况下&#xff0c;突然有个消费者挂掉了…

jvm-类加载子系统

1.内存结构概述 类加载子系统负责从文件系统或网络中加载class文件&#xff0c;class文件在文件开头有特定的文件标识 ClassLoader只负责class文件的加载&#xff0c;至于它是否运行&#xff0c;则由Execution Engine决定 加载的类信息存放于一块称为方法区的内存空间&#xff…

SHELL 基础

echo 打印命令 &#xff1a; 显示字符串 [rootserver ~]# echo this is SHELL language this is SHELL language [rootserver ~]# echo this is SHELL language this is SHELL language [rootserver ~]# echo "this is SHELL language" this is SHELL language…

【java毕业设计】基于ssm+mysql+jsp的个性化影片推荐系统设计与实现(程序源码)-个性化影片推荐系统

基于ssmmysqljsp的个性化影片推荐系统设计与实现&#xff08;程序源码毕业论文&#xff09; 大家好&#xff0c;今天给大家介绍基于ssmmysqljsp的个性化影片推荐系统设计与实现&#xff0c;本论文只截取部分文章重点&#xff0c;文章末尾附有本毕业设计完整源码及论文的获取方式…

Bean 作用域、生命周期和Spring执行流程

文章目录 Bean作用域问题案例分析公共 BeanA 用户使用时修改B 用户使用时原因分析 作用域定义Bean 的6种作用域singletonprototyperequestsessionapplicationwebsocket 设置作用域 Spring 执行流程1、启动容器2、Bean 初始化3、注册Bean对象到容器中4、装配Bean属性 Bean 生命周…

redis 存储结构原理 1

关于 redis 相信大家都不陌生了&#xff0c;之前有从 0 -1 分享过 redis 的基本使用方式&#xff0c;用起来倒是都没有啥问题了&#xff0c;不过还是那句话&#xff0c;会应用之后&#xff0c;我们必须要究其原理&#xff0c;知其然知其所以然 今天我们来分享一下关于 redis 的…

“维度削减+逻辑回归”:如何使用PCA大幅提升乳腺癌的预测成功率?

一、引言 乳腺癌是女性中最常见的恶性肿瘤之一&#xff0c;也影响着全球范围内许多人们的健康。据世界卫生组织&#xff08;WHO&#xff09;的数据&#xff0c;乳腺癌是全球癌症发病率和死亡率最高的肿瘤之一&#xff0c;其对个体和社会的危害不可忽视。因此&#xff0c;早期乳…

Coremail参与编制|《信创安全发展蓝皮书——系统安全分册(2023年)》

信创安全发展蓝皮书 近日&#xff0c;Coremail参与编制的《信创安全发展蓝皮书—系统安全分册&#xff08;2023年&#xff09;》重磅发布。 此次信创安全发展蓝皮书由工业和信息化部电子第五研究所联合大数据协同安全技术国家工程研究中心重磅共同发布。 本次蓝皮书涵盖信创系…

使用el-tree实现自定义树结构样式

实现效果: 直接上代码: <template><div><div class"tops"><el-tree :default-expanded-keys"[1]" ref"myTree" :data"data" :props"defaultProps" node-click"handleNodeClick" highlight…

广州华锐互动:奶牛难产原因及救治VR仿真实训系统

奶牛难产是一种常见的疾病&#xff0c;对奶牛的健康和生产造成很大的影响。为了解决这一问题&#xff0c;许多奶牛养殖场开始采用VR仿真技术来培训奶牛兽医&#xff0c;帮助学生更好地理解奶牛养殖的实际过程&#xff0c;提高他们的实践能力的教学方式。 VR技术开发公司广州华锐…

二十二、策略模式

目录 1、项目需求2、传统方案解决鸭子问题的分析和代码实现3、传统方式实现存在的问题分析和解决方案4、策略模式基本介绍5、使用策略模式解决鸭子问题6、策略模式的注意事项和细节7、策略模式的使用场景 以具体项目来演示为什么需要策略模式&#xff0c;策略模式的优点&#x…

如何快速的合并多个PPT使之成为一个PPT?

如何快速的合并多个PPT使之成为一个PPT&#xff1f; 项目过程中&#xff0c;经常给客户汇报&#xff0c;经常做PPT&#xff0c;有时候&#xff0c;需要把之前的ppt内容整合到新的内容中&#xff0c;如何快速合并以及使用呢&#xff1f; 幻灯片&#xff08;PPT中&#xff09;点…

SpringBoot3集成Kafka

标签&#xff1a;Kafka3.Kafka-eagle3&#xff1b; 一、简介 Kafka是一个开源的分布式事件流平台&#xff0c;常被用于高性能数据管道、流分析、数据集成和关键任务应用&#xff0c;基于Zookeeper协调的处理平台&#xff0c;也是一种消息系统&#xff0c;具有更好的吞吐量、内…

Python入门【动态添加属性和方法、正则表达式概述、match函数的使用、常用匹配符、限定符 、限定符使用示例】(二十九)

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小王&#xff0c;CSDN博客博主,Python小白 &#x1f4d5;系列专栏&#xff1a;python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发 &#x1f4e7;如果文章知识点有错误…

List Label Standard Reporting Edition Crack

List & Label Standard Reporting Edition Crack List&Label是适用于所有主要开发平台的报告解决方案&#xff0c;提供了强大的报告引擎、灵活的API和功能丰富的报告设计器。只需要几行代码就可以在桌面、web或云应用程序中嵌入List&Label。它允许您的应用程序用户…