0成本,使用Github Action做一个外语PDF翻译工作流

看纯英文PDF太费劲,不想用别人的网站或插件,机翻质量差、速度慢、容易卡死,用浏览器插件大PDF容易失败。 不如自己手搓一个工作流来做翻译,只需要往文件夹里一丢,提交到Github仓库,Action工作流会自动触发,自动翻译,翻完了也是自动上传到Github 仓库里。
效果预览:出来的结果是一个双语,一个纯汉语,可以打开双语的对照着看,阅读速度大大提升,翻译得有瑕疵也可以看原文澄清歧义。下图是翻译了谷歌新出的提示词工程白皮书

PDFMathTranslate

python 语言的 pdf2zh库,支持多种语种,翻译的同时会保持原有的段落格式,支持传入文件夹,支持多种大语言模型接入。默认的机器翻译的质量很差,必须接入大模型翻译或专有翻译服务。

!question\] 默认谷歌的翻译,把"摘要"翻译成了"抽象的",翻译质量较差

PDFMathTranslate

PDFMathTranslate 支持的Service

支持的服务如下表

可以看到,支持了非常多的AI模型和AI开放平台。我试了DeepL、Gemini、Qwen/Qwen2.5-7B-Instruct和Deepseek V3,感觉DeepSeek V3表现较好。

使用方法是通过-s指定服务,并将参数的Value写入到环境变量中。以OPEN_AI举例,Windows环境下用$env:OPENAI_API_KEY=指定,Mac环境用export OPENAI_API_KEY=指定,同时支持传入自定义的提示词等。

!hint\] 如果有其他语种的翻译输入/输出需求,也可以通过-li和-lo指定,但需要使用的翻译服务能够支持。

搭建工作流

新建Github项目,在.github/workflows文件夹下新建.yaml文件,写入如下配置内容即可。

yaml 复制代码
name: Translate PDF with Python
on:
  push:
    paths:
      - 'papers/*.pdf'
  workflow_dispatch:
jobs:
  convert:
    runs-on: ubuntu-latest
    env:
      SILICON_API_KEY: ${{ secrets.SILICON_API_KEY }}
      SILICON_MODEL: ${{ secrets.SILICON_MODEL }}
    steps:
      - name: Checkout Repository
        uses: actions/checkout@v3
      - name: Set up Python 3.12
        uses: actions/setup-python@v5
        with:
          python-version: 3.12
      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install pdf2zh
      - name: Translate all PDFs in papers/
        run: |
          mkdir -p translation_output archive
          pdf2zh --dir papers/ -o translation_output -s silicon
          mv papers/*.pdf archive/
      - name: Commit and Push Translated Files + Archived PDFs
        run: |
          git config --global user.name "github-actions[bot]"
          git config --global user.email "github-actions[bot]@users.noreply.github.com"

          git add translation_output/*.pdf archive/*.pdf
          
          # Stash changes to ensure no conflict when pulling
          git stash || echo "No local changes to stash"

          git commit -m "Auto translate PDF and archive originals" || echo "No changes to commit"

          # Pull with rebase to avoid conflicts
          git pull origin main --rebase || exit 1

          # Apply the stashed changes and commit them
          git stash pop || echo "No changes to apply from stash"

          # Add any unstaged changes from the stash
          git add .

          # Commit and Push
          git commit -m "Reapply stashed changes" || echo "No changes to commit"

          # Retry push if failed
          for i in 1 2 3; do
            git push origin main && break
            echo "Push failed, retrying in 5 seconds... ($i)"
            sleep 5
            git pull origin main --rebase || break
          done

触发

我设定的触发条件是在papers/文件夹中提交了pdf文件时触发。这样只要把文件放到papers文件夹下并提交,就会自动运行。增加workflow_dispatch:是也支持手动触发调试。可根据需求,更改为webhook触发、其他工作流触发或者定时触发等。

环境变量

/settings/secrets/actions 中可配置使用的Key和模型。

使用硅基流动的API,可以选用多种模型。实测跑一份几十页的PDF大概花费赠送余额1毛多,没有注册的朋友欢迎点下方链接,使用我的邀请码注册,你我都可以获赠赠送余额十四元~

点击注册硅基流动

使劲测试消耗了两元巨款⬇️

执行

执行过程就是安装python环境、安装依赖、命令行执行。将执行出的pdf文件放到translation_output 文件夹中,将已翻译好的pdf挪到 archive文件夹中。

!hint\] 注意最好在`papers`文件夹下放一个后缀不是pdf文件的文件做占位,不然pdf被挪走后,空文件夹会被自动删掉 。我是放了一个名字就叫placeholder的无后缀空文件做占位。

翻译结果提交到库

由于翻译可能执行的时间很长,过程中可能库内文件发生了变更,再做提交时就会发生冲突。

所以提交前并先stash当前内容,再做一次拉取,拉取库内最新的文件,再提交。避免因为冲突,导致文件提交失败。

使用

使用起来很简单,就是把需要翻译的文件放到papers文件夹下,提交到github上。等一段时间(过程较长,大的pdf可能要四五十分钟甚至一个多小时,不过都是自动、在云端完成的)翻译完成了,再拉取一下,可以看到翻译结果已经放到translation_output文件夹下啦。

可以翻译书籍、论文等等~

相关推荐
爱喝酸奶的桃酥1 小时前
自动化备份全网服务器数据平台
服务器·自动化·github
小华同学ai1 小时前
21.7K star!全流程研发项目管理神器,开源免费不限商用!
github
我是哪吒2 小时前
分布式微服务系统架构第109集:HTTP缓存优化,Nginx 代理配置,蓝绿部署, Jenkins一键切流脚本
后端·面试·github
油泼辣子多加2 小时前
2025年04月14日Github流行趋势
github
uhakadotcom2 小时前
PySpark和Kafka入门对比:快速理解大数据处理与实时消息传输
后端·面试·github
海风极客2 小时前
Go市场份额达3%!4月编程语言排行出炉~
后端·github
uhakadotcom2 小时前
Rust 高性能异步 HTTP 库 hyper 入门指南:基础知识与实战示例
后端·面试·github
uhakadotcom3 小时前
消息队列的基本概念入门以及什么是死信策略
后端·面试·github
梓羽玩Python3 小时前
这个开源神器终结了AI数据整合的噩梦!一键聚合网页、代码、论文到剪贴板!
人工智能·python·github
uhakadotcom14 小时前
Amazon GameLift 入门指南:六大核心组件详解与实用示例
后端·面试·github