|
- # -*- coding: utf-8 -*-
- # filename: translator.py
- from langauage_choice.language_analysis import Analysis
- import json
- import requests
- import random
- from hashlib import md5
- from bs4 import BeautifulSoup
-
- class TranslateInterface(object):
- def __init__(self, config_dict={}):
- self.transUrl = config_dict.get("transUrl", "")
- self.support_languages = config_dict.get("supportLang", [])
- self.transHeaders = config_dict.get("transHeaders", "")
- if self.transUrl == "":
- self.transUrl = "http://192.168.202.130:8885/predict"
- if self.transHeaders == "":
- self.transHeaders = {"Content-Type": "application/json"}
- self.analyzer = Analysis(config_dict)
- self.appid = '20230321001608584'
- self.appkey = 'mZTTqYFkN7wd1dGEYM4W'
-
- def make_md5(self, s, encoding='utf-8'):
- return md5(s.encode(encoding)).hexdigest()
-
- # 解析文本并调用翻译接口
- def translate(self, text, voice_flag=False):
- """
- ana_dict 中可能键值有
- prompt : -1 没有匹配到prompt,其余值代表匹配的prompt编号
- src_name: 文本中被认为是语种信息的片段。
- src_lang: 源语言的缩写。en表示英语
- tgt_name: 和src_name类型
- tgt_lang: 目标语言的缩写
- input: 需要翻译的文本(截取掉源语言和目标语言后的翻译片段)
- raw_text: 送到服务器的完整内容
- voice_flag: 当前内容是否是一条语音信息
- trans_res: 调用翻译接口的翻译结果
- trans_code: 是否翻译成功,取值True和False
- trans_wrong_reason: 翻译失败的原因(配置文件不全)
- baidu_detect_service: 是否调用百度的接口获取语种信息
- """
- ana_dict = self.analyzer.match(text) #
- ana_dict["raw_text"] = text # 记录原始的文本
- ana_dict["voice_flag"] = voice_flag
- print(ana_dict)
- print("使用以上信息调用翻译接口")
- # 针对没有匹配到prompt模板的信息进行处理
- if ana_dict["prompt"] == -1 and not voice_flag:
- src_lang = ana_dict["src_lang"]
- if src_lang == "zh": # 源语言是中文则默认翻译到英文
- ana_dict["tgt_lang"] = "en"
- ana_dict["tgt_name"] = "英语"
- elif src_lang != "": # 源语言是其他语言则默认翻译到中文
- ana_dict["tgt_lang"] = "zh"
- ana_dict["tgt_name"] = "中文"
- else: # 既没有匹配到promt,也没有识别到源语言
- ana_dict["trans_res"] = "抱歉,您的需求我们暂时没有理解呢~我们是一个多语言翻译平台。您可以这样对我说\n'翻译今天是周五到老挝语'"
- ana_dict["trans_code"] = False
- return ana_dict
-
- elif ana_dict["prompt"] == -1 and voice_flag:
- print("语音识别有问题")
- ana_dict["trans_res"] = "您的语音信息暂时不支持翻译,我们识别到您的语音为\n\"{}\"".format(text)
- ana_dict["trans_code"] = False
- return ana_dict
-
- # 目前只针对外到中和中到外的翻译,其他语种不支持
- elif "zh" not in ana_dict["tgt_lang"] and "zh" not in ana_dict["src_lang"]:
- ana_dict["trans_code"] = False
- ana_dict["trans_res"] = "我们的系统暂时只支持中->外/外->中,您的翻译请求{}->{}暂时不支持,请修改~".format(ana_dict["src_name"], ana_dict["tgt_name"])
- return ana_dict
- # if ana_dict == {} and not voice_flag:
- # # src_lang = "auto"
- # src_lang= "zh"
- # tgt_lang = "en"
- # tran_text = text
- # print("默认一下")
- # # # return "你要翻译的内容我们暂时无法支持哦~请耐心等待我们后续的更新!~\n请试试这样说'翻译今天天气很好到英文'"
- # elif ana_dict == {} and voice_flag:
- # return "您的语音信息暂时不支持翻译,我们识别到您的语音为\"{}\"".format(text)
-
- if ana_dict != {}:
- src_lang, tgt_lang, tran_text = ana_dict["src_lang"], ana_dict["tgt_lang"], ana_dict["input"]
- # print(src_lang, tgt_lang, tran_text)
- # 无法翻译的语言
- # print(self.support_languages)
- if tgt_lang not in self.support_languages:
- ana_dict["trans_res"] = "你要翻译的语种: {} 我们暂时不支持哦~敬请耐心等待我们后续的更新!~\n".format(ana_dict["tgt_name"])
- ana_dict["trans_code"] = False
- return ana_dict
-
- # inter_text = f'src_lang: {src_lang}\ntgt_lang: {tgt_lang}\ninput: {tran_text}'
-
- # 针对百度接口的翻译调用
- if "baidu" in self.transUrl:
- salt = random.randint(32768, 65536)
- sign = self.make_md5(self.appid+tran_text+str(salt)+self.appkey)
- payload = {'appid': self.appid, 'q': tran_text, 'from': src_lang, 'to': tgt_lang, 'salt': salt, 'sign': sign}
- try:
- response = requests.post(self.transUrl, headers=self.transHeaders, params=payload) # 百度
- result = response.json()
- print(json.dumps(result, indent=4, ensure_ascii=False)) # 百度
- trans_res = result["trans_result"][0]["dst"] # 百度
- # 将返回内容记录到ana_dict 中,方便日志记录
- ana_dict["trans_code"] = True
- ana_dict["trans_res"] = trans_res
- except Exception as Argment:
- trans_res = "调用翻译接口出错,请联系客服排查问题!"
- ana_dict["trans_code"] = False
- #
- # return trans_res
- # 针对丝路接口的报文信息
- elif "pcl" in self.transUrl:
- src_lang_id = self.support_languages.index(src_lang) + 1
- tgt_lang_id = self.support_languages.index(tgt_lang) + 1
- data = {'source': src_lang_id, 'target': tgt_lang_id, 'raw_text': tran_text}
- print("=======翻译接口调用情况如下!!!========")
-
- print(data)
- try:
- # response = requests.post(self.transUrl, headers=self.transHeaders, params=payload) # 百度
- response = requests.post(self.transUrl, headers=self.transHeaders, data=data) # 丝路
- # print("=======翻译接口调用情况如下!!!========")
- # print(data)
- soup = BeautifulSoup(response.content)
- trans_res = soup.find('div', id='outputtext').find('div').get_text().strip()
- ana_dict["trans_code"] = True
- ana_dict["trans_res"] = trans_res
- print(trans_res)
- except Exception as Argment:
- trans_res = "调用翻译接口出错,请联系客服排查问题!"
- ana_dict["trans_code"] = False
- # return trans_res
- else: # 接口出错
- ana_dict["trans_code"] = False
- ana_dict["trans_wrong_reason"] = "配置文件中没有翻译接口url,请检查配置文件"
- # return "翻译接口好像出错了呢!请联系我们客服为您解决~"
- # if voice_flag:
- # ana_dict["voice_flag"]
- # trans_res = "你的语音识别结果为:\n"+tran_text+"\n"+"翻译结果为:\n"+trans_res
- # return trans_res
- if voice_flag:
- trans_ori = ana_dict["input"]
- trans_res = ana_dict["trans_res"]
- trans_res = "你的语音识别结果为:\n"+trans_ori+"\n"+"翻译结果为:\n"+trans_res
- ana_dict["trans_res"] = trans_res
- print("翻译接口最终返回的列表为:")
- print(ana_dict)
- return ana_dict
|