[Python]第三方模塊:谷歌翻譯接口--googletrans

先前我在翻譯日文歌的歌詞時(shí),需要得到對(duì)應(yīng)詞句的羅馬音和中文,最終比較多款網(wǎng)頁(yè)翻譯器,選擇了谷歌翻譯。后來(lái)發(fā)現(xiàn)谷歌翻譯在翻譯大段含換行符的文本時(shí),返回的羅馬音結(jié)果會(huì)除去換行符,而在文本中加入明顯的分隔符,羅馬音結(jié)果卻不盡人意。最好的辦法當(dāng)然是逐句翻譯,對(duì)于歌詞的工作量可想而知。故我多番查找,最終找到了Python下的一個(gè)第三方模塊——googletrans。

簡(jiǎn)介

PyPI鏈接
官方API鏈接

以下的內(nèi)容手翻自PyPI項(xiàng)目介紹:
Googletrans是一款免費(fèi)、無(wú)極限、模擬谷歌翻譯API的Python庫(kù)。它使用了Google Translate Ajax API來(lái)調(diào)用可用于探測(cè)和翻譯的方法。
本庫(kù)支持Python2.7+和3.4+(注意:Python 2將在下一個(gè)主要更新中被移除)。
特性:

  • 快速且可靠——它使用的服務(wù)器與translate.google.com相同;
  • 自動(dòng)識(shí)別語(yǔ)言;
  • 大片文本翻譯(譯注:這是直譯的結(jié)果,實(shí)際測(cè)試發(fā)現(xiàn)這個(gè)模塊支持對(duì)列表里每一句話(huà)翻譯);
  • 自定義服務(wù)器url(譯注:也就是可以選擇translate.google.cn提速);
  • 連接池(requests.Session的優(yōu)勢(shì));
  • 支持HTTP/2。

安裝

可以使用pip:
pip install googletrans。
或者是使用上面PyPI的通道下載googletrans包,然后手動(dòng)安裝。

使用

0.調(diào)用模塊

import googletrans。
如果是一般使用,可直接引用下屬的翻譯器類(lèi):
from googletrans import Translator。

1.基本使用

我們使用Translator類(lèi)來(lái)完成翻譯工作。請(qǐng)參看下方的例子:

from googletrans import Translator
trans = Translator()
result = trans.translate('?????.', dest='ja', src='ko')

result變量返回一個(gè)Translated類(lèi):
<Translated src=ko dest=ja text=こんにちは。 pronunciation=Kon'nichiwa.>
(注:這是官網(wǎng)示例,實(shí)際上我測(cè)試時(shí)并沒(méi)有這樣的repr,反倒輸出的是Python默認(rèn)的repr格式,不知是版本問(wèn)題還是bug。先保留原文的寫(xiě)法)

若要使用該模塊,首先我們必須將模塊中的Translator實(shí)例化,再調(diào)用translate方法。其中需要參數(shù)src(可不加,系統(tǒng)自動(dòng)判斷語(yǔ)言)、dest(可不加,默認(rèn)為英文)、text(必加(廢話(huà)),文本)。src和dest填語(yǔ)言代碼,一般是二位字符串,具體可參照googletrans.LANGUAGES的內(nèi)容:

In [2]: googletrans.LANGUAGES
Out[2]:
 {'af': 'afrikaans',
 'sq': 'albanian',
 'am': 'amharic',
 'ar': 'arabic',
 'hy': 'armenian',
 'az': 'azerbaijani',
 'eu': 'basque',
 'be': 'belarusian',
 'bn': 'bengali',
 'bs': 'bosnian',
 'bg': 'bulgarian',
 'ca': 'catalan',
 'ceb': 'cebuano',
 'ny': 'chichewa',
 'zh-cn': 'chinese (simplified)',
 'zh-tw': 'chinese (traditional)',
 'co': 'corsican',
 'hr': 'croatian',
 'cs': 'czech',
 'da': 'danish',
 'nl': 'dutch',
 'en': 'english',
 'eo': 'esperanto',
 'et': 'estonian',
 'tl': 'filipino',
 'fi': 'finnish',
 'fr': 'french',
 'fy': 'frisian',
 'gl': 'galician',
 'ka': 'georgian',
 'de': 'german',
 'el': 'greek',
 'gu': 'gujarati',
 'ht': 'haitian creole',
 'ha': 'hausa',
 'haw': 'hawaiian',
 'iw': 'hebrew',
 'hi': 'hindi',
 'hmn': 'hmong',
 'hu': 'hungarian',
 'is': 'icelandic',
 'ig': 'igbo',
 'id': 'indonesian',
 'ga': 'irish',
 'it': 'italian',
 'ja': 'japanese',
 'jw': 'javanese',
 'kn': 'kannada',
 'kk': 'kazakh',
 'km': 'khmer',
 'ko': 'korean',
 'ku': 'kurdish (kurmanji)',
 'ky': 'kyrgyz',
 'lo': 'lao',
 'la': 'latin',
 'lv': 'latvian',
 'lt': 'lithuanian',
 'lb': 'luxembourgish',
 'mk': 'macedonian',
 'mg': 'malagasy',
 'ms': 'malay',
 'ml': 'malayalam',
 'mt': 'maltese',
 'mi': 'maori',
 'mr': 'marathi',
 'mn': 'mongolian',
 'my': 'myanmar (burmese)',
 'ne': 'nepali',
 'no': 'norwegian',
 'ps': 'pashto',
 'fa': 'persian',
 'pl': 'polish',
 'pt': 'portuguese',
 'pa': 'punjabi',
 'ro': 'romanian',
 'ru': 'russian',
 'sm': 'samoan',
 'gd': 'scots gaelic',
 'sr': 'serbian',
 'st': 'sesotho',
 'sn': 'shona',
 'sd': 'sindhi',
 'si': 'sinhala',
 'sk': 'slovak',
 'sl': 'slovenian',
 'so': 'somali',
 'es': 'spanish',
 'su': 'sundanese',
 'sw': 'swahili',
 'sv': 'swedish',
 'tg': 'tajik',
 'ta': 'tamil',
 'te': 'telugu',
 'th': 'thai',
 'tr': 'turkish',
 'uk': 'ukrainian',
 'ur': 'urdu',
 'uz': 'uzbek',
 'vi': 'vietnamese',
 'cy': 'welsh',
 'xh': 'xhosa',
 'yi': 'yiddish',
 'yo': 'yoruba',
 'zu': 'zulu',
 'fil': 'Filipino',
 'he': 'Hebrew'}

googletrans.LANGCODES則是將上面的字典的鍵值全反過(guò)來(lái),就不贅述了。

再看Translated類(lèi)。它的repr返回了原先設(shè)置的src和dest,而此處的text則是翻譯后的文字。如果是在交互命令行下直接輸出這個(gè)repr也能達(dá)到翻譯效果,但要是想拿到這個(gè)text,只需要調(diào)用Translated的成員變量text:

In [12]: result.text       
Out[12]: 'こ ん に ち は 。 '
2.翻譯結(jié)果的其他信息

Translated類(lèi)還有一些有趣的成員:

# 輸出翻譯后語(yǔ)言的發(fā)音(如果有的話(huà))
In [13]: result.pronunciation                    
Out[13]: "Kon'nichiwa." # 日語(yǔ)羅馬音,可以用此解決日文歌發(fā)音問(wèn)題(python另外有模塊pykakasi也可以解決此問(wèn)題,此處不贅述)

# 顯示額外信息
In [14]: result.extra_data                                       
Out[14]:
{'translation': [['こんにちは。', '?????.', None, None, 0],
 [None, None, "Kon'nichiwa.", 'annyeonghaseyo.']],
 'all-translations': None,
 'original-language': 'ko',
 'possible-translations': [['?????',
   None,
   [['こんにちは', 1000, False, False],
    ['ちょっと', 0, False, False],
    ['ハロー', 0, False, False],
    ['ねえ', 0, False, False]],
   [[0, 5]],
   '?????.',
   0,
   1],
  ['.', None, [['。', 1000, False, False]], [[5, 6]], None, 1, 2]],
 'confidence': 1.0,
 'possible-mistakes': None,
 'language': [['ko'], None, [1.0], ['ko']],
 'synonyms': None,
 'definitions': None,
 'examples': None,
 'see-also': None}

(上述結(jié)果由于Termius復(fù)制有缺陷,本人自行做了些許修正,顯示出的效果可能與您的測(cè)試結(jié)果有所不同,請(qǐng)諒解)

對(duì)于extra_data這個(gè)成員,googletrans源代碼中并未解釋每一個(gè)鍵值對(duì)代表什么意思,可能這里是谷歌翻譯開(kāi)發(fā)用的數(shù)據(jù),或者是用戶(hù)收集下來(lái)供反饋用的數(shù)據(jù),總之可能用戶(hù)無(wú)需了解具體內(nèi)容,我們就在此略過(guò)。各位可以自己多測(cè)試幾次翻譯,對(duì)比看看具體每個(gè)參數(shù)是做什么工作的。

3.其他參數(shù)和操作

掌握前面的知識(shí),我們已經(jīng)可以解決很多翻譯問(wèn)題了。但是我們實(shí)際測(cè)試發(fā)現(xiàn),直接用官網(wǎng)上的實(shí)例,會(huì)直接卡死,原因其實(shí)在前面介紹中已經(jīng)提及——我們默認(rèn)調(diào)用的是translate.google.com的API,而由于國(guó)內(nèi)偉大的墻顯然上不去。介紹中提到了可以修改調(diào)用的API域名,那應(yīng)該在哪里調(diào)整呢?

其實(shí),Translator類(lèi)也有一些可以調(diào)整的參數(shù)。首先我們先看Translator類(lèi)的聲明:
Translator(service_urls=None, user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64)', proxies=None, timeout=None)
想必各位應(yīng)該都能猜出來(lái)上面的參數(shù)是什么意思。services_url給定API的地址,無(wú)需協(xié)議名,如果給出多個(gè),那么每次翻譯隨機(jī)選擇一個(gè)(根據(jù)實(shí)例和親自測(cè)試,我們必須用列表包住url,否則會(huì)出現(xiàn)bug,不知道是什么原理);user_agent就是UA標(biāo)識(shí),這里已經(jīng)給了就可以不填,當(dāng)然你也可以用random.choice每次隨機(jī)選UA;proxies就是代理;timeout就是超時(shí)的時(shí)間。后面三項(xiàng),和urllib與requests的接口參數(shù)類(lèi)似,這里就不贅述了,一般來(lái)說(shuō)如果用translate.google.cn可以不加后面三項(xiàng)。

最后還有一個(gè)小操作,就是列表翻譯:我們給定一個(gè)列表,就會(huì)返回每一項(xiàng)的翻譯。測(cè)試如下:

In [56]: srcs = ['Hello, ', 'world!', 'The quick fox jumps \nover the lazy dog.']

In [57]: res = t.translate(srcs, dest='zh-cn')

In [58]: res
Out[58]:
[<googletrans.models.Translated at 0x7168e08>,
 <googletrans.models.Translated at 0x7168e48>,
 <googletrans.models.Translated at 0x6454148>]

In [59]: for i in res: print(i.text)
你好,
世界!
快速狐貍跳過(guò)
那只懶狗。




全文完。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容