python調(diào)用有道智云API實(shí)現(xiàn)文件批量翻譯
最近工作過程中,需要對(duì)一批文件進(jìn)行漢譯英的翻譯,對(duì)單個(gè)文檔手工復(fù)制、粘貼的翻譯方式過于繁瑣,考慮到工作的重復(fù)性和本人追求提高效率、少動(dòng)手(懶),想通過調(diào)用已有的接口的方法,自己實(shí)現(xiàn)一個(gè)批量翻譯工具,一勞永逸。在網(wǎng)上找了幾款翻譯API,通過對(duì)比翻譯的結(jié)果和學(xué)習(xí)成本,選擇了有道智云的服務(wù),自己開發(fā)了一個(gè)批量翻譯的小軟件。詳細(xì)記錄一下使用和開發(fā)過程,后面的小伙伴們有相關(guān)需求,可以參考。
批量文檔翻譯工具的使用
我這里開發(fā)批量文檔翻譯工具使用python作為開發(fā)工具,功能如下:
1)通過文件夾選擇多個(gè)文檔;
2)可以將多個(gè)文檔的翻譯結(jié)果存到目標(biāo)文件夾下。
話不多說,看圖↓↓↓↓↓
部分翻譯結(jié)果展示(涉及工作內(nèi)容的保密性,這里用荷塘月色作為樣例):
開發(fā)過程
下面開始詳細(xì)介紹調(diào)用有道智云API接口的步驟和軟件開發(fā)的過程:
1、個(gè)人開發(fā)者賬號(hào)注冊(cè)
首先,需要注冊(cè)個(gè)人的開發(fā)者賬號(hào)。
在官網(wǎng)點(diǎn)擊注冊(cè),然后填寫個(gè)人資料。即可完成注冊(cè),官網(wǎng)地址:http://ai.youdao.com/gw.s#/
2、 創(chuàng)建應(yīng)用和實(shí)例
注冊(cè)成功并登錄后個(gè)人中心頁面如下圖,有道智云提供了自然語言翻譯、文字識(shí)別、語音合成、語音測(cè)評(píng)等服務(wù)接口。 這些服務(wù)接口都是通過以實(shí)例的方式運(yùn)行的,通過應(yīng)用進(jìn)行管理的。需要分別創(chuàng)建實(shí)例、創(chuàng)建應(yīng)用,通過應(yīng)用獲取應(yīng)用ID和應(yīng)用密鑰等信息。
我這里用到的是自然語言翻譯服務(wù),首先,需要分別創(chuàng)建一個(gè)應(yīng)用、創(chuàng)建一個(gè)自然語音翻譯的實(shí)例;其次,需要將實(shí)例綁定到應(yīng)用上。最后,就可以通過應(yīng)用的應(yīng)用ID、應(yīng)用密鑰調(diào)用自然語音翻譯api接口了。有道平臺(tái)會(huì)對(duì)不同的實(shí)例、應(yīng)用的使用情況進(jìn)行記錄、分析、收費(fèi)。剛剛注冊(cè)的體驗(yàn)者會(huì)有免費(fèi)體驗(yàn)字?jǐn)?shù)和50元的體驗(yàn)金哦(加客服貌似還會(huì)有額外的50元的)。
創(chuàng)建實(shí)例的步驟:
根據(jù)使用需求,選擇對(duì)應(yīng)服務(wù)(“自然語言翻譯”/“文字識(shí)別OCR”/“語音合成TTS”/“語音識(shí)別ASR”/“智能語音評(píng)測(cè)”/“多平臺(tái)編輯器”)->“創(chuàng)建實(shí)例”,按步驟完成實(shí)例創(chuàng)建。
創(chuàng)建應(yīng)用并綁定實(shí)例(應(yīng)用接口分為三種:API、安卓、ios接口):
點(diǎn)擊“應(yīng)用管理”->“我的應(yīng)用”->“創(chuàng)建應(yīng)用”,填寫應(yīng)用名稱等相關(guān)信息,選擇接入方式,并綁定我們所創(chuàng)建的實(shí)例,完成應(yīng)用創(chuàng)建。我們這里用到的是API方式接入,安卓、ios接口需要根據(jù)提示填寫相應(yīng)的信息,詳見官網(wǎng)新手指南。
應(yīng)用創(chuàng)建成功后,可獲取應(yīng)用ID(appKey)和應(yīng)用密鑰等信息,這些信息是調(diào)用API接口必不可少的參數(shù)。
3、接口調(diào)用及代碼實(shí)現(xiàn)
1)API接口介紹
下面介紹API接口的調(diào)用方法
文本翻譯API HTTPS地址:https://openapi.youdao.com/api
調(diào)用規(guī)則:在調(diào)用集成文本翻譯API時(shí),需遵循以下規(guī)則。
規(guī)則 | 描述 |
---|---|
傳輸方式 | HTTPS |
請(qǐng)求方式 | GET/POST |
字符編碼 | 統(tǒng)一使用UTF-8 編碼 |
請(qǐng)求格式 | 表單 |
響應(yīng)格式 | JSON |
調(diào)用傳參:調(diào)用API需要向接口發(fā)送以下字段來訪問服務(wù)。
字段名 | 類型 | 含義 | 必填 | 備注 |
---|---|---|---|---|
q | text | 待翻譯文本 | True | 必須是UTF-8編碼 |
from | text | 源語言 | True | 參考下方 支持語言 (可設(shè)置為auto) |
to | text | 目標(biāo)語言 | True | 參考下方 支持語言 (可設(shè)置為auto) |
appKey | text | 應(yīng)用ID | True | 可在 應(yīng)用管理 查看 |
salt | text | UUID | True | UUID |
sign | text | 簽名 | True | sha256(應(yīng)用ID+input+salt+curtime+應(yīng)用密鑰) |
signType | text | 簽名類型 | True | v3 |
curtime | text | 當(dāng)前UTC時(shí)間戳(秒) | true | TimeStamp |
ext | text | 翻譯結(jié)果音頻格式,支持mp3 | false | mp3 |
voice | text | 翻譯結(jié)果發(fā)音選擇 | false | 0為女聲,1為男聲。默認(rèn)為女聲 |
strict | text | 是否嚴(yán)格按照指定from和to進(jìn)行翻譯:true/false | false | 如果為false,則會(huì)自動(dòng)中譯英,英譯中。默認(rèn)為false |
簽名生成方法如下:
signType=v3;
sign=sha256(應(yīng)用ID
+input
+salt
+curtime
+應(yīng)用密鑰
);
其中,input的計(jì)算方式為:input
=q前10個(gè)字符
+q長(zhǎng)度
+q后10個(gè)字符
(當(dāng)q長(zhǎng)度大于20)或input
=q字符串
(當(dāng)q長(zhǎng)度小于等于20);
返回結(jié)果格式:返回的結(jié)果是json格式,具體說明如下:
字段名 | 類型 | 含義 | 備注 |
---|---|---|---|
errorCode | text | 錯(cuò)誤返回碼 | 一定存在 |
query | text | 源語言 | 查詢正確時(shí),一定存在 |
translation | Array | 翻譯結(jié)果 | 查詢正確時(shí),一定存在 |
basic | text | 詞義 | 基本詞典,查詞時(shí)才有 |
web | Array | 詞義 | 網(wǎng)絡(luò)釋義,該結(jié)果不一定存在 |
l | text | 源語言和目標(biāo)語言 | 一定存在 |
dict | text | 詞典deeplink | 查詢語種為支持語言時(shí),存在 |
webdict | text | webdeeplink | 查詢語種為支持語言時(shí),存在 |
tSpeakUrl | text | 翻譯結(jié)果發(fā)音地址 | 翻譯成功一定存在,需要應(yīng)用綁定語音合成實(shí)例才能正常播放 否則返回110錯(cuò)誤碼 |
speakUrl | text | 源語言發(fā)音地址 | 翻譯成功一定存在,需要應(yīng)用綁定語音合成實(shí)例才能正常播放 否則返回110錯(cuò)誤碼 |
returnPhrase | Array | 單詞校驗(yàn)后的結(jié)果 | 主要校驗(yàn)字母大小寫、單詞前含符號(hào)、中文簡(jiǎn)繁體 |
當(dāng)返回的結(jié)果errorCode為 0 時(shí)說明調(diào)用成功,不為0時(shí),則會(huì)出現(xiàn)不同含義的錯(cuò)誤碼。詳細(xì)含義可查閱官方開發(fā)文檔。
2)批量文檔翻譯開發(fā)
批量翻譯demo使用python3實(shí)現(xiàn),為了方便測(cè)試,我用tkinter做了簡(jiǎn)單的界面,用來讀取待翻譯文檔,指定結(jié)果存儲(chǔ)路徑,為了最大化簡(jiǎn)化開發(fā)過程,降低測(cè)試的時(shí)間成本,目前只實(shí)現(xiàn)了讀取.txt類型文件的方法。
整個(gè)demo分為三個(gè)文件,mainwindow.py,translate.py和translatetool.py,mainwindow為UI部分的代碼,translate中實(shí)現(xiàn)了批量讀取文檔并翻譯保存的邏輯,translatetool為根據(jù)示例代碼改造后的翻譯方法,需調(diào)用其他平臺(tái)API時(shí),亦可封裝相應(yīng)方法,增加了項(xiàng)目的擴(kuò)展性。
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='選擇翻譯結(jié)果路徑',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()方法最終調(diào)用了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 # 翻譯結(jié)果存儲(chǔ)路徑 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返回結(jié)果為一個(gè)數(shù)組 return result
調(diào)用有道API主要方法為connect(),根據(jù)API的簽名信息等要求組成data并發(fā)送請(qǐng)求,解析返回的json:
# input輸入待翻譯字段,fromlanguage待翻譯的語言,tolanguage翻譯成的目標(biāo)語言 # 返回翻譯的字段 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的學(xué)習(xí)成本之低,接口調(diào)用部分的開發(fā)過程十分順利,僅有一個(gè)小插曲,最開始調(diào)用API總是返回錯(cuò)誤碼206(即時(shí)間戳錯(cuò)誤),最后發(fā)現(xiàn)是我的系統(tǒng)時(shí)間比標(biāo)準(zhǔn)時(shí)間慢了十分鐘 - - #
總結(jié)
對(duì)于我此次的需要翻譯的文檔需求來說,有道智云贈(zèng)送的字?jǐn)?shù)和賬戶額度,已經(jīng)夠用了,但是如果想長(zhǎng)期的使用下去,還是要付費(fèi)的。最后發(fā)現(xiàn),有道智云在個(gè)人主頁中還提供了按小時(shí)統(tǒng)計(jì)當(dāng)日實(shí)例調(diào)用次數(shù)和查詢字符數(shù)和按天統(tǒng)計(jì)歷史天數(shù)內(nèi)實(shí)例的調(diào)用次數(shù)和字符數(shù),對(duì)有需求的小伙伴,還可以記錄查看自己接口的翻譯量、實(shí)時(shí)調(diào)用量等狀態(tài)。
如上是我整個(gè)demo的開發(fā)過程。整體來說從注冊(cè)到調(diào)用有道智云API的過程還是比較順利的,而且每一步都有官方的詳細(xì)文檔可以參照。以至于主要開發(fā)時(shí)間都分配給了tkinter排版(順便吐槽下tkinter的“好用” :p)。
以上就是python調(diào)用有道智云API實(shí)現(xiàn)文件批量翻譯的詳細(xì)內(nèi)容,更多關(guān)于python 文件批量翻譯的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python內(nèi)置數(shù)據(jù)類型中的集合詳解
這篇文章主要為大家詳細(xì)介紹了Python內(nèi)置數(shù)據(jù)類型中的集合,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03python 3利用BeautifulSoup抓取div標(biāo)簽的方法示例
這篇文章主要介紹了python 3利用BeautifulSoup抓取div標(biāo)簽的方法,文中給出了詳細(xì)的示例代碼供大家參考學(xué)習(xí),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。2017-05-05Python中參數(shù)打包和解包的實(shí)現(xiàn)
在Python中,打包和解包參數(shù)是一種操作方式,可以將多個(gè)參數(shù)打包成一個(gè)元組或字典,也可以將一個(gè)元組或字典解包成多個(gè)參數(shù),本文就來介紹一下如何使用2023-09-09django 解決model中類寫不到數(shù)據(jù)庫(kù)中,數(shù)據(jù)庫(kù)無此字段的問題
這篇文章主要介紹了django 解決model中類寫不到數(shù)據(jù)庫(kù)中,數(shù)據(jù)庫(kù)無此字段的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨想過來看看吧2020-05-05python實(shí)現(xiàn)BP神經(jīng)網(wǎng)絡(luò)回歸預(yù)測(cè)模型
這篇文章主要介紹了python實(shí)現(xiàn)BP神經(jīng)網(wǎng)絡(luò)回歸預(yù)測(cè)模型,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08django-rest-framework解析請(qǐng)求參數(shù)過程詳解
這篇文章主要介紹了django-rest-framework解析請(qǐng)求參數(shù)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07