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