· Joseph · AI & Machine Learning  · 3 min read

[Day 16] Google Translation - 3

還記得昨天在串API的時候,有特別提到Google Translate API在Go client library沒有v3beta1的版本。秉持著練習golang的精神,看到v3beta1有RESTful API,就花了點時間來串一下。

Google translate API v3

我這邊參考的是Using the command line的內容,使用CURL的方式呼叫,並把他改寫成Go req (http client)這類型的RESTful API call。仔細想想,要解決的問題有兩個:1. Get Access token、2. 呼叫restful api。

1. Get Access token

參考資料:https://godoc.org/golang.org/x/oauth2/google#example-JWTConfigFromJSON 我這邊先建立一個auth模組,並把credential json file傳入到裡面的ServiceAccount func,然後回傳一個token struct,

package auth

import (
  "io/ioutil"

  "golang.org/x/oauth2"
  "golang.org/x/oauth2/google"
)

func ServiceAccount(credentialFile string) (*oauth2.Token, error) {
  b, err := ioutil.ReadFile(credentialFile)
  if err != nil {
    return nil, err
  }
  config, _ := google.JWTConfigFromJSON(b, "https://www.googleapis.com/auth/cloud-translation")

  token, err := config.TokenSource(oauth2.NoContext).Token()
  if err != nil {
    return nil, err
  }

  return token, nil
}

2. 呼叫restful api

這樣就有AccessToken了,再來看看CURL該怎麼呼叫

curl -X POST \
-H "Authorization: Bearer TOKEN" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
https://translation.googleapis.com/v3beta1/projects/PROJECT_ID:translateText

而request.json則是 {"sourceLanguageCode": "en", "targetLanguageCode": "ru", "contents": ["Dr. Watson, come here!", "Bring me some coffee!"]}

翻譯的時候會打一隻POSThttps://translation.googleapis.com/v3beta1/projects/PROJECT_ID:translateText,帶著sourceLanguagetargetLanguageCodecontents,再呼叫的時候需要額外的PROJECT_ID,我這邊選擇用環境變數帶進去。

好,有這些知識以後,我們開始來寫呼叫的方法,直接寫在translation模組裡。

func TranslateTextV3Beta1(text []string) error {
  token, _ := auth.ServiceAccount("./authentication.json")

  header := req.Header{
    "Accept":        "application/json",
    "Content-Type":  "application/json; charset=utf-8",
    "Authorization": "Bearer " + token.AccessToken,
  }

  body := struct {
    SourceLanguageCode string   `json:"sourceLanguageCode"`
    TargetLanguageCode string   `json:"targetLanguageCode"`
    Contents           []string `json:"contents"`
  }{
    SourceLanguageCode: "en",
    TargetLanguageCode: "zh-TW",
    Contents:           text,
  }
  json_string, _ := json.Marshal(body)

  param := req.BodyJSON(json_string)
  // only url is required, others are optional.
  r, err := req.Post(
    fmt.Sprintf("https://translation.googleapis.com/v3beta1/projects/%s:translateText", os.Getenv("PROJECT_ID")),
    header,
    param,
  )
  if err != nil {
    log.Fatal(err)
  }
  log.Printf("%+v", r) // print info (try it, you may surprise)

  return nil
}

這有幾個重點:

  • 從auth模組裡的ServiceAccount得到token
  • 產生header把AccessToken帶入
  • 建立body struct,然後透過這個body產生json param
  • 呼叫req.POST,先從os.Getenv取得PROJECT_ID,並帶入headerparams
  • 然後得到response r

那來看看output吧:

docker以docker run -it --env PROJECT_ID=ithelp-2019-ai golang ./app Day16執行 output

過程中第一次建立Struct並轉換成JSON、第一次使用req之類的http client,讓我對Golang的語法又更熟悉了一些。

詳細github可以看這邊:https://github.com/josephMG/ithelp-2019/tree/Day-16 OK,今天就到這邊,謝謝大家的觀看。

Back to Blog

Related Posts

View All Posts »

[Day 17] Google Translation - 子系列最終章

今天要講AutoML translation的部分,這部分在官網上一直沒找到對應的範例,很有可能範例要自己生。我只好自己在網路上找些翻譯的dataset,幸好在這邊有找到很多很多的資料集,只需要做一些資料處理的動作,現在就來先處理一下。 我下載的資料集:News Commentary,並取出中文跟英文的部分。

[Day 15] Google Translation - 2

昨天玩完了Demo,按照步調今天就用Code來實踐吧。在下筆的時候Client Library有v2、v3beta1兩個版本,但Golang只有v2的Example,需要的話就只能用Golang執行CURL POST去呼叫v3beta1版API,所以我這邊就先使用v2來試試看。 Translate Text 架構一樣是在modules底下建立一個translation.go的module 還有要記得抓credential json下來,可以參考這系列第三天的文章

[Day 14] Google Translation - 1

OK,今天要講一個大家常用,卻不一定知道他是Google AI & ML products之一的服務,Google Translation API。 他有什麼東西?他跟前面介紹的服務一樣,也分成兩個服務AutoML Translation與Translation API: AutoML Translation:透過UI介面讓一些比較沒這麼深入了解AI & ML的人可以快速操作,僅僅只要上傳固定格式的檔案,就可以訓練出你自己的model。 Translation API:透過API呼叫,可以讓你的服務馬上翻譯成多國語言,就有點像是在網頁上面串上Google翻譯那樣,點個兩下就做完多國語系(姑且不論正確性的問題,哈哈哈。)

[Day 30] Google AI & ML Products 系列總結

這系列文章出自於一個無窮無盡的bug的解題時間,想不到如何解bug、又想不出要寫什麼主題,參考完大家的方向以後,我發現這類型的文章很少、又很實用,才下定決心透過鐵人賽推廣 Google AI & ML Products。 在這次的挑戰裡,給了自己三個目標: 更熟悉docker 開始玩Golang 入門大部分的Google AI & ML Products 但也因為Google AI & ML Products太多了,所以把它分了很多子系列進行,現在再來回顧一下這次的內容。 前面先來個提醒,如果過程中你們有Deploy model做Online predict的,如果測完一定要記得刪掉,不然你deploy的model就會一直被收費喔。