代码运行时间:2024/07/04
上一篇:【笔记】Python3|(一)用 Python 翻译文本的教程、代码与测试结果(第三方库 translate 和 腾讯 API 篇)
上一篇写完之后反响平平,我还以为没有人看,可能是我标题写的不好。
没想到看到评论区有说要接有道翻译的,咱主打的就是一个有求必应哈!
价格和 API 申请参考:
- 免费翻译接口最新最全汇总(百度翻译,腾讯翻译,谷歌翻译,DeepL翻译等…):了解了大部分免费翻译接口的价格情况以及申请的官方地址。
- 百度、阿里、腾讯、有道各平台翻译API申请教程:图文并茂地了解了翻译接口的具体申请方式。
测试方式:
- 我全写成了
Translator
类,这样就能复用 python 库translate
的测试代码。 - 调用方式一律都是
Translator(from_lang="en",to_lang="zh").translate(sentence)
的形式。 - 性能测试:用的是 Python 的第三方库 Pytest
- 功能测试:主要是针对我自己的翻译需求做的测试,我的翻译需求是翻译目录,我写的处理脚本是分词分句之后逐词逐句翻译,具体翻译了个啥你们可以直接看后文。
本篇为第二篇,包含有道翻译 API 的测评。
文章目录
2 有道 - 100元体验金
2.1 参考
参考:
- 注册并领取有道翻译API体验金:按照官网自带的提示,一路注册就行了。这个很简单,不需要额外参考任何的博客。
- 有道翻译官网-文本翻译文档
API接口免费翻译额度:100元体验金,其中10元是注册,40元是实名认证,50元是添加客服微信;
超出免费额度价格:48元/百万字符,有字符资源包出售,比腾讯便宜十块。不过它有区分常见语种和非常见语种。如果是非常见语种互相翻译的话,价格就会上升至100元/百万字符,另外,专业版的翻译也会上升至60元/百万字符。
官方介绍:有道价格中心
2.2 安装
pip install --upgrade requests
有道翻译根本就没有提供现成的开发 sdk,所以只能通过请求网页去调用,所以集成的时候也得用到 requests。
它的网页 api 文档是有变化的,所以网上找到的代码可能用不了,在比较后面看到我这篇博客的读者可能也用不了我的代码。不过,如果出现这种情况,你们可以直接查看他的官方文档对 api 的介绍,对照着修改就能用了:有道翻译官网-文本翻译文档
2.3 测试代码
测试代码:
# from translate import Translator # pip install translate # 极其拉胯难用,因为有次数限制
from youdao import Translator
####################################################################################################
#---------------------------------------- Translator ---------------------------------------------#
####################################################################################################
def isContainAlpha(str_check):
return str_check.lower() != str_check.upper()
def test_simple_translate():
print(Translator(from_lang="English",to_lang="Chinese").translate('Hello, world!'))
Translator 类定义的代码(没有 sdk 就是麻烦哈,还得写这么一大老长串代码):
import requests
import uuid
import time
from hashlib import sha256
SecretId = ""
SecretKey = ""
# from https://download.ydstatic.com/ead/TranslateDemo-py1.zip
'''
计算鉴权签名 -
计算方式 : sign = sha256(appKey + input(q) + salt + curtime + appSecret)
@param appKey 您的应用ID
@param appSecret 您的应用密钥
@param q 请求内容
@param salt 随机值
@param curtime 当前时间戳(秒)
@return 鉴权签名sign
'''
def calculateSign(appKey, appSecret, q, salt, curtime):
strSrc = appKey + getInput(q) + salt + curtime + appSecret
return encrypt(strSrc)
def encrypt(strSrc):
hash_algorithm = sha256()
hash_algorithm.update(strSrc.encode('utf-8'))
return hash_algorithm.hexdigest()
def getInput(input):
if input is None:
return input
inputLen = len(input)
return input if inputLen <= 20 else input[0:10] + str(inputLen) + input[inputLen - 10:inputLen]
class Translator:
def __init__(self, from_lang, to_lang):
self.from_lang = from_lang
self.to_lang = to_lang
def translate(self, text):
try:
url = 'https://openapi.youdao.com/api'
curtime = str(int(time.time()))
uuid_str = uuid.uuid4().hex
# 强制将 text 转为 utf-8 编码
text = text.encode("utf-8").decode("utf-8")
data = {
"q": text, # 待翻译的字符串
"from": self.from_lang, # 源语言
"to": self.to_lang, # 目标语言
"appKey": SecretId, # 应用id
"salt": uuid_str, # 随机字符串
"sign": calculateSign(SecretId, SecretKey, text, uuid_str, curtime), # 签名
"signType": "v3", # 签名类型
"curtime": curtime # 当前时间戳
}
res = requests.post(url, data=data).json()
return res['translation'][0]
except Exception as e:
# 频率过快会返回 411 错误码
if res.get('errorCode') == '411':
# 休眠 0.5 秒后重试
time.sleep(0.5)
return self.translate(text)
return f"{text}(翻译出错错误码是{res.get('errorCode')})"
if __name__ == '__main__':
translator = Translator(from_lang="en", to_lang="zh")
print(translator.translate("Hello, world!"))
2.4 测试效果
2.4.1 性能测试:效果很好,响应飞快!
输出打印时间:0.18s
这时间这么少,主要是因为我的网速变得更快了。我搭了有线网。实际速度应该和腾讯那个差不多吧。
2.4.2 功能测试:大部分计算机专有的词汇处理得还行,少数受上下文影响有问题
比如下图的 fixtures 单独出现没问题,和 test 放一起出现就被误翻译成“夹具”了,不过其他的常见词汇翻译挺好的,比腾讯那个效果好。
2.4.2 API 使用情况:挺快,但有坑
我只不过是想翻译一个文档,就触发了 411:访问频率受限,请稍后访问
难道网速快也是一种错?
我不得已在代码里面加了一个重启的机制,然后我个人因此觉得这个翻译真的非常的久。尤其是我还特地设置了就是某一些字符不翻译,就是大大减少它的翻译次数,还翻译的这么慢,我的耐心都没了。
- 翻译次数:我翻译的文档是 548 行的目录文件,由于我加了一些筛选词,所以平均一行只翻译了 1~2 次。和后台的请求次数 653 是能对得上的。所以它应该是没有把返回了441这种请求算作请求次数的,还算良心。其中有大概50次是我随便试的,并不是在功能测试里面的,所以总共的请求数大概在600次。
- 文本翻译字符数:我翻译的文档是 26865 字符数的目录文件,输出的结果是 17752 个字符的文件,不过我写的脚本对一些符号做了去除的处理,所以实际参与翻译的字符没那么多,像制表符之类的,都没有参与翻译。可以看到,它应该也是没有把翻译的结果阴险地加到字符数里面的,和腾讯差不多。
只是有一点我有一点想吐槽的是,他推出的这个体验金模式,就没有腾讯那个聪明。我仅仅是翻译一篇500多行的目录,就要收我将近一块钱,我明明白白的能看到钱花在哪儿了,这让我感到贵。腾讯那个就是花的不那么明白,就没什么感觉。
而且它并没有每个月免费的模式,它只有一个注册体验金,所以平时使用翻译的时候,我也不会敢用他的翻译。因为稍微不注意,就会超出我这个账号的额度,以后,就再也用不了了。所以以后在使用翻译的时候,如果甲方没有特定的需求的话,我应该不会考虑有道翻译 API。
后续其他篇目敬请期待,若有更新会在本文结尾附上链接。
上一篇:【笔记】Python3|(一)用 Python 翻译文本的教程、代码与测试结果(第三方库 translate 和 腾讯 API 篇)
本账号所有文章均为原创,欢迎转载,请注明文章出处:https://blog.csdn.net/qq_46106285/article/details/140190895。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。