python调用百度通用翻译API

文章目录

  • 1. 简介
  • 2. 使用步骤
  • 3. api调用实现
  • 4. 编码实现
  • 1. 简介

    前段时间在做视频语音识别生成多语种字幕时,使用了百度翻译通用翻译api进行翻译。百度翻译平台经过个人认证之后,每月有200万字符的免费翻译额度。还是比较舒服的。

    百度翻译开放平台是百度翻译面向广大开发者提供开放服务的平台。服务涵盖:通用翻译API、定制化翻译API、语音翻译SDK、拍照翻译SDK等。百度翻译平台地址

    百度通用翻译API支持28种语言实时互译,覆盖中、英、日、韩、西、法、泰、阿、俄、葡、德、意、荷、芬、丹等;同时支持28种语言的语言检测。

    2. 使用步骤

    如果你是初次使用百度翻译开放平台,你需要先注册一个百度账号。登录成功之后,点击产品服务,进入到通用翻译api界面。点击底部立即使用,经过认证之后就可以使用了。个人能够申请标准版和高级版认证(推荐,支持并发数高)。

    认证完整之后,你就能获取到对应的appidsecret密钥,这些在调用api的时候需要使用。

    3. api调用实现

    可以通过以上网址查看通用翻译的API文档。api文档.我这里只展示几个重要的内容。

  • API调用网址https://fanyi-api.baidu.com/api/trans/vip/translate

  • api调用参数

  • 签名生成方法:签名对应api参数中的sign。

  • api支持get和post请求,但我推荐使用post请求,因为get请求存在url长度限制(服务器或浏览器限制),需要翻译的文本过长使用get请求就会出错,而post请求就没有这个限制。

  • api返回结果值

  • 4. 编码实现

    基类,定义规范,后期可以定义其他平台的翻译实现类

    # encoding:utf-8
    __author__ = 'ObsessedCE'
    
    from abc import ABC, abstractmethod
    
    
    class Translation(ABC):
    
        @abstractmethod
        def translation(self, text,  src_language = "auto", des_language = "zh"):
            pass
    

    具体实现类,具体实现调用百度通用翻译api的类

    #coding=utf-8
    __author__ = 'ObsessedCE'
    import requests
    import file_util
    import sys
    import hashlib
    import random
    import string
    import translation
    
    class BAIDUTranslation(translation.ABC):
    
        def __init__(self, profile):
            self.appid = profile.get("baidu_app_id")
            self.secret = profile.get("baidu_secret")
            self.url = profile.get("baidu_translation_url")
            self.session = requests.Session()
            self.session.trust_env = False
    
        def translation(self, text,  src_language = "auto", des_language = "zh"):
            header = {
                "content-type":"application/x-www-form-urlencoded"
            }
            data = {
                "q" : text,
                "from" : src_language,
                "to" : des_language,
                "appid":self.appid,
                "salt":"",
                "sign":""
            }
    
            if not text:
                print("Unspecified content")
                return None
            salt = BAIDUTranslation.generate_random_string(6)
            data["salt"] = salt
            data["sign"] = self.generate_sign(data)
    
            try:
                response = self.session.post(url= self.url, data = data, headers = header)
                if response.status_code != 200:
                    print(f"调用百度翻译出错,状态码为: {str(response.status_code)}")
                    return None
                response_data = response.json()
                if response_data.get("code") and response_data.get("code" )!= 52000:
                    print(f"调用百度翻译出错,返回错误代码为: {response_data.get('code')}")
                    return None
                translation_result = list()
                trans_result = response_data.get("trans_result")
                for result in trans_result:
                    src = result.get("src")
                    des = result.get("dst")
                    translation_result.append(des)
                return translation_result
            except Exception as e:
                print(f"调用翻译请求时出现错误: {e}")
    
    
    
        def generate_sign(self, data):
            """
            生成签名
            :param data:
            :return:
            """
            str = data.get("appid")
            str += data.get("q")
            str += data.get("salt")
            str += self.secret
            return  self.generate_md5(str)
    
        def generate_md5(self, content):
            """
            进行内容md5加密,发挥全小写的编码
            :param content:
            :return:
            """
            if content:
                md5_hash = hashlib.md5()
                md5_hash.update(content.encode("utf-8"))
                return md5_hash.hexdigest().lower()
    
        @staticmethod
        def generate_random_string(length=6):
            # 可用字符:大写字母、小写字母和数字
            chars = string.ascii_letters + string.digits
            # 随机选择字符并生成指定长度的字符串
            return ''.join(random.choices(chars, k=length))
    
    
    if __name__ == "__main__":
        profile = file_util.read_file("./profile.yml")
        if not profile:
            print("no profile")
            sys.exit(0)
        baidu_transltion = BAIDUTranslation(profile)
        text = "You look so handsome today\nI think so, too"
        print(baidu_transltion.translation(text, ))
    
    

    文件辅助类,读取配置文件

    # encoding:utf-8
    __author__ = 'ObsessedCE'
    import yaml
    import sys
    
    def read_file(file_path):
        try:
            with  open(file_path, "r", encoding="utf-8") as file:
                data = yaml.safe_load(file)
                return data
        except Exception as e:
            print(e)
            sys.exit(0)
    

    配置文件定义格式,文件类型为yml,定义个人appid和密钥

    baidu_app_id: "个人信息查看"
    baidu_secret: "个人信息中查看"
    baidu_translation_url: "https://fanyi-api.baidu.com/api/trans/vip/translate"
    

    最后看一下调用效果.

    作者:无限码力

    物联沃分享整理
    物联沃-IOTWORD物联网 » python调用百度通用翻译API

    发表回复