分享一次批量文件翻譯的開發過程

Al發表於2020-09-10

分享一次批量文件翻譯的開發過程

最近工作過程中,需要對一批檔案進行漢譯英的翻譯,對單個文件手工複製、貼上的翻譯方式過於繁瑣,考慮到工作的重複性和本人追求提高效率、少動手(懶),想通過呼叫已有的介面的方法,自己實現一個批量翻譯工具,一勞永逸。在網上找了幾款翻譯api,通過對比翻譯的結果和學習成本,選擇了有道智雲的服務,自己開發了一個批量翻譯的小軟體。詳細記錄一下使用和開發過程,後面的小夥伴們有相關需求,可以參考。

批量文件翻譯工具的使用

我這裡開發批量文件翻譯工具使用python作為開發工具,功能如下:

     1)通過資料夾選擇多個文件;

     2)可以將多個文件的翻譯結果存到目標資料夾下。

話不多說,看圖↓↓↓↓↓

分享一次批量文件翻譯的開發過程部分翻譯結果展示(涉及工作內容的保密性,這裡用荷塘月色作為樣例):

開發過程

下面開始詳細介紹呼叫有道智雲API介面的步驟和軟體開發的過程:

1、個人開發者賬號註冊

首先,需要註冊個人的開發者賬號。

在官網點選註冊,然後填寫個人資料。即可完成註冊,官網地址:http://ai.youdao.com/gw.s

2、 建立應用和例項

註冊成功並登入後個人中心頁面如下圖,有道智雲提供了自然語言翻譯、文字識別、語音合成、語音測評等服務介面。 這些服務介面都是通過以例項的方式執行的,通過應用進行管理的。需要分別建立例項、建立應用,通過應用獲取應用ID和應用金鑰等資訊。

我這裡用到的是自然語言翻譯服務,首先,需要分別建立一個應用、建立一個自然語音翻譯的例項;其次,需要將例項繫結到應用上。最後,就可以通過應用的應用ID、應用金鑰呼叫自然語音翻譯api介面了。有道平臺會對不同的例項、應用的使用情況進行記錄、分析、收費。剛剛註冊的體驗者會有免費體驗字數和50元的體驗金哦(加客服貌似還會有額外的50元的)。

建立例項的步驟:

根據使用需求,選擇對應服務(“自然語言翻譯”/“文字識別OCR”/“語音合成TTS”/“語音識別ASR”/“智慧語音評測”/“多平臺編輯器”)->“建立例項”,按步驟完成例項建立。

建立應用並繫結例項(應用介面分為三種:API、安卓、ios介面):

點選“應用管理”->“我的應用”->“建立應用”,填寫應用名稱等相關資訊,選擇接入方式,並繫結我們所建立的例項,完成應用建立。我們這裡用到的是API方式接入,安卓、ios介面需要根據提示填寫相應的資訊,詳見官網新手指南

應用建立成功後,可獲取應用ID(appKey)和應用金鑰等資訊,這些資訊是呼叫API介面必不可少的引數。

3、介面呼叫及程式碼實現

1)API介面介紹

下面介紹API介面的呼叫方法

文字翻譯API HTTPS地址:https://openapi.youdao.com/api

呼叫規則:在呼叫整合文字翻譯API時,需遵循以下規則。

規則 描述
傳輸方式 HTTPS
請求方式 GET/POST
字元編碼 統一使用UTF-8 編碼
請求格式 表單
響應格式 JSON

呼叫傳參:呼叫API需要向介面傳送以下欄位來訪問服務。

欄位名 型別 含義 必填 備註
q text 待翻譯文字 True 必須是UTF-8編碼
from text 源語言 True 參考下方 支援語言 (可設定為auto)
to text 目標語言 True 參考下方 支援語言 (可設定為auto)
appKey text 應用ID True 可在 應用管理 檢視
salt text UUID True UUID
sign text 簽名 True sha256(應用ID+input+salt+curtime+應用金鑰)
signType text 簽名型別 True v3
curtime text 當前UTC時間戳(秒) true TimeStamp
ext text 翻譯結果音訊格式,支援mp3 false mp3
voice text 翻譯結果發音選擇 false 0為女聲,1為男聲。預設為女聲
strict text 是否嚴格按照指定from和to進行翻譯:true/false false 如果為false,則會自動中譯英,英譯中。預設為false

簽名生成方法如下:
signType=v3;
sign=sha256(應用ID+input+salt+curtime+應用金鑰);
其中,input的計算方式為:input=q前10個字元 + q長度 + q後10個字元(當q長度大於20)或 input=q字串(當q長度小於等於20);

返回結果格式:返回的結果是json格式,具體說明如下:

欄位名 型別 含義 備註
errorCode text 錯誤返回碼 一定存在
query text 源語言 查詢正確時,一定存在
translation Array 翻譯結果 查詢正確時,一定存在
basic text 詞義 基本詞典,查詞時才有
web Array 詞義 網路釋義,該結果不一定存在
l text 源語言和目標語言 一定存在
dict text 詞典deeplink 查詢語種為支援語言時,存在
webdict text webdeeplink 查詢語種為支援語言時,存在
tSpeakUrl text 翻譯結果發音地址 翻譯成功一定存在,需要應用繫結語音合成例項才能正常播放 否則返回110錯誤碼
speakUrl text 源語言發音地址 翻譯成功一定存在,需要應用繫結語音合成例項才能正常播放 否則返回110錯誤碼
returnPhrase Array 單詞校驗後的結果 主要校驗字母大小寫、單詞前含符號、中文簡繁體

當返回的結果errorCode為 0 時說明呼叫成功,不為0時,則會出現不同含義的錯誤碼。詳細含義可查閱官方開發文件

2)批量文件翻譯開發

批量翻譯demo使用python3實現,為了方便測試,我用tkinter做了簡單的介面,用來讀取待翻譯文件,指定結果儲存路徑,為了最大化簡化開發過程,降低測試的時間成本,目前只實現了讀取.txt型別檔案的方法。

整個demo分為三個檔案,mainwindow.py,translate.py和translatetool.py,mainwindow為UI部分的程式碼,translate中實現了批量讀取文件並翻譯儲存的邏輯,translatetool為根據示例程式碼改造後的翻譯方法,需呼叫其他平臺API時,亦可封裝相應方法,增加了專案的擴充套件性。

mainwindow的元素如下:

root=tk.Tk()
root.title("netease youdao translation test")
frm = tk.Frame(root)
frm.grid(padx='50', pady='50')
btn_get_file = tk.Button(frm, text='選擇待翻譯檔案', command=get_files)
btn_get_file.grid(row=0, column=0, ipadx='3', ipady='3', padx='10', pady='20')
text1 = tk.Text(frm, width='40', height='10')
text1.grid(row=0, column=1)
btn_get_result_path=tk.Button(frm,text='選擇翻譯結果路徑',command=set_result_path)
btn_get_result_path.grid(row=1,column=0)
text2=tk.Text(frm,width='40', height='2')
text2.grid(row=1,column=1)
btn_sure=tk.Button(frm,text="翻譯",command=translate_files)
btn_sure.grid(row=2,column=1)

其中translate_files()方法最終呼叫了translate類的translate_files()方法:

def translate_files():
    if translate.file_paths:
        translate.translate_files()
        tk.messagebox.showinfo("提示","搞定")
    else :
        tk.messagebox.showinfo("提示","無檔案")

類translate定義如下:

import  os
from translatetool import connect

class Translate():
    def __init__(self,name,file_paths,result_root_path,trans_type):
        self.name=name
        self.file_paths=file_paths							# 待翻譯檔案路徑
        self.result_root_path=result_root_path				# 翻譯結果儲存路徑
        self.trans_type=trans_type
        
    # 翻譯過程:讀取檔案-掉用有道api-解析返回資訊-儲存
    def translate_files(self):
        for file_path in self.file_paths:
            file_name=os.path.basename(file_path)
            file_content=open(file_path,encoding='utf-8').read()
            trans_reult=self.translate_use_netease(file_content)
            resul_file=open(self.result_root_path+'/result_'+file_name,'w').write(trans_reult)
    def translate_use_netease(self,file_content):
        result=','.join(connect(file_content,'zh-CH','EN'))	 # 翻譯API返回結果為一個陣列
        return result

呼叫有道API主要方法為connect(),根據API的簽名資訊等要求組成data併傳送請求,解析返回的json:

# input輸入待翻譯欄位,fromlanguage待翻譯的語言,tolanguage翻譯成的目標語言
# 返回翻譯的欄位
def connect(inputtext,fromlanguage,tolanguage):
    q=inputtext
    data = {}
    data['from'] = fromlang
    data['to'] = tolang
    data['signType'] = 'v3'
    curtime = str(int(time.time()))
    data['curtime'] = curtime
    salt = str(uuid.uuid1())
    signStr = APP_KEY + truncate(q) + salt + curtime + APP_SECRET
    sign = encrypt(signStr)
    data['appKey'] = APP_KEY
    data['q'] = q
    data['salt'] = salt
    data['sign'] = sign
    print(data)
    response = do_request(data)
    print(response.content)
    j = json.loads(str(response.content, encoding="utf-8"))["translation"]
    return j


完整demo程式碼地址:https://github.com/LemonQH/BatchFileTraslationProgram/tree/master

得益於API的學習成本之低,介面呼叫部分的開發過程十分順利,僅有一個小插曲,最開始呼叫API總是返回錯誤碼206(即時間戳錯誤),最後發現是我的系統時間比標準時間慢了十分鐘 - - #

總結

對於我此次的需要翻譯的文件需求來說,有道智雲贈送的字數和賬戶額度,已經夠用了,但是如果想長期的使用下去,還是要付費的。最後發現,有道智雲在個人主頁中還提供了按小時統計當日例項呼叫次數和查詢字元數和按天統計歷史天數內例項的呼叫次數和字元數,對有需求的小夥伴,還可以記錄檢視自己介面的翻譯量、實時呼叫量等狀態。

如上是我整個demo的開發過程。整體來說從註冊到呼叫有道智雲API的過程還是比較順利的,而且每一步都有官方的詳細文件可以參照。以至於主要開發時間都分配給了tkinter排版(順便吐槽下tkinter的“好用” :p)。

相關文章