0%

使用OpenNMT-py训练翻译模型

本来这篇是准备写内网漫游来着,因为今天花了半天时间从某网站子域名提权到了 root 权限,想进一步深入的时候突然有了做实时翻译软件(语言识别、声音转文字、机器翻译、声纹识别)的想法(开始的渗透过程还是蛮有意思的,到内网之后,各种数据都能访问到反而提不起什么兴趣了),随后就把漏洞反馈给了网站的工作人员(整个渗透过程没有读取改动任何数据,Kali 也已回滚),回到正题,我们使用 OpenNMT-py 来训练翻译模型。

环境安装

1
2
3
# https://pytorch.org/get-started/locally/
conda install pytorch torchvision cudatoolkit=10.1 -c pytorch
# https://github.com/OpenNMT/OpenNMT-py

数据准备

官方提供的示例数据为英语 - 德语,所以我们要构建自己的训练数据,准备先训练翻译,如果效果好的话再训练语音转文字。

从网上找到了相关的中英文的数据。下载地址如下:https://drive.google.com/uc?id=1EX8eE5YWBxCaohBO8Fh4e2j3b9C2bTVQ ,但数据格式要转换一下,可以参考这个脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import json

lines = []
en_lines = []
cn_lines = []
with open('translation2019zh_train.json' , 'r', encoding='UTF-8') as r:
lines = r.readlines()

for line in lines[0: 10000]:
jf = json.loads(line)
en_lines.append(jf['english'] + '\n')
cn_lines.append(jf['chinese'] + '\n')

with open('src-train.txt' , 'w', encoding='UTF-8') as w:
w.writelines(en_lines)
with open('tgt-train.txt' , 'w', encoding='UTF-8') as w:
w.writelines(cn_lines)

训练模型

1
2
# 预处理
onmt_preprocess -train_src data/src-train.txt -train_tgt data/tgt-train.txt -valid_src data/src-val.txt -valid_tgt data/tgt-val.txt -save_data data/demo
1
2
3
# 训练
onmt_train -data data/demo -save_model demo-model -gpu_ranks 0
# 默认配置实测使用 2080Ti 训练 1W 条数据都要一个小时左右,9900K估计还要*10倍才行。。

翻译验证

1
onmt_translate -model demo-model_step_100000.pt -src data/src-test.txt -output data/pred.txt -replace_unk -verbose

然而翻译这一步的结果并不理想,训练数据太少而且质量不是很高(质量最高的我想应该是电影的双语字幕),最主要的是训练时间长啊..还是使用Google Speech-to-Text吧。