腾讯云服务 机器翻译 Python 快速上手

声明:本人编程水平说不上优秀,发文章主要是为了记录学到的技术,希望顺便能够提供借鉴给到同样想学习这类型技术的friends。文笔水平一般,且会写得比较简洁,请包涵。本文章不是零基础的,看不懂就自己想办法吧。

腾讯云

腾讯云(Tencent Cloud)是由腾讯公司提供的云计算服务平台。它提供了包括云服务器(云虚拟主机)、云数据库、云存储、云网络、人工智能和物联网等一系列基础设施和服务。腾讯云致力于为个人开发者、中小企业和大型企业提供高性能、可靠、弹性的云服务,帮助用户快速搭建和扩展各种Web应用、企业应用和移动应用。

个人感觉腾讯云这个平台建设的挺好的,也不虚阿里云等其它云服务的平台。这也是我第一次正式使用腾讯云的云服务, 使用体验也是很好,然后之前我用过百度云的翻译的接口,觉得还不错,就想着腾讯云也有免费的翻译额度,于是就试着用一下腾讯云的机器翻译API接口。

机器翻译

机器翻译是一种利用计算机算法和人工智能技术的技术,可以将文本或口语从一种语言翻译成另一种语言。它可以帮助人们在跨语言交流、国际商务、旅行、学习等方面起到重要作用。机器翻译通过分析语法、词汇和语境等方面的信息来转换语言,不断学习和改进以提供更准确的翻译结果。
在日常生活中我也常常遇到一些不懂得英语或者日语得词汇,可能需要进行翻译,需要使用到各种翻译工具对这样得文本进行翻译,于是就想到既然腾讯云有这么一个免费的文本翻译服务,于是就想着去试着用一下,反正可能以后做开发也会使用到这种云服务,第一次就选则这个机器翻译练习一下。

快速上手

对于腾讯云的提供的机器翻译接口,使用起来难度也不大,文档也写得足够详细,就是感觉没有那么容易上手,于是我就整理出这么一篇笔记。

准备

在进行编程实现之前,需要做两部分准备。

第一部分
本地环境的准备,就只是简单地安装一下Python就行,建议选择3.6到3.9的版本就行,我在使用python过程中也是用这些版本比较多一点。另外需要安装一下requests模块,json模块如果没有也需要安装一下。

第二部分
腾讯云网址: https://cloud.tencent.com/
腾讯云账号的注册,在注册完成后,在控制台找到云服务,在云服务里面找到机器翻译,并开通机器翻译服务(需要进行个人认证)。
开通服务之后,再次进入就会是机器翻译控制台的页面,大概长下面图片这个样子。

在这里插入图片描述

点击系统设置可以开启服务,点击资源包可以看到自己的免费文字翻译的额度以及使用情况。
右上角有定价说明和API文档,建议点进去了解一下。
API文档: https://cloud.tencent.com/document/product/551/15612
了解完这个之后还要创建一个子用户,到个人页面/安全设置/用户管理/用户列表, 可以创建用户,需要给用户配置权限, 建议只配置机器翻译的权限就行,之后点击该用户查看API秘钥信息即可,如果没有密钥则创建一个密钥,等下需要复制该密钥对。

快速上手

通过API文档内容的学习,只要耐心一点,像我这样第一次使用腾讯云的都看得懂,建议先参考API文档看一下,并且文档里也有各种语言的案例可以参考,如果单纯像使用一下并且了解一下逻辑的话,看看我下面的介绍可能也行。

由于只有文字翻译的接口是可以限量免费使用的,也是我就只对该接口进行了实现,下面是我的项目的目录,之后也可以参考这个目录进行项目文件的放置。
在这里插入图片描述

调用的逻辑

我们使用HTTP的方式进行访问云服务,通过参考API文档中的介绍以及案例对请求进行设置就行。

此处仅列举一种方式,存在多种方式可以实现。
发送请求http时,设置请求方式为POST,需要设置请求头和请求体。请求头负责携带我们的密钥数据(验证我们调用者的身份),请求体设置为我们想要翻译的内容。

大概如下所示

#请求头信息
 headers = {
	# api_key加密信息
	'Authorization': authorization,
	 # 请求参数格式
	'Content-Type': 'application/json; charset=utf-8',
	# 请求的地址
	'Host': self.host,
	# 文本翻译
	'X-TC-Action': self.action,
	# 版本
	'X-TC-Version': self.version,
	# 时间戳
	'X-TC-Timestamp': str(timestamp),
	# 服务器地
	'X-TC-Region': self.region
}

# 请求体内容
params = {
	# 需要翻译的内容
	"SourceText": text,
	# 当前翻译内容语言
	"Source": from_language,
	# 需要翻译成的语言
	"Target": self.encode_language(to_language),
	# 设置为0就行,(特殊情况:如果自己使用过腾讯云的项目管理功能,可能需要修改)
	"ProjectId": 0
}

这里比较复杂的逻辑是需要生成这个请求头中的Authorization,参考API文档进行实现,涉及一些比较复杂的加密流程,此处就不介绍了,感兴趣可以去看看API文档中签名方法v3的介绍。

响应结果介绍

正常的响应结果

{
	"Response": {
		"RequestId": "000ee211-f19e-4a34-a214-e2bb1122d248",
		"Source": "en",
		"Target": "zh",
		"TargetText": "你好"
	}
}

发生错误的响应结果

{
    "Response": {
        "Error": {
            "Code": "AuthFailure.SignatureFailure",
            "Message": "The provided credentials could not be validated. Please check your signature is correct."
        },
        "RequestId": "ed93f3cb-f35e-473f-b9f3-0d451b8b79c6"
    }
}

完整的代码

properties.py文件

这个文件负责进行配置,需要把自己的密钥配置到这个文件里。
介绍一下这里 language_map 的 是负责配置语言的映射的,我们调用的时候是需要传入想要转换成的语言的。所以参考API文档,如果语言的英文的前两个字母映射对不上,则可能会出错。只用英语、日语、中文的不需要理会这个问题。


# api文档链接
api_word = 'https://cloud.tencent.com/document/product/551'


# 机器翻译url
host = 'tmt.tencentcloudapi.com'
text_service_name = 'TextTranslate'


# ap_keys
api_keys = [('key_id', 'key_secret'), ('你的密钥id', '你的密钥key')]


""""
该类型的接口的调用方式是通过设置请求的公共参数加上每种请求(文本翻译、图片翻译、语音翻译等)
"""

language_map = {
    'english': 'en',
    'chinese': 'zh',
    'japanese': 'ja'
}

text.py文件

这个文件包含调用云服务的主要逻辑,可以阅读一下,看不懂就直接用就行。如果是刚好需要这样的接口的话,那我这个代码就很适配,直接复制之后,调试一下应该没有问题。

创建了一个类进行API的调用,创建对象调用translate方法即可实现翻译API的调用。


import requests
import hashlib, hmac, json, os, sys, time
from datetime import datetime

from Tencent.translate.properties import host, text_service_name, api_keys, language_map


"""
说明:
默认接口请求频率限制:5次/秒。
application/json(推荐),必须使用签名方法 v3(TC3-HMAC-SHA256)。


请求头信息
公共参数(apikey信息等)+请求参数(正常信息)
Authorization: TC3-HMAC-SHA256
Content-Type: application/json
Host: cvm.tencentcloudapi.com
X-TC-Action: DescribeInstances
X-TC-Version: 2017-03-12
X-TC-Timestamp: 1539084154
X-TC-Region: ap-guangzhou


Host 填自己需要访问的接口的域名
X-TC-Action  需要的服务     文本翻译对应  TextTranslate
X-TC-Version 服务版本信息    2018-03-21
X-TC-Timestamp 当前时间戳
X-TC-Region  服务器地区 取值有很多, 建议选择近的    ap-guangzhou

请求体内容:
{
  "SourceText": null,
  "Source": null,
  "Target": null,
  "ProjectId": null,
  "UntranslatedText": null
}
返回结果:
{
	"Response": {
		"RequestId": "000ee211-f19e-4a34-a24-e2bb1122d248",
		"Source": "en",
		"Target": "zh",
		"TargetText": "你好"
	}
}
错误的情况:
{
    "Response": {
        "Error": {
            "Code": "AuthFailure.SignatureFailure",
            "Message": "The provided credentials could not be validated. Please check your signature is correct."
        },
        "RequestId": "ed93f3cb-f35e-473f-b9f3-0d451b8b79c6"
    }
}
"""


class TextTranslator(object):

    def __init__(self):
        # 密钥参数
        api_index = 1
        self.secret_id = api_keys[api_index][0]
        self.secret_key = api_keys[api_index][1]

        self.host = host
        self.region = 'ap-guangzhou'
        self.version = '2018-03-21'
        self.service = "tmt"
        self.action = text_service_name

        pass

    def get_Authorization(self, params, timestamp):

        # 密钥参数
        secret_id = self.secret_id
        secret_key = self.secret_key

        service = self.service
        host = self.host
        endpoint = "https://" + host
        region = self.region
        action = self.action
        version = self.version
        algorithm = "TC3-HMAC-SHA256"
        # 从方法中输入
        # timestamp = timestamp

        date = datetime.utcfromtimestamp(timestamp).strftime("%Y-%m-%d")

        # ************* 步骤 1:拼接规范请求串 *************
        http_request_method = "POST"
        canonical_uri = "/"
        canonical_querystring = ""
        ct = "application/json; charset=utf-8"
        payload = json.dumps(params)
        canonical_headers = "content-type:%s\nhost:%s\nx-tc-action:%s\n" % (ct, host, action.lower())
        signed_headers = "content-type;host;x-tc-action"
        hashed_request_payload = hashlib.sha256(payload.encode("utf-8")).hexdigest()
        canonical_request = (http_request_method + "\n" +
                             canonical_uri + "\n" +
                             canonical_querystring + "\n" +
                             canonical_headers + "\n" +
                             signed_headers + "\n" +
                             hashed_request_payload)
        # print(canonical_request)

        # ************* 步骤 2:拼接待签名字符串 *************
        credential_scope = date + "/" + service + "/" + "tc3_request"
        hashed_canonical_request = hashlib.sha256(canonical_request.encode("utf-8")).hexdigest()
        string_to_sign = (algorithm + "\n" +
                          str(timestamp) + "\n" +
                          credential_scope + "\n" +
                          hashed_canonical_request)
        # print(string_to_sign)

        # ************* 步骤 3:计算签名 *************
        secret_date = self.sign(("TC3" + secret_key).encode("utf-8"), date)
        secret_service = self.sign(secret_date, service)
        secret_signing = self.sign(secret_service, "tc3_request")
        signature = hmac.new(secret_signing, string_to_sign.encode("utf-8"), hashlib.sha256).hexdigest()
        # print(signature)

        # ************* 步骤 4:拼接 Authorization *************
        authorization = (algorithm + " " +
                         "Credential=" + secret_id + "/" + credential_scope + ", " +
                         "SignedHeaders=" + signed_headers + ", " +
                         "Signature=" + signature)
        # print(authorization)

        # print('curl -X POST ' + endpoint
        #       + ' -H "Authorization: ' + authorization + '"'
        #       + ' -H "Content-Type: application/json; charset=utf-8"'
        #       + ' -H "Host: ' + host + '"'
        #       + ' -H "X-TC-Action: ' + action + '"'
        #       + ' -H "X-TC-Timestamp: ' + str(timestamp) + '"'
        #       + ' -H "X-TC-Version: ' + version + '"'
        #       + ' -H "X-TC-Region: ' + region + '"'
        #       + " -d '" + payload + "'")

        return authorization

    def translate(self, text, to_language, from_language="auto"):

        try:
            if from_language != 'auto':
                from_language = self.encode_language(from_language)

            # 请求体
            params = {
                "SourceText": text,
                "Source": from_language,
                "Target": self.encode_language(to_language),
                "ProjectId": 0
                # 不需要携带下面参数
                # "UntranslatedText": None
            }

            # 请求头信息
            # 生成请求时间
            timestamp = int(time.time())
            authorization = self.get_Authorization(params, timestamp)
            headers = {
                # api_key加密信息
                'Authorization': authorization,
                # 请求参数格式
                'Content-Type': 'application/json; charset=utf-8',
                # 请求的地址
                'Host': self.host,
                # 文本翻译
                'X-TC-Action': self.action,
                # 版本
                'X-TC-Version': self.version,
                # 时间戳
                'X-TC-Timestamp': str(timestamp),
                # 服务器地区
                'X-TC-Region': self.region
            }

            # 10秒之内响应否则认为校验失败
            response = requests.post(url='https://'+host, data=json.dumps(params), headers=headers, timeout=10)
            res = json.loads(response.content)['Response']

            # 输出请求体
            # print(res)

            if res.get('Error') is None:
                # 输出翻译内容
                # print(res['Source'])
                # print(res['Target'])
                print(res['TargetText'])
                return res['TargetText']
            else:
                # 打印错误信息
                print(res['Error']['Code'])
                print(res['Error']['Message'])
                return None
        except Exception as e:
            print(e)

    @staticmethod
    def sign(key, msg):
        """
        计算签名摘要函数
        :param msg:
        :return:
        """
        return hmac.new(key, msg.encode("utf-8"), hashlib.sha256).digest()

    @staticmethod
    def encode_language(language: str):
        if language_map.get(language.lower()):
            return language_map[language.lower()]
        else:
            # 没有找到
            print("没有找到语言映射, 可能导致错误")
            return language.lower()[:2]


text_translator = TextTranslator()
if __name__ == '__main__':
    text_translator.translate('你好, 世界!', to_language="English")

    text_translator.translate('成为新世界的神!', to_language="japanese")
    pass


调用测试

导入好包,pycharm配置完运行环境后,再修改完成自己的密钥对之后,就可以直接进行运行了,运行该text.py文件的main方法就可以看到如下结果,需要将其作为组件使用的话,就导入该文件的类或者对象即可。
在这里插入图片描述

报错了怎么办

导入就报错的情况:
最大可能是导包的路径没有对上,可以参考之前我的项目结构进行修改, 自己会修改就自己修改就行,不用按我的来。

发生返回结果错误的情况:

① 检查密钥是否正确配置

② 检查网络是否有问题

③ 学习代码中的逻辑(不难)并查看API文档解决

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值