当前位置: 首页 > java >正文

02 ( chrome 浏览器插件, 立马翻译), 搭建本地 api

1. 先写 python api

请结合上面的聊天过程,帮我写个文章总结一下。
要求:1. 篇幅不要太长,语言幽默有趣, 平易近人, 有吸引力。 
2. 重点介绍的是起因,即,需求和起因增加篇幅,其他地方篇幅减少。
3.  用中文写。单独新建一个文件。
4. 请帮我分条理, 看起来很清晰。

从“卡顿地狱”到“本地飞速”:打造一个超爽的翻译API

嘿,朋友!作为一个普通程序员,你有没有被远程API的“龟速”折磨得想砸键盘?别急,今天我们来聊聊怎么从“卡顿地狱”一步步打造一个本地翻译API,让你的Chrome插件翻译快得像火箭!🚀 下面是整个过程的总结,幽默又清晰,包你看得开心又明白!


一、起因:远程API太慢,Chrome插件急需“救命”

故事的开端,我有一个超酷的Chrome插件,专门用来翻译网页选中的英文。右键一点,“立马翻译”,中文结果蹦出来,简直是英语小白的救星!😎 但问题来了,插件用的是远程RapidAPI,速度慢得像蜗牛爬,翻译一句“I love programming”得等上好几秒,体验差到让人抓狂。更别提网络不稳时,API直接“罢工”,用户体验直线崩盘!

需求来了:我想要一个本地翻译API,速度快、稳定强,还要无缝接入我的Chrome插件。之前用Python的transformers库写过一个翻译脚本,效果不错,决定把它改成API,彻底告别远程API的“卡顿地狱”!


二、解决方案:FastAPI+本地模型,翻译快如闪电

1. 打造本地API
我们选用了FastAPI来搭建本地翻译服务,搭配Helsinki-NLP/opus-mt-en-zh模型(英译中)。代码简单又优雅:

  • 启动时加载模型,避免每次请求都重新加载。
  • POST接口/translate,接收{"text": "输入"},返回{"translation": "结果", "elapsed_time": "耗时"}
  • pydantic校验输入,防止空文本捣乱。
    运行命令:uvicorn translate_api:app --host 127.0.0.1 --port 8989,本地API瞬间上线!⚡

2. Chrome插件改造
插件的background.jscontent_script.js也得跟上:

  • 把RapidAPI的调用换成本地API(http://127.0.0.1:8989/translate)。
  • 更新manifest.json,加权限http://127.0.0.1:8989/*
  • 横幅显示原文、译文和耗时(比如“0.261秒”),还改掉了8秒自动消失,逼格更高!😄

三、踩坑与优化:从报错到丝滑

1. JSON格式风波
一开始用curl测试API,报了个422 Unprocessable Entity,原来是Windows CMD的引号问题!改用双引号转义后,立马翻译出“我喜欢编程”,速度仅0.261秒!🚀

2. CORS小插曲
插件调用API时,可能会遇到跨域问题。加一句CORSMiddleware,让API对插件敞开大门,问题秒解!

3. 横幅体验升级
用户嫌横幅8秒自动消失太快,改成点击关闭才消失,体验更贴心。调试区还加了耗时展示,程序员看了都说“好清晰”!


四、成果展示:翻译快到飞起!

现在,插件右键一选,翻译结果瞬间弹出,耗时不到0.3秒!比如:

  • 输入“I love programming”,输出“我喜欢编程”,耗时0.261秒。
  • 历史记录保存、错误处理、视觉调试区一应俱全,简直是“翻译界的法拉利”!🏎️

五、未来畅想:让翻译更酷炫

  • 多语言支持:加个参数,让用户选英译法、英译日,翻译宇宙无极限!
  • 拖动横幅:让横幅支持拖拽,摆哪儿都行!
  • 开机自启:写个.bat脚本,丢到Windows启动目录,API随电脑一起“醒来”。

总结:从远程API的“卡顿地狱”到本地API的“飞速体验”,我们用FastAPI和transformers打造了一个超爽的翻译服务。Chrome插件现在快得像一阵风,用户体验满分!😎 如果你也想让自己的插件“起飞”,快试试这个方案吧!


最后,api 代码

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from transformers import MarianMTModel, MarianTokenizer
import time# 初始化 FastAPI 应用
app = FastAPI()# 定义请求体的数据模型
class TranslationRequest(BaseModel):text: str# 加载模型和分词器(启动时加载一次)
model_name = "Helsinki-NLP/opus-mt-en-zh"
tokenizer = MarianTokenizer.from_pretrained(model_name)
model = MarianMTModel.from_pretrained(model_name)# 翻译接口
@app.post("/translate")
async def translate_text(request: TranslationRequest):# 检查输入是否为空if not request.text.strip():raise HTTPException(status_code=400, detail="输入文本不能为空!")# 记录开始时间start_time = time.time()# 翻译输入inputs = tokenizer(request.text, return_tensors="pt", padding=True)translated = model.generate(**inputs)result = tokenizer.decode(translated[0], skip_special_tokens=True)# 计算耗时elapsed_time = time.time() - start_time# 返回翻译结果和耗时return {"translation": result,"elapsed_time": f"{elapsed_time:.3f} 秒"}# pip install fastapi uvicorn transformers torch pydantic
# 启动 api:# uvicorn translate_api:app --host 127.0.0.1 --port 8989
# 开机自动启动
r"""
1. 开机目录:C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup2. 写个 bat 脚本:
"""

2. 写个 bat 文件,开启启动自动运行翻译api

请结合上面的聊天过程,帮我写个文章总结一下。
要求:1. 篇幅不要太长,语言幽默有趣, 平易近人, 有吸引力。 
2. 重点介绍的是起因,即,需求和起因增加篇幅,其他地方篇幅减少。
3.  用中文写。单独新建一个文件。
4. 请帮我分条理, 看起来很清晰。

好的!下面是一篇幽默有趣、条理清晰的文章,总结了我们这次“曲折”的 BAT 脚本调试之旅。文章重点放在需求和起因,其他部分简洁明了,语言平易近人,力求让你读着想笑又觉得亲切!


我的 API 自动启动历险记:从“路径找不到”到“隐形忍者”

起因:一个程序员的“懒人”梦想

作为一个普通程序员,我有个小小的梦想:让我的翻译 API(translate_api.py)在 Windows 10 开机时自动启动,默默在后台跑,监听在 127.0.0.1:8989,随时为我提供中英翻译服务。最好是那种“隐形忍者”模式,不弹窗口、不吵不闹,像个忠实管家,安静地干活。

这需求听起来简单吧?不就是写个 BAT 脚本,扔到开机启动文件夹(shell:startup)就完事儿?但现实告诉我:想让电脑乖乖听话,比哄个调皮小孩还费劲!起初,我用了一个简单的 BAT 脚本,打算切换到项目目录,激活虚拟环境,运行 Uvicorn,结果却被“系统找不到指定的路径”狠狠打脸。这才开启了一场与路径、端口和命令行的“斗智斗勇”。


曲折过程:中文路径的“坑”和端口的“霸占”

  1. 中文路径的“叛变”
    罪魁祸首是我的代码文件夹 translate_中英翻译。中文名虽然好看,但在命令行里就像个“叛徒”,让脚本频频报错“路径找不到”。解决办法?果断把文件夹改成纯英文的 clean_translate_api,瞬间风平浪静,电脑再也没借口“迷路”。

  2. 端口被“霸占”
    好不容易改好路径,8989 端口却被某个不知名进程霸占,Uvicorn 启动不了!于是我祭出“端口杀手”脚本 kill_port_8989.bat,用 netstattaskkill 把占用端口的进程一网打尽,终于让 8989 港湾恢复自由。

  3. 静默模式的“隐身术”
    最初脚本跑得太“高调”,命令行窗口一闪而过,像在跟我炫耀它的存在感。后来改用 start /min,让窗口最小化运行。还想更低调?加了个 VBS 脚本 run_silent.vbs,让 API 彻底变成“隐形忍者”,开机后悄无声息地干活。


最终方案:一个稳稳当当的 BAT 脚本

经过几轮折腾,我得到了一个健壮的 BAT 脚本(startup.bat),它会:

  • 切换到项目目录 C:\Users\Administrator\Work\hugging_face
  • 激活虚拟环境 hug_venv
  • 进入代码文件夹 clean_translate_api
  • 启动 Uvicorn,监听 127.0.0.1:8989
  • 记录每步日志到 startup_log.txt,出错也能快速定位。
  • start /min 最小化运行,安静又高效。

把脚本快捷方式扔进 shell:startup,开机后我的翻译 API 就自动上线,稳如老狗!


小结:从“坑”里爬出的经验

这次调试就像玩了个“找茬游戏”,中文路径、端口冲突、窗口闪烁,一个个坑让我又气又笑。幸好有我的“编程大神”朋友(嘿,就是你,Grok!),帮我一步步排查,改路径、杀进程、加日志,最终让 API 变成了开机即跑的“隐形管家”。下次再有这种“懒人”需求,我可得先检查路径里有没有中文“叛徒”!

bat 启动api

@echo off
:: 设置日志文件路径
set LOGFILE=C:\Users\Administrator\Work\hugging_face\startup_log.txt
echo %date% %time% 启动脚本开始运行 >> %LOGFILE%:: 确保切换到项目文件夹
cd /d "C:\Users\Administrator\Work\hugging_face" || (echo %date% %time% 错误:无法切换到 C:\Users\Administrator\Work\hugging_face >> %LOGFILE%exit /b
)
echo %date% %time% 成功切换到项目文件夹 >> %LOGFILE%:: 检查并激活虚拟环境
if exist "C:\Users\Administrator\Work\hugging_face\hug_venv\Scripts\activate.bat" (call "C:\Users\Administrator\Work\hugging_face\hug_venv\Scripts\activate.bat"echo %date% %time% 虚拟环境激活成功 >> %LOGFILE%
) else (echo %date% %time% 错误:虚拟环境激活脚本不存在:C:\Users\Administrator\Work\hugging_face\hug_venv\Scripts\activate.bat >> %LOGFILE%exit /b
)
:: 切换到代码文件夹
cd /d "C:\Users\Administrator\Work\hugging_face\clean_translate_api" || (echo %date% %time% 错误:无法切换到 C:\Users\Administrator\Work\hugging_face\clean_translate_api >> %LOGFILE%exit /b
)
echo %date% %time% 成功切换到代码文件夹 >> %LOGFILE%:: 检查 uvicorn 是否可用并静默运行
where uvicorn >nul 2>&1
if %ERRORLEVEL%==0 (start /min uvicorn translate_api:app --host 127.0.0.1 --port 8989echo %date% %time% uvicorn 启动成功 >> %LOGFILE%
) else (echo %date% %time% 错误:uvicorn 未安装或未在虚拟环境中找到 >> %LOGFILE%exit /b
)
http://www.xdnf.cn/news/14484.html

相关文章:

  • 在劲牌工厂,探寻一瓶草本酒的科技之旅
  • 充电桩运维管理工具系统的**详细功能列表** - 慧知开源充电桩平台
  • 工业 AI Agent:智能化转型的核心驱动力
  • FPGA基础 -- Verilog语言要素之数组
  • 简说 python
  • Linux -- Ext系列文件系统介绍
  • Eureka、Nacos、Zookeeper 优雅上下线机制
  • 论文笔记:GTG: Generalizable Trajectory Generation Model for Urban Mobility.
  • FairyGUI学习
  • Rust 学习笔记:trait 对象
  • 【工具使用】STM32CubeMX-FreeRTOS操作系统-内存池、消息队列、邮箱篇
  • 时间序列分析
  • Django中使用流式响应,自己也能实现ChatGPT的效果
  • CGAL 快速构建三维凸包
  • 20年架构师视角:SpringAI如何重塑Java技术栈?
  • 进程和线程区别、管道和套接字、共享变量、TCP三次握手,是否可以少一次握手、子进程和主进程区别和API——Nodejs
  • 206. 反转链表
  • ArkUI-X框架LogInterface使用指南
  • C++题解(36) 2025年顺德区中小学生程序设计展示活动(初中组C++)换位(二)
  • BeckHoff <---> Mitsubishi RH-20FR(三菱)水平关节机械手通过网桥(EL6692)通讯
  • C++队列的那些事儿
  • db2主从同步 逻辑复制 APPLY_THROTTLE参数
  • LangGraph AI 系统测试与高可用保障体系
  • SwiftHub 项目分析
  • Linux之Python定制篇——新版Ubuntu24.04安装
  • to avoid naming wrong index webpage for one website
  • DrissionPage如何通过截图的方式获取图片
  • 水果商城管理系统笔记
  • 零基础上手Conda:安装、创建环境、管理依赖的完整指南
  • 计算机硬件——主板