再見所有的翻譯工具!我使用了有道智雲+Python開發一個批量文件翻譯工具,老大對我讚不絕口

TrueDei發表於2020-09-10

一、需求分析

需求:

最近有個任務,需要對一批檔案進行漢譯英的翻譯

剛開始想著挺簡單的呀,那就直接複製到翻譯軟體中,在複製出來唄。

有很多辦法可以實現翻譯:

可以使用谷歌翻譯,這個完全免費的。但是不好的地方就是需要一個文件一個文件的進行匯入。我幾百個檔案的話,估計手就要廢掉了。

在這裡插入圖片描述

也可以使用網易有道詞典:

在這裡插入圖片描述

對單個文件手工複製貼上的翻譯方式過於繁瑣考慮到工作的重複性和本人追求提高效率少動手(懶)。

在這裡插入圖片描述

做為計算機行業的一份子,應該充分的利用好,不然技術不就白學了。我就利用的很充分。

在這裡插入圖片描述

我在網上找了幾款翻譯api,通過對比翻譯的結果和學習成本,選擇了**有道智雲的服務**,自己開發了一個批量翻譯的小軟體。詳細記錄一下使用和開發過程,後面的小夥伴們有相關需求,可以參考。

使用Python呼叫已有的介面的方法,自己實現一個批量翻譯工具,一勞永逸。

我計劃著連續更新一個月左右,把詳細的整個過程都記錄下來,也方便粉絲們使用。

二、已做好的批量文件翻譯工具的使用

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

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

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

話不多說,看圖↓↓↓↓↓
在這裡插入圖片描述

部分翻譯結果展示(涉及工作內容的保密性,這裡用荷塘月色作為樣例):

在這裡插入圖片描述

可以先嚐試一下,我上傳到了百度網盤裡:

在這裡插入圖片描述

可以關注我公眾號:回覆:20200910即可拿到資源哦,同時也會同步到GitHub中,連結在文章末尾。

在這裡插入圖片描述

三、開發過程

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

(一)個人開發者賬號註冊

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

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

在這裡插入圖片描述

在這裡插入圖片描述

(二) 建立應用和例項

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

在這裡插入圖片描述

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

建立例項的步驟:

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

在這裡插入圖片描述

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

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

在這裡插入圖片描述

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

(三)介面呼叫及程式碼實現

1、API介面介紹

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

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

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

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

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

欄位名型別含義必填備註
qtext待翻譯文字True必須是UTF-8編碼
fromtext源語言True參考下方 支援語言 (可設定為auto)
totext目標語言True參考下方 支援語言 (可設定為auto)
appKeytext應用IDTrue可在 應用管理 檢視
salttextUUIDTrueUUID
signtext簽名Truesha256(應用ID+input+salt+curtime+應用金鑰)
signTypetext簽名型別Truev3
curtimetext當前UTC時間戳(秒)trueTimeStamp
exttext翻譯結果音訊格式,支援mp3falsemp3
voicetext翻譯結果發音選擇false0為女聲,1為男聲。預設為女聲
stricttext是否嚴格按照指定from和to進行翻譯:true/falsefalse如果為false,則會自動中譯英,英譯中。預設為false

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

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

欄位名型別含義備註
errorCodetext錯誤返回碼一定存在
querytext源語言查詢正確時,一定存在
translationArray翻譯結果查詢正確時,一定存在
basictext詞義基本詞典,查詞時才有
webArray詞義網路釋義,該結果不一定存在
ltext源語言和目標語言一定存在
dicttext詞典deeplink查詢語種為支援語言時,存在
webdicttextwebdeeplink查詢語種為支援語言時,存在
tSpeakUrltext翻譯結果發音地址翻譯成功一定存在,需要應用繫結語音合成例項才能正常播放 否則返回110錯誤碼
speakUrltext源語言發音地址翻譯成功一定存在,需要應用繫結語音合成例項才能正常播放 否則返回110錯誤碼
returnPhraseArray單詞校驗後的結果主要校驗字母大小寫、單詞前含符號、中文簡繁體

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

3、批量文件翻譯開發

批量翻譯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)。

關注我,期待下次更新此係列吧。

在這裡插入圖片描述

相關文章