Microsoft Cognitive Services (5) - 使用Translator Text API翻譯文字

最近我們有很多案子大量地使用到Cognitive Services當中另一個很好用的服務,那就是 Translator Taxt API。這一組服務可以幫你識別文字的語系,當然也可以翻譯文字,用法相當簡單,只需要透過REST API呼叫即可。

使用前同樣需要在Azure站台上申請Translator Text服務(有免費方案),你會得到一組Key,可以從底下位置取得:

好了,有了需要的Key之後,我們就可以透過這組雲端服務來實際來撰寫翻譯程式了。

辨識輸入文字的語系

我們先看文字語系識別的部分,我們一樣透過Windows應用程式來示範,執行結果如下:

上方的文字方塊是我們輸入要辨識的文字,按下『判斷語系』鈕之後你會發現系統告訴我們,最有可能的語系是zh-Hant也就是繁體中文。

這算是相當正確的了,因為句子中有些中英夾雜,這樣的效果算是挺讓人滿意了。

我們來看程式碼,主程式只有兩行:

private void button1_Click(object sender, EventArgs e)
{
var result = MSTranslatorUtility.Detect(this.textBox1.Text);
this.textBox2.Text = $"最有可能的語系是 : {result.FirstOrDefault().language}";
this.textBox2.Text += $"\r\n分數 : {result.FirstOrDefault().score}";
}
view raw tr.cs hosted with ❤ by GitHub

上面這段程式碼沒什麼內容,純粹就只是呼叫一個Detect方法,該方法是我們撰寫來透過http post呼叫遠端的辨識服務的,程式碼如下:

public static List<MSTranslatorTextDetectResult> Detect(string text)
{
string path = "/detect?api-version=3.0"; //偵測語系
string uri = MSTranslatorTextHost + path;
System.Object[] body = new System.Object[] { new { Text = text } };
var requestBody = JsonConvert.SerializeObject(body);
using (var client = new HttpClient())
using (var request = new HttpRequestMessage())
{
request.Method = HttpMethod.Post;
request.RequestUri = new Uri(uri);
request.Content = new StringContent(requestBody, Encoding.UTF8, "application/json");
request.Headers.Add("Ocp-Apim-Subscription-Key", MSTranslatorTextKey);
//取得http get結果
var response = client.SendAsync(request).Result;
var responseBody = response.Content.ReadAsStringAsync().Result;
//將取得的結果反序列化為物件
var result = JsonConvert.DeserializeObject<List<MSTranslatorTextDetectResult>>(responseBody);
return result;
}
}
view raw tr.cs hosted with ❤ by GitHub

上面這段程式碼其實也非常簡單,透過HttpClient進行一個http post呼叫,呼叫的endpoint是:

https://api.cognitive.microsofttranslator.com/detect?api-version=3.0

然後把要辨識的文字text轉成JSON以body傳給該endpoint。比較需要注意的是,必須把剛才申請的key以Ocp-Apim-Subscription-Key這個header name一併傳遞過去。

取回結果後,我們再反序列化為物件,就完成了唷。由於辨識可能會有多種結果,所以回傳的物件result,我們取第一組辨識結果result.FirstOrDefault(),透過language屬性取得語系,透過score取得分數:

這個分數是辨識的可靠度,倘若用戶輸入的文字可能符合多個語系,可以透過這個score取得最符合的語系。

即時翻譯輸入的文字

接著我們來看文字翻譯的功能,使用的方式也非常簡單,我們先看執行的結果:

當我們按下翻譯鈕,底下出現的是翻譯後的結果,由於我們的目標語系是en(英文),Translator Text API很順利的把上面的文字翻成英文囉。

主要的程式碼如下:


public static List<MSTranslatorTextTranslateResult> Translate(string text, string LanguageCode)
{
// Translate to German and Italian.
string path = "/translate?api-version=3.0"; //翻譯
string params_ = "&to=" + LanguageCode; //目標語系
string uri = MSTranslatorTextHost + path + params_;
System.Object[] body = new System.Object[] { new { Text = text } };
var requestBody = JsonConvert.SerializeObject(body);
using (var client = new HttpClient())
using (var request = new HttpRequestMessage())
{
request.Method = HttpMethod.Post;
request.RequestUri = new Uri(uri);
request.Content = new StringContent(requestBody, Encoding.UTF8, "application/json");
request.Headers.Add("Ocp-Apim-Subscription-Key", MSTranslatorTextKey);
var response = client.SendAsync(request).Result;
var responseBody = response.Content.ReadAsStringAsync().Result;
var result = Newtonsoft.Json.JsonConvert.DeserializeObject<List<MSTranslatorTextTranslateResult>>(responseBody);
return result;
}
}
view raw tr.cs hosted with ❤ by GitHub

我們建立了一個Translate方法,輸入的參數有要翻譯的文字text以及目標語系languageCode,微軟翻譯的功能透過http post呼叫,endpoint為:

https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&to=LanguageCode

你會發現翻譯的目標語系這個參數是放在endpoint URL中的,而要被翻譯的文字則是透過http body以JSON的形式傳遞給endpoint,同樣的,不要忘記把剛才申請的key以Ocp-Apim-Subscription-Key這個header name一併傳遞過去。

透過httpClient的SendAsync()方法呼叫之後,再把取得的結果反序列化為JSON,就可以很輕鬆的得到翻譯的結果了。因此我們Button中的主程式碼如下:


var result = MSTranslatorUtility.Translate(this.textBox1.Text, "en"); //zh-Hant 為翻譯成中文
this.textBox2.Text = $"目標語系 : { result.FirstOrDefault().translations.FirstOrDefault().to}";
this.textBox2.Text += $"\r\n翻譯結果 : { result.FirstOrDefault().translations.FirstOrDefault().text}";
view raw tr.cs hosted with ❤ by GitHub
---

我們把透過Translator()方法翻譯的結果result,取得其中的translations物件,然後抓取第一組翻譯結果(to),就可以得到翻譯的答案了。

沒了,就這樣。是不是很簡單呢?

對了,為何是『第一組』翻譯結果?難道可能會有很多組答案?

其實我們是可以在endpoint放入多組目標語系的,例如:

https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&to=de&to=it

上面這樣的設定,會讓Translator Text API同時翻出兩種目標語系,德文和義大利文,所以translations物件中是可能有多組結果的,只是上面的範例我們只指定了一組,因此以FirstOrDefault().to抓第一組的翻譯結果就可以了,很簡單吧。

前面提到過,這個ranslator Text API相當好用,翻譯出的結果準度很高,最近我們大量地使用在相當多專案和LINE Bot的設計上,看到這邊你會不會有點躍躍欲試?

建議讀者可以先自行嘗試看看,我們後面會實際介紹如何開發一個LINE Bot翻譯機器人。

如果對MS這個服務有興趣,可以參考:
https://azure.microsoft.com/zh-tw/services/cognitive-services/translator-text-api/ 

它同樣有免費的方案唷。

btw, 既然有了好用的 Cognitive Services,就順手做一個翻譯的LINE Bot吧..

要玩玩看? 搜尋id @ejn1954w 加入即可。
或用手機點選底下連結:
https://line.me/R/ti/p/%40ejn1954w

enjoy~

--------------------------------------------
Microsoft Cognitive Services 系列文章總索引
線上課程:
https://www.udemy.com/line-bot/
電子書:https://www.pubu.com.tw/ebook/103305
LineBotSDK:https://www.nuget.org/packages/LineBotSDK
如果需要即時取得更多相關訊息,可按這裡加入FB專頁。若這篇文章對您有所幫助,請幫我們分享出去,謝謝您的支持。

留言

這個網誌中的熱門文章

使用LM Studio輕鬆在本地端以API呼叫大語言模型(LLM)

實際嘗試使用DeepSeek API

使用 Dify 以No Code方式建立記帳機器人

使用 Dify API 快速建立一個包含前後文記憶的對談機器人

使用 Dify 建立企業請假機器人