1.申请ID:超级老虎漫步
2.个人邮箱:liuhux@163.com
3.原创技术文章:
摒弃在线API,基于python开发一款一键开启的本地化中英互译离线翻译API服务
图片不知道为什么一直上传失败,我直接贴代码命令
话不多说,直接上干货,开发过程非常简单。
离线翻译需要下载对应的翻译模型(深度学习训练的那种),但是普通开发者一般没有接触过这一领域,所以,我们找现成的来用,不需要自己去训练。
本教程离线翻译模型来自Hugging Face,自然语言处理的神,不科普,想了解的仔细百科。
1.安装python环境(废话),建议conda创建一个虚拟的python3.8以上的环境,不要装无关紧要的依赖包,不然后面打包的服务会非常大。
安装好anconda后,DOS界面直接 conda create -n "虚拟环境名称" python=3.8.3 即可 这里我将 虚拟环境名称设置位translate
2.安装transformers依赖包
先激活创建的虚拟环境:activate translate
再安装依赖包 pip install transformers
3.英汉互译功能源码
[Python] 纯文本查看 复制代码
from transformers import pipeline, AutoModelWithLMHead, AutoTokenizer
###下面的是载入汉译英模型#######
model = AutoModelWithLMHead.from_pretrained("Helsinki-NLP/opus-mt-zh-en") ###括号内参数为模型的地址,默认Helsinki-NLP/opus-mt-en-zh 可以在允许代码时自动下载对应的模型,当然,你也可以下载好了,这里改为你自己的模型地址即可
tokenizer = AutoTokenizer.from_pretrained("Helsinki-NLP/opus-mt-zh-en")###同上
translation_zh2en = pipeline("translation_zh_to_en", model=model, tokenizer=tokenizer)
###下面的是载入英译汉模型#######
model_en2zh = AutoModelWithLMHead.from_pretrained("Helsinki-NLP/opus-mt-en-zh")
tokenizer_en2zh = AutoTokenizer.from_pretrained("Helsinki-NLP/opus-mt-en-zh")
translation_en2zh = pipeline("translation_en_to_zh", model=model_en2zh, tokenizer=tokenizer_en2zh)
###汉译英翻译###
translated_text = translation_zh2en(text, max_length=500)[0]['translation_text']
print("汉译英翻译结果为:"+translated_text)
##英译汉翻译###
translated_text = translation_en2zh(text, max_length=500)[0]['translation_text']
print("英译汉翻译结果为:"+translated_text)
以上代码即为翻译的和性能代码,非常简单,但是考虑到我们是要做一个API服务,以保证C#、C++、易语言等等等其它语言调用本功能,而不仅仅局限于python,那么
我们就要通过一定的手段将其封装成一个简单的WEB服务,并开放一个可供客户端进行POST的URL接口。
4.封装为WEB服务
python疯转web服务也是异常简单,这里我们使用Flask框架来搞。
先安装Flask框架依赖包 命令:pip install Flask
然后开始WEB封装:
考虑到服务需要兼容并发,所以我们导入了gevent.pywsgi来做这件事
直接贴代码
[Python] 纯文本查看 复制代码
from flask import Flask,request
from gevent import pywsgi
from transformers import pipeline, AutoModelWithLMHead, AutoTokenizer
###做web服务,务必要提前加载翻译模型,保持翻译模型的后台运行,万万不可做成每来一个请求就调用一次模型,能慢死
print("加载模型,请稍后。。。")
###下面的是载入汉译英模型#######
model = AutoModelWithLMHead.from_pretrained("Helsinki-NLP/opus-mt-zh-en") ###括号内参数为模型的地址,默认Helsinki-NLP/opus-mt-en-zh 可以在允许代码时自动下载对应的模型,当然,你也可以下载好了,这里改为你自己的模型地址即可
tokenizer = AutoTokenizer.from_pretrained("Helsinki-NLP/opus-mt-zh-en")###同上
translation_zh2en = pipeline("translation_zh_to_en", model=model, tokenizer=tokenizer)
###下面的是载入英译汉模型#######
model_en2zh = AutoModelWithLMHead.from_pretrained("Helsinki-NLP/opus-mt-en-zh")
tokenizer_en2zh = AutoTokenizer.from_pretrained("Helsinki-NLP/opus-mt-en-zh")
translation_en2zh = pipeline("translation_en_to_zh", model=model_en2zh, tokenizer=tokenizer_en2zh)
####下面翻译请求封装为POST
app = Flask(__name__)
@app.route('/report',methods=['POST'])
def translate():
text = request.form['text']
lan = request.form['lan']
if(lan=="ch"): ##中译英
translated_text = translation(text, max_length=500)[0]['translation_text']
return translated_text
elif(lan=="en"):#英译中
translated_text = translation_en2zh(text, max_length=500)[0]['translation_text']
return translated_text
###然后开启服务####
print("服务开启成功,[url=http://0.0.0.0:5690/report]http://0.0.0.0:5690/report[/url]")
server = pywsgi.WSGIServer(('0.0.0.0', 5690), app) ##套上pywsgi,来异步处理请求,不加这个 会在两个以上请求同时发来时,程序直接崩
server.serve_forever()
如果你的环境全部配置好了,那么上面的代码就可以直接开启成功了,模型会全自动下载
开启后,你可以对开启的URL做一个post请求,参数为'lan'指定语言,'text'指定被翻译的内容
贴一个调用实例:
[Asm] 纯文本查看 复制代码
import requests
import base64
import time
url = 'http://127.0.0.1:5690/report'
text = "Even as the continent is seeing a significant decline in new cases and deaths recently, the Africa Centers for Disease Control, or CDC, has called on the world to enable Africa to access adequate COVID-19 vaccines."
data = {'text':text,'lan':'en'}
a= time.time()
r = requests.post(url,data)
print(time.time()-a)
print(r.text)
实际调用的输出结果:即使在非洲大陆最近新病例和死亡人数大幅减少的同时,非洲疾病控制中心(疾控中心)也呼吁世界使非洲能够获得足够的COVID-19疫苗。
效果还是可以的。
5.封装一键开启服务
如何将python的程序集成到其它语言中?如果一个软件成品还需要客户去安装所有的运行环境,这显然是不太合适的。
所以有两种方式,1.将python程序封装为dll 2.就是web服务 第2种也是本贴使用的
显然 我们实现了web服务,我们如何避免安装繁琐的python运行环境?
这就需要借助pyinstaller这个python的依赖包了,通过它可以将python程序打包成一个exe程序,直接双击即可运行。当然,对于本帖的离线翻译服务,它的打包过程并不是一行简单的命令可以完成。
首先我们需要安装这一依赖包 命令:pip install pyinstaller
然后我们通过代码,查询离线服务需要的所有依赖包:
[Python] 纯文本查看 复制代码
from transformers.dependency_versions_check import pkgs_to_check_at_runtime
print(pkgs_to_check_at_runtime)
新建文件hook-ctypes.macholib.py,将上述查到的依赖包写入,内容如下:
[Asm] 纯文本查看 复制代码 from PyInstaller.utils.hooks import collect_data_files, copy_metadata
datas = copy_metadata('tqdm')
datas += copy_metadata('torch')
datas += copy_metadata('regex')
datas += copy_metadata('sacremoses')
datas += copy_metadata('requests')
datas += copy_metadata('packaging')
datas += copy_metadata('filelock')
datas += copy_metadata('numpy')
datas += copy_metadata('tokenizers')
将hook-ctypes.macholib.py放到我们的服务程序同目录下,在dos输入cd命令进入这一目录后运行命令:
pyinstaller -F yourfile.py --additional-hooks-dir=. (yourfile.py替换成你自己的文件名,别漏下.)
回车,等待打包完成你就获得了一个可以一键开启本服务的exe文件。
|