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.js
和content_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,结果却被“系统找不到指定的路径”狠狠打脸。这才开启了一场与路径、端口和命令行的“斗智斗勇”。
曲折过程:中文路径的“坑”和端口的“霸占”
-
中文路径的“叛变”
罪魁祸首是我的代码文件夹translate_中英翻译
。中文名虽然好看,但在命令行里就像个“叛徒”,让脚本频频报错“路径找不到”。解决办法?果断把文件夹改成纯英文的clean_translate_api
,瞬间风平浪静,电脑再也没借口“迷路”。 -
端口被“霸占”
好不容易改好路径,8989 端口却被某个不知名进程霸占,Uvicorn 启动不了!于是我祭出“端口杀手”脚本kill_port_8989.bat
,用netstat
和taskkill
把占用端口的进程一网打尽,终于让 8989 港湾恢复自由。 -
静默模式的“隐身术”
最初脚本跑得太“高调”,命令行窗口一闪而过,像在跟我炫耀它的存在感。后来改用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
)