最近工做過程當中,須要對一批文件進行漢譯英的翻譯,對單個文檔手工複製、粘貼的翻譯方式過於繁瑣,考慮到工做的重複性和本人追求提升效率、少動手(懶),想經過調用已有的接口的方法,本身實現一個批量翻譯工具,一勞永逸。在網上找了幾款翻譯api,經過對比翻譯的結果和學習成本,選擇了有道智雲的服務,本身開發了一個批量翻譯的小軟件。詳細記錄一下使用和開發過程,後面的小夥伴們有相關需求,能夠參考。html
我這裏開發批量文檔翻譯工具使用python做爲開發工具,功能以下:python
1)經過文件夾選擇多個文檔;ios
2)能夠將多個文檔的翻譯結果存到目標文件夾下。git
話很少說,看圖↓↓↓↓↓github
部分翻譯結果展現(涉及工做內容的保密性,這裏用荷塘月色做爲樣例):web
下面開始詳細介紹調用有道智雲API接口的步驟和軟件開發的過程:json
首先,須要註冊我的的開發者帳號。api
在官網點擊註冊,而後填寫我的資料。便可完成註冊,官網地址:http://ai.youdao.com/gw.s數組
註冊成功並登陸後我的中心頁面以下圖,有道智雲提供了天然語言翻譯、文字識別、語音合成、語音測評等服務接口。 這些服務接口都是經過以實例的方式運行的,經過應用進行管理的。須要分別建立實例、建立應用,經過應用獲取應用ID和應用密鑰等信息。網絡
我這裏用到的是天然語言翻譯服務,首先,須要分別建立一個應用、建立一個天然語音翻譯的實例;其次,須要將實例綁定到應用上。最後,就能夠經過應用的應用ID、應用密鑰調用天然語音翻譯api接口了。有道平臺會對不一樣的實例、應用的使用狀況進行記錄、分析、收費。剛剛註冊的體驗者會有免費體驗字數和50元的體驗金哦(加客服貌似還會有額外的50元的)。
建立實例的步驟:
根據使用需求,選擇對應服務(「天然語言翻譯」/「文字識別OCR」/「語音合成TTS」/「語音識別ASR」/「智能語音評測」/「多平臺編輯器」)->「建立實例」,按步驟完成實例建立。
建立應用並綁定實例(應用接口分爲三種:API、安卓、ios接口):
點擊「應用管理」->「個人應用」->「建立應用」,填寫應用名稱等相關信息,選擇接入方式,並綁定咱們所建立的實例,完成應用建立。咱們這裏用到的是API方式接入,安卓、ios接口須要根據提示填寫相應的信息,詳見官網新手指南。
應用建立成功後,可獲取應用ID(appKey)和應用密鑰等信息,這些信息是調用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時,則會出現不一樣含義的錯誤碼。詳細含義可查閱官方開發文檔。
批量翻譯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 osfrom translatetool import connectclass 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)。