在线翻译项目练习——添加火山引擎机器翻译
在通过 Simpledict 简单项目熟悉了通过 URL 调用 API 接口的流程后,可以进一步结合火山引擎的机器翻译 API,实现一个简易的翻译器。
1. 开通机器翻译API
按照官网入门手册,注册、开通服务即可。(手册地址:API接入流程概览--机器翻译-火山引擎)
开通服务后,登录火山引擎,点击头像查看API访问密钥,通过查询API密钥。
2.创建项目文件
新建SimpleTranslation 文件,cd 到对应目录下,使用 go mod init SimpleTranslation命令初始化module,运行成功后项目目录下生成go.mod文件,新建main.go文件。
由于调用时需要通过第三方库"github.com/volcengine/volc-sdk-golang/base"进行签名验证。需要安装第三方依赖,通过go get github.com/volcengine/volc-sdk-golang/base 命令安装。
SimpleTranslation
├── go.mod
├── go.sum
└── mai.go
在main.go文件内,复制官网提供好的文本翻译API调用Demo。(文本翻译API--机器翻译-火山引擎)
package main
import (
"encoding/json"
"fmt"
"net/http"
"net/url"
"time"
"github.com/volcengine/volc-sdk-golang/base"
)
const (
kAccessKey = "密钥管理中的 AccessKey ID" // https://console.volcengine.com/iam/keymanage/
kSecretKey = "密钥管理中的 AccessKey Secret"
kServiceVersion = "2020-06-01"
)
var (
ServiceInfo = &base.ServiceInfo{
Timeout: 5 * time.Second,
Host: "translate.volcengineapi.com",
Header: http.Header{
"Accept": []string{"application/json"},
},
Credentials: base.Credentials{Region: base.RegionCnNorth1, Service: "translate"},
}
ApiInfoList = map[string]*base.ApiInfo{
"TranslateText": {
Method: http.MethodPost,
Path: "/",
Query: url.Values{
"Action": []string{"TranslateText"},
"Version": []string{kServiceVersion},
},
},
}
)
type Req struct {
SourceLanguage string `json:"SourceLanguage"`
TargetLanguage string `json:"TargetLanguage"`
TextList []string `json:"TextList"`
}
func main() {
client := base.NewClient(ServiceInfo, ApiInfoList)
client.SetAccessKey(kAccessKey)
client.SetSecretKey(kSecretKey)
req := Req{
SourceLanguage: "en",
TargetLanguage: "zh",
TextList: []string{"hello world"},
}
body, _ := json.Marshal(req)
resp, code, err := client.Json("TranslateText", nil, string(body))
if err != nil {
panic(err)
}
fmt.Printf("%d %s\n", code, string(resp))
}
如果可以成功运行,说明API配置等环境没有问题。运行结果如下
// 状态码 + 返回体
200 {"TranslationList":[{"Translation":"你好世界","DetectedSourceLanguage":"","Extra":null}],"ResponseMetadata":{"RequestId":"20241128164526F2AF988996B19240B580","Action":"TranslateText","Version":"2020-06-01","Service":"translate","Region":"cn-north-1"},"ResponseMetaData":{"RequestId":"20241128164526F2AF988996B19240B580","Action":"TranslateText","Version":"2020-06-01","Service":"translate","Region":"cn-north-1"}}
3.修改main函数
请求体
type Req struct {
SourceLanguage string `json:"SourceLanguage"` // 源语言
TargetLanguage string `json:"TargetLanguage"` // 目标语言
TextList []string `json:"TextList"` // 待翻译的文本列表
}
// example
req := Req{
SourceLanguage: "en", // 原始语言 -> 英语
TargetLanguage: "zh", // 翻译目标语言 -> 中文
TextList: []string{"hello world"}, // 要翻译的字段
}
返回体
可以通过JSON-to-Go: Convert JSON to Go instantly,快速获得返回的JSON格式对应Go的结构体。
type Resp struct {
TranslationList []struct {
Translation string `json:"Translation"` // 翻译结果
DetectedSourceLanguage string `json:"DetectedSourceLanguage"` // 仅在源语言未指定时会返回结果
} `json:"TranslationList"`
ResponseMetadata struct {
RequestID string `json:"RequestId"`
Action string `json:"Action"`
Version string `json:"Version"`
Service string `json:"Service"`
Region string `json:"Region"`
Error any `json:"Error"`
} `json:"ResponseMetadata"`
}
修改后的fun main()部分
func main() {
client := base.NewClient(ServiceInfo, ApiInfoList)
client.SetAccessKey(kAccessKey)
client.SetSecretKey(kSecretKey)
req := Req{
SourceLanguage: "zh", // 中文到英文
TargetLanguage: "en",
TextList: []string{"你好,世界","今天过得如何","最近还好吗"},
}
body, _ := json.Marshal(req)
body, code, err := client.Json("TranslateText", nil, string(body)) // code检查响应状态码
if err != nil {
fmt.Printf("Error: %v\n", err)
}
if code != 200 {
fmt.Printf("%d %s\n", code, string(body))
}
var resp Resp
err = json.Unmarshal(body, &resp)
if err != nil {
panic(err)
}
for i:=0;i<3;i++ {
// fmt.Printf("%d %s\n", code, resp.TranslationList[i].Translation)
fmt.Printf("%s\n", resp.TranslationList[i].Translation)
}
}
运行输出结果(自动加上'?'):
Hello, World
How was your day?
How are you doing?
4.封装功能
- 将请求和返回的功能封装到query函数,并设计请求接口(sourceLanguage, targetLanguage string, textList []string)
- main函数通过流实现翻译语言的设置以及翻译字段的输入交互。
package main
import (
"bufio"
"encoding/json"
"fmt"
"net/http"
"net/url"
"os"
"strings"
"time"
"github.com/volcengine/volc-sdk-golang/base"
)
const (
kAccessKey = "密钥管理中的 AccessKey ID" // https://console.volcengine.com/iam/keymanage/
kSecretKey = "密钥管理中的 AccessKey Secret"
kServiceVersion = "2020-06-01"
)
var (
ServiceInfo = &base.ServiceInfo{
Timeout: 5 * time.Second,
Host: "translate.volcengineapi.com",
Header: http.Header{
"Accept": []string{"application/json"},
},
Credentials: base.Credentials{Region: base.RegionCnNorth1, Service: "translate"},
}
ApiInfoList = map[string]*base.ApiInfo{
"TranslateText": {
Method: http.MethodPost,
Path: "/",
Query: url.Values{
"Action": []string{"TranslateText"},
"Version": []string{kServiceVersion},
},
},
}
)
type Resp struct {
TranslationList []struct {
Translation string `json:"Translation"`
DetectedSourceLanguage string `json:"DetectedSourceLanguage"`
} `json:"TranslationList"`
ResponseMetadata struct {
RequestID string `json:"RequestId"`
Action string `json:"Action"`
Version string `json:"Version"`
Service string `json:"Service"`
Region string `json:"Region"`
Error any `json:"Error"`
} `json:"ResponseMetadata"`
}
type Req struct {
SourceLanguage string `json:"SourceLanguage"`
TargetLanguage string `json:"TargetLanguage"`
TextList []string `json:"TextList"`
}
func query(sourceLanguage, targetLanguage string, textList []string) ([]string, error) {
client := base.NewClient(ServiceInfo, ApiInfoList)
client.SetAccessKey(kAccessKey)
client.SetSecretKey(kSecretKey)
req := Req{
SourceLanguage: sourceLanguage,
TargetLanguage: targetLanguage,
TextList: textList,
}
body, _ := json.Marshal(req)
body, code, err := client.Json("TranslateText", nil, string(body)) // code检查响应状态码
if err!= nil {
return nil, fmt.Errorf("Error: %v", err)
}
if code!= 200 {
return nil, fmt.Errorf("%d %s", code, string(body))
}
var resp Resp
err = json.Unmarshal(body, &resp)
if err!= nil {
return nil, fmt.Errorf("Error unmarshaling response: %v", err)
}
translations := make([]string, len(textList))
for i, translation := range resp.TranslationList {
translations[i] = translation.Translation
}
return translations, nil
}
func main() {
reader := bufio.NewReader(os.Stdin)
fmt.Print("请输入源语言(如:zh):")
sourceLanguage, _ := reader.ReadString('\n')
sourceLanguage = strings.TrimSpace(sourceLanguage)
fmt.Print("请输入目标语言(如:en):")
targetLanguage, _ := reader.ReadString('\n')
targetLanguage = strings.TrimSpace(targetLanguage)
fmt.Print("请输入要翻译的文本,以句号分隔:")
textListStr, _ := reader.ReadString('\n')
textListStr = strings.TrimSpace(textListStr)
textList := strings.Split(textListStr, "。")
translations, err := query(sourceLanguage, targetLanguage, textList)
if err!= nil {
fmt.Printf("Error: %v\n", err)
return
}
fmt.Println("翻译结果:")
for _, translation := range translations {
fmt.Println(translation)
}
}
运行结果: