前言:目前翻譯都是線上的,要在C#開發的程式上做一個可以實時翻譯的功能,好像不是那麼好做。而且大多數處於區域網內,所以存取線上的api也顯得比較尷尬。於是,就有了以下這篇文章,自己搭建一套簡單的離線翻譯系統。以下內容採用python提供基礎翻譯服務+ C#存取服務的功能,歡迎圍觀。
系統環境: WIN10
開發環境:VS2022 + VS CODE
開發語言環境: Python3.8 + .NET 6
以下正文:
1、由於本地環境沒有python,所以先安裝python有關環境先。
2、安裝好以後,控制檯下輸入 python,進入如下終端內容,就代表安裝成功了。建議安裝時候,選擇自動新增到環境變數裡面,這樣不需要自己設定了。
3、由於翻譯功能,會使用到一些已有的模型進行計算,所以以下需要安裝幾個包。第一個是pytorch, 輸入 pip install torch 即可安裝。如果安裝比較慢,在後面設定一個映象,可以加速,例如此處我使用的清華的加速器:https://pypi.tuna.tsinghua.edu.cn/simple
4、然後安裝flask: pip install flask
5、接著需要安裝 gevent: pip install gevent
6、接著是 transformers
7、安裝transformers時候,有的會自動安裝sentencepiece包,有的時候不會。如果上面查詢沒有,就手動安裝一下:
8、以上包安裝完畢,開啟VS CODE,建立一個python語言檔案
9、此處檔案命名為 MyTranslate.py 然後引入可能所需要的包
10、接著,上 https://huggingface.co/Helsinki-NLP 上面,查詢需要的語言翻譯模型。此處使用的離線翻譯,使用的該專案下的。
11、Models裡面有上千個語言模型,選擇自己需要的名稱,記住就行。
12、此處,我選了四個模型,分別是英漢/漢英 以及德漢/漢德的翻譯模型。有關程式碼實現如下所示。
13、接著定義一個api介面,用於提供給外部存取(畢竟主業不是python,提供api就可以跨語言來存取該服務了)。有關程式碼如下所示。
14、VS CODE上執行程式,可以看到終端控制檯上面列印出一些下載進度。這是因為本地現在還沒有模型,我們選擇的四個模型,會被下載到本地來,這樣下次就不需要再下載模型了。
15、 模型載入完畢,啟動服務。此處0.0.0.0代表本機ip都可以被存取,我們正常使用時候,本機就127.0.0.1即可;如果是區域網或者外網,那就提供真實IP即可。
16、下載的模型,會自動下載到當前使用者資料夾下,具體效果如下圖所示。所以如果某個伺服器沒有外網,也可以直接拷貝該.cache資料夾到指定伺服器下面的某使用者下,也可以被識別。
17、開啟postman,做個簡單的測試。可以看到,服務是可以被成功存取的,說明程式碼可以跑,問題不是很大。
18、換一種翻譯模式再試一下:
19、再試一試另類點的,看看效果:
20、看不懂德文,把德文搞到百度線上翻譯上面反翻譯回來,看來語意好像差不多。
【中途插播,防止被惡意轉載抹除個人出處使用】 該部落格原創作者 Wesky,公眾號:Dotnet Dancer 部落格原地址:https://www.cnblogs.com/weskynet/p/16740041.html
21、程式這樣執行不是事兒,所以我們可以把它打包為exe程式來執行,這樣就可以在不安裝python環境的電腦也可以跑了。安裝 pyinstaller:
22、在MyTranslate.py同資料夾下,新建一個py檔案,名稱不能改:hook-ctypes.macholib.py 該檔案用於提供虛擬環境使用。
23、該檔案下,需要匯入所有可能用到的依賴的包。不然打包可能出錯;或者打包完畢以後,執行可能出錯。
24、打包應用的內容,根據個人實際情況來選擇,pip 下載時候,有一個 Collecting提示,提示後面就是安裝的依賴包,不曉得哪些需要的,就全部搞進去,減少錯誤機率。
25、執行打包命名 pyinstaller -F xxx.py --additional-hooks-dir=. 如果不需要有控制檯提示,可以加個 -w
26、打包安裝成功了
27、打包成功的exe檔案,自動放在 dist資料夾下
28、生成的exe檔案,如圖。
29、直接執行走一波,看看效果。為了避免看不到錯誤提示,所以我在控制檯內執行,如圖
30、由於模型被下載過,所以第二次啟動,不會重複下載模型。
31、現在再用 Postman 走一波,看看效果。
32、直接執行的程式,難免被人不小心誤操作給關閉了,所以我們還可以把他丟到Windows服務上面,這樣伺服器重啟也不擔心了。使用NSSM工具進行操作。如果想知道如何使用,也可以參考我的另一篇部落格。部落格地址:https://www.cnblogs.com/weskynet/p/14961565.html
33、設定描述,備註為 離線翻譯服務。安裝為服務 TranslateService(名字可以隨意)
34、安裝以後,可以看到已經生成一個對應的Windows服務了。
35、服務啟動,可以等待一小會兒,載入模型要一丟丟時間。一小會兒以後,使用Postman進行測試一下,看看效果。
36、接下來,建立一個基於.NET的webapi程式,用來通過程式碼來存取翻譯服務,看看能不能存取到。
37、建立一個控制器,搭建個基礎模子先。
38、注入IHttpClientFactory(用來存取webapi使用的,實際上就是提供HttpClient)。然後寫個簡單的測試功能,直接看以下程式碼:
39、通過自帶的swagger,走一波。輸入有關引數,走一個看看,嘿,可以使用,bingo~
40、後記:如果需要原始碼的,可以微信搜尋 Dotnet Dancer 或者掃描以下二維條碼,在公眾號視窗傳送 【離線翻譯神器】,即可下載。