### Audio Translation with Go SDK Source: https://www.volcengine.com/docs/4640/78985 This example demonstrates how to initialize the Volcengine client, submit an audio file for translation, and poll the status until completion to retrieve the translated subtitles. ```go 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{ "SubmitAudio": { Method: http.MethodPost, Path: "/", Query: url.Values{ "Action": []string{"SubmitAudio"}, "Version": []string{kServiceVersion}, }, }, "QueryAudio": { Method: http.MethodPost, Path: "/", Query: url.Values{ "Action": []string{"QueryAudio"}, "Version": []string{kServiceVersion}, }, }, } ) func newClient() *base.Client { client := base.NewClient(ServiceInfo, ApiInfoList) client.SetAccessKey(kAccessKey) client.SetSecretKey(kSecretKey) return client } type SubmitReq struct { SourceLanguage string `json:"SourceLanguage"` TargetLanguage string `json:"TargetLanguage"` Uri string `json:"Uri"` } type SubmitResp struct { TaskId string `json:"TaskId"` ResponseMetadata struct { RequestId string `json:"RequestId"` Action string `json:"Action"` Version string `json:"Version"` Service string `json:"Service"` Region string `json:"Region"` Error interface{} `json:"Error"` } `json:"ResponseMetadata"` } type QueryReq struct { TaskId string `json:"TaskId"` } type QueryResp struct { Subtitles []struct { StartTime int `json:"StartTime"` EndTime int `json:"EndTime"` Text string `json:"Text"` Translation string `json:"Translation"` } `json:"Subtitles"` Status string `json:"Status"` ResponseMetadata struct { RequestId string `json:"RequestId"` Action string `json:"Action"` Version string `json:"Version"` Service string `json:"Service"` Region string `json:"Region"` Error interface{} `json:"Error"` } `json:"ResponseMetadata"` } func SubmitAudio(cli *base.Client, uri, sourceLanguage, targetLanguage string) (*SubmitResp, error) { req := &SubmitReq{ SourceLanguage: sourceLanguage, TargetLanguage: targetLanguage, Uri: uri, } reqData, err := json.Marshal(req) if err != nil { return nil, err } respData, code, err := cli.Json("SubmitAudio", nil, string(reqData)) if err != nil { return nil, err } if code != 200 { return nil, fmt.Errorf("code:%d,err:%s", code, string(respData)) } resp := &SubmitResp{} err = json.Unmarshal(respData, resp) if err != nil { return nil, err } return resp, nil } func QueryAudio(cli *base.Client, taskId string) (*QueryResp, error) { req := &QueryReq{ TaskId: taskId, } reqData, err := json.Marshal(req) if err != nil { return nil, err } respData, code, err := cli.Json("QueryAudio", nil, string(reqData)) if err != nil { return nil, err } if code != 200 { return nil, fmt.Errorf("code:%d,err:%s", code, string(respData)) } resp := &QueryResp{} err = json.Unmarshal(respData, resp) if err != nil { return nil, err } return resp, nil } func main() { cli := newClient() submitResp, err := SubmitAudio(cli, "http://xx/xx.mp4", "en", "zh") if err != nil { panic(err) } status := "created" for status == "created" { time.Sleep(time.Minute) queryResp, err := QueryAudio(cli, submitResp.TaskId) if err != nil { panic(err) } status = queryResp.Status if status == "success" { for _, subtitle := range queryResp.Subtitles { fmt.Printf("%d - %d: %s -> %s", subtitle.StartTime, subtitle.EndTime, subtitle.Text, subtitle.Translation) } } } } ``` -------------------------------- ### Go: WebSocket speech translation client with signing and streaming Source: https://www.volcengine.com/docs/4640/127504 Go example showing how to sign a WebSocket URL using the Volcengine SDK, connect, send audio chunks, and receive translation results. It uses a WaitGroup to manage concurrent read/write goroutines and sends a JSON configuration message with source language 'en' and target 'zh'. ```go func getWsSignUrl(host string, accessKey string, secretKey string) (string, error) { client := newClient(host, accessKey, secretKey) signUrl, err := client.GetSignUrl(kSpeechTranslateAction, nil) if err != nil { return "", err } clientUrl := url.URL{ Scheme: "wss", Path: client.ApiInfoList[kSpeechTranslateAction].Path, Host: client.ServiceInfo.Host, RawQuery: signUrl, } return clientUrl.String(), nil } func main() { var ( group = &sync.WaitGroup{} buffer = make([]byte, 200*32) dialer = &websocket.Dialer{} header = http.Header{} ) r, err := fromLocal("audio.wav") if err != nil { panic(err) return } signUrl, err := getWsSignUrl(kHost, accessKey, secretKey) if err != nil { panic(err) return } group.Add(2) header.Set("content-type", "application/json") conn, resp, err := dialer.Dial(signUrl, header) if err != nil { println(resp.Status) panic(err) } if err = conn.WriteMessage(websocket.BinaryMessage, []byte(`{"Configuration":{"SourceLanguage":"en","TargetLanguages":["zh"]}}`)); err != nil { panic(err) } go func() { defer group.Done() for { _, data, err := conn.ReadMessage() if err != nil { println(err.Error()) return } println(string(data)) } }() go func() { defer group.Done() for { _, err = r.Read(buffer) if err != nil { println(err.Error()) if err == io.EOF { if err = conn.WriteMessage(websocket.BinaryMessage, []byte(`{"End":true}`)); err != nil { panic(err) } } return } err = conn.WriteMessage(websocket.BinaryMessage, newAudioData(buffer)) if err != nil { panic(err) return } time.Sleep(200 * time.Millisecond) } }() group.Wait() } ``` -------------------------------- ### Java WebSocket Speech Translation Client Source: https://www.volcengine.com/docs/4640/127504 This Java example shows how to use the Volcengine TranslateService to create a signed WebSocket URL and stream audio for translation. It sends a configuration message with source and target languages, then sends audio data in chunks, and finally sends an end message. The code assumes the presence of TranslateConfig and Client classes. ```java //src/main/java/Main.java import translate.TranslateConfig; import translate.TranslateService; import websocket.Client; import java.io.File; import java.io.FileInputStream; import java.net.URI; import java.util.Base64; public class Main { public static void main(String[] args) throws Exception { File input = new File("audio.wav"); TranslateService translateService = new TranslateService(TranslateConfig.serviceInfo, TranslateConfig.apiInfoList); translateService.setAccessKey(TranslateConfig.accessKey); translateService.setSecretKey(TranslateConfig.secretKey); String signUrl = translateService.getSignUrl(TranslateConfig.api, null); URI url = new URI("wss://" + TranslateConfig.host + TranslateConfig.path + "?" + signUrl); System.out.println(url); // open websocket Client client = new Client(url); client.connectBlocking(); client.send("{\n" + " \"Configuration\": {\n" + " \"SourceLanguage\": \"zh\",\n" + " \"TargetLanguages\": [\n" + " \"en\"\n" + " ],\n" + " \"HotWordList\": [\n" + " {\n" + " \"Word\": \"hello\",\n" + " \"Scale\": 1\n" + " }\n" + " ]\n" + " }\n" + "}"); byte[] buffer = new byte[200 * 32]; int bytesLeft = 100 * 1024 * 1024; try (FileInputStream fis = new FileInputStream(input)) { while (bytesLeft > 0) { int read = fis.read(buffer, 0, Math.min(bytesLeft, buffer.length)); if (read == -1) { break; } client.send(bytesToMessage(buffer)); Thread.sleep(200); bytesLeft -= read; } } finally { client.send("{\n" + " \"End\": true\n" + "}"); } } static String bytesToMessage(byte[] data) { String base64Data = Base64.getEncoder().encodeToString(data); return "{\n" + " \"AudioData\": \"" + base64Data + "\"\n" + "}"; } } java ``` -------------------------------- ### 使用 Go 调用文本语种检测API Source: https://www.volcengine.com/docs/4640/65066 使用 volc-sdk-golang 进行语种检测的示例代码。通过配置 ServiceInfo 和 ApiInfoList 来初始化客户端并发送请求。 ```golang package main import ( "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{ "LangDetect": { Method: http.MethodPost, Path: "/", Query: url.Values{ "Action": []string{"LangDetect"}, "Version": []string{kServiceVersion}, }, }, } ) func newClient() *base.Client { client := base.NewClient(ServiceInfo, ApiInfoList) client.SetAccessKey(kAccessKey) client.SetSecretKey(kSecretKey) return client } func main() { client := newClient() resp, code, err := client.Json("LangDetect", nil, `{"TextList":["你好世界"]}`) if err != nil { panic(err) } fmt.Printf("%d %s\n", code, string(resp)) } ``` -------------------------------- ### Speech Translation with Golang SDK Source: https://www.volcengine.com/docs/4640/127504 Uses vcloud-sdk-golang and gorilla/websocket to interact with the translation service. Includes helper functions for reading local audio files and constructing the service client. ```go package main import ( "bytes" "encoding/json" "io" "io/ioutil" "net/http" "net/url" "os" "sync" "time" "github.com/gorilla/websocket" "github.com/volcengine/volc-sdk-golang/base" ) const ( accessKey = "accessKey" // https://console.volcengine.com/iam/keymanage/ secretKey = "secretKey" ) const ( kServiceVersion20200601 = "2020-06-01" kSpeechTranslateAction = "SpeechTranslate" kHost = "translate.volces.com" ) func fromLocal(path string) (*bytes.Reader, error) { f, err := os.Open(path) if err != nil { return nil, err } defer f.Close() data, err := ioutil.ReadAll(f) if err != nil { return nil, err } return bytes.NewReader(data), nil } func newServiceInfo(host string) *base.ServiceInfo { return &base.ServiceInfo{ Timeout: 5 * time.Second, Host: host, Header: http.Header{}, Credentials: base.Credentials{Region: base.RegionCnNorth1, Service: "translate"}, } } func newClient(host string, accessKey string, secretKey string) *base.Client { client := base.NewClient(newServiceInfo(host), map[string]*base.ApiInfo{ kSpeechTranslateAction: { Method: http.MethodGet, Path: "/api/translate/speech/v1/", Query: url.Values{ "Action": []string{kSpeechTranslateAction}, "Version": []string{kServiceVersion20200601}, }, }, }) client.SetAccessKey(accessKey) client.SetSecretKey(secretKey) return client } func newAudioData(data []byte) []byte { type AudioDataReq struct { AudioData []byte `json:"AudioData"` } audioData := &AudioDataReq{ AudioData: data, } b, err := json.Marshal(audioData) if err != nil { println(err.Error()) return []byte{0} } return b } ``` -------------------------------- ### 使用 Python 调用文本语种检测API Source: https://www.volcengine.com/docs/4640/65066 使用 volc-sdk-python 进行语种检测的示例代码。需配置 AccessKey 和 SecretKey,并设置正确的服务信息。 ```python import json from volcengine.ApiInfo import ApiInfo from volcengine.Credentials import Credentials from volcengine.ServiceInfo import ServiceInfo from volcengine.base.Service import Service k_access_key = '密钥管理中的 AccessKey ID' # https://console.volcengine.com/iam/keymanage/ k_secret_key = '密钥管理中的 AccessKey Secret' k_timeout = 5 # second k_service_info = \ ServiceInfo('translate.volcengineapi.com', {'Content-Type': 'application/json'}, Credentials(k_access_key, k_secret_key, 'translate', 'cn-north-1'), 5, 5) k_query = { 'Action': 'LangDetect', 'Version': '2020-06-01' } k_api_info = { 'langdetect': ApiInfo('POST', '/', k_query, {}, {}) } service = Service(k_service_info, k_api_info) body = { 'TextList': ['Hello world', 'こんにちは世界'], } print(service.json('langdetect', {}, json.dumps(body))) ``` -------------------------------- ### Node.js WebSocket语音翻译客户端 Source: https://www.volcengine.com/docs/4640/127504 使用vcloud-sdk-nodejs和ws库,通过WebSocket连接调用SpeechTranslate API。需要配置访问密钥和音频文件audio.wav。发送配置后,以200*32字节块读取音频并发送,最后发送End信号。 ```typescript import {Signer} from "@volcengine/openapi"; import {Credentials, RequestObj} from "@volcengine/openapi/lib/base/types"; import WebSocket from 'ws'; import * as fs from 'fs'; import {open} from 'node:fs/promises'; import {sleep} from "@volcengine/openapi/lib/services/rocketmq/utils/common"; const host = "translate.volces.com" const path = "/api/translate/speech/v1/" function getWebsocketUrl(): string { const openApiRequestData: RequestObj = { method: "GET", region: "cn-north-1", params: { Action: "SpeechTranslate", Version: "2020-06-01", }, pathname: "/api/translate/speech/v1/" }; const credentials: Credentials = { accessKeyId: "your access key", secretKey: "your secret key", }; const signer = new Signer(openApiRequestData, "translate"); return 'wss://' + host + path + '?' + signer.getSignUrl(credentials); } console.log(getWebsocketUrl()); const ws = new WebSocket(getWebsocketUrl()); ws.on('open', async () => { console.log("onopen") let configuration = { "Configuration": { "SourceLanguage": "en", "TargetLanguages": [ "zh" ], "HotWordList": [ { "Word": "hello", "Scale": 1 } ], "Extra": {} } }; ws.send(JSON.stringify(configuration)); let readStream = fs.createReadStream('audio.wav'); readStream.on('readable', async () => { let chunk = readStream.read(200 * 32); while (chunk !== null) { await sleep(200).catch(e => { console.error(e); }) let audio = { "AudioData": Buffer.from(chunk).toString("base64") }; ws.send(JSON.stringify(audio)); chunk = readStream.read(200 * 32); } ws.send(JSON.stringify({ "End": true })); }) }); ws.on('message', (data) => { console.log("%s", data); }); ws.on("close", () => { console.log("onclose") }); ws.on("error", (err) => { console.error(err) }); ws.on("ping", () => { console.log("headers") }); ws.on("pong", () => { }); typescript ``` -------------------------------- ### WEBSOCKET wss://translate.volces.com/api/translate/speech/v1/ Source: https://www.volcengine.com/docs/4640/127504 实时语音翻译API集成语音识别、智能断句、文本翻译等技术能力,可以将实时语音流、音频文件识别成文字并翻译成目标语言,达到“边说边译”的效果。 ```APIDOC ## WEBSOCKET wss://translate.volces.com/api/translate/speech/v1/ ### Description 实时语音翻译API集成语音识别、智能断句、文本翻译等技术能力,可以将实时语音流、音频文件识别成文字并翻译成目标语言,达到“边说边译”的效果。 ### Method WEBSOCKET ### Endpoint wss://translate.volces.com/api/translate/speech/v1/ ### Authentication 使用火山引擎鉴权sdk,详情参照公共参数。 | 参数名 | 值 | |---|---| | Version | 2020-06-01 | | Action | SpeechTranslate | | Path | /api/translate/speech/v1/ | ### Request Body 服务使用websocket协议。 #### Configuration 建立websocket之后第一包发送配置包如下: | 字段 | 类型 | 是否为必须项 | 说明 | 备注 | |---|---|---|---|---| | SourceLanguage | String | 是 | 源语言 | 仅支持zh ja en | | TargetLanguages | [String] | 是 | 目标语言 | 对齐文本翻译支持列表:语言支持 | | HotWordList | [Object] | 否 | 热词 | 在语音识别时,接口更倾向于识别成热词的内容 | ```json { "Configuration": { "SourceLanguage": "zh", "TargetLanguages": [ "en" ], "HotWordList": [ { "Word": "hello", "Scale": 1 } ] } } ``` #### AudioData 发送Configuratoin之后可以发送二进制数组的音频数据包,采样率为16000hz,单声道,使用base64编码,推荐每100-200ms发送一包。 | 字段 | 类型 | 是否为必须项 | 说明 | 备注 | |---|---|---|---|---| | AudioData | String | 是 | 音频包的base64编码 | 无 | ```json { "AudioData": "YQ==" } ``` #### End bool值,只要发送了就表示音频发送结束。 | 字段 | 类型 | 是否为必须项 | 说明 | 备注 | |---|---|---|---|---| | End | Bool | 是 | 音频包发送完成时发 | 不论true,false,server接收到包后会处理完剩余的音频包以及相关的翻译,全部结束后会断开websocket | ```json { "End": true } ``` ### Response #### Success Response | 字段 | 类型 | 说明 | 备注 | |---|---|---|---| | ResponseMetadata | ResponseMetadata | 通用字段 | 无 | | Subtitle | Object | 包含翻译结果、时间、语言等信息的结果 | 无 | Subtitle字段: | 字段 | 类型 | 说明 | 备注 | |---|---|---|---| | Text | String | 返回的结果 | 当某两个结果的Sequence和Definite一致时,结果中的Text分别代表原文及其译文 | | BeginTime | Int | 该文本识别的开始时间 | 无 | | EndTime | Int | 该文本识别的结束时间 | 无 | | Definite | Bool | 文本是否确定 | true:语音已结束;false:语音进行中 | | Language | String | 语言 | 无 | | Sequence | Int | 序列号 | 文本片段的序号 | ```json { "Subtitle": { "Text": "i'm elise hugh this is ted talk daily", "BeginTime": 4070, "EndTime": 6955, "Definite": false, "Language": "en", "Sequence": 8 }, "ResponseMetaData": { "RequestId": "7088303501725501476", "Action": "SpeechTranslate", "Version": "2020-06-01", "Service": "translate", "Region": "cn-north-1" } } ``` #### Error Response 在接口错误时,错误信息会在ResponseMetadata.Error中,包含了错误类型Code:: String和错误信息Message:: String两个字段。 | 错误码 | 说明 | |---|---| | -301 | 音频间隔过长 | | -400 | 请求参数错误,具体错误可参考Message信息 | | -401 | 未授权用户 | | -403 | 无权限 | | -429 | 请求过于频繁 | | -5xx | 翻译引擎内部错误 | | 100001-100021 | 通用错误 | ### Audio Requirements - 采样率:16000hz - 采样位:16 - 单声道 - 格式:wav或pcm(格式错误会导致识别效果差,返回时间戳错误等一系列问题,所以一定要确保自己发送的格式正确。) - 音频内容需使用base64编码 ``` -------------------------------- ### TranslateImage API with Python Source: https://www.volcengine.com/docs/4640/65105 Uses the volc-sdk-python to translate an image. Requires setting your AccessKey ID and Secret Key from the Volcengine console. ```python import json import requests import base64 import time from volcengine.ApiInfo import ApiInfo from volcengine.Credentials import Credentials from volcengine.ServiceInfo import ServiceInfo from volcengine.base.Service import Service # 示例图片url img_url = 'https://s1.ax1x.com/2020/07/07/UAtqnf.png' k_access_key = '密钥管理中的 AccessKey ID' # https://console.volcengine.com/iam/keymanage/ k_secret_key = '密钥管理中的 AccessKey Secret' k_timeout = 5 # second k_service_info = \ ServiceInfo('translate.volcengineapi.com', {'Content-Type': 'application/json'}, Credentials(k_access_key, k_secret_key, 'translate', 'cn-north-1'), 5, 5) k_query = { 'Action': 'TranslateImage', 'Version': '2020-07-01' } k_api_info = { 'translate': ApiInfo('POST', '/', k_query, {}, {}) } service = Service(k_service_info, k_api_info) img_data = requests.get(img_url).content img_base64 = str(base64.b64encode(img_data), encoding='utf8') body = { 'Image': img_base64, 'TargetLanguage': "zh"} res_data = service.json('translate', {}, json.dumps(body)) print(res_data) ``` -------------------------------- ### Submit and query audio translation task with volc-sdk-python Source: https://www.volcengine.com/docs/4640/78985 Uses the volc-sdk-python dependency to submit an audio translation task and poll for its result. Requires valid AccessKey ID and Secret from the Volcengine IAM console. The script prints the task ID, then polls every 60 seconds until the status becomes 'success', printing each subtitle's timing, text, and translation. ```python import json import time from volcengine.ApiInfo import ApiInfo from volcengine.Credentials import Credentials from volcengine.ServiceInfo import ServiceInfo from volcengine.base.Service import Service k_access_key = '密钥管理中的 AccessKey ID' # https://console.volcengine.com/iam/keymanage/ k_secret_key = '密钥管理中的 AccessKey Secret' k_timeout = 5 # second k_service_info = \ ServiceInfo('translate.volcengineapi.com', {'Content-Type': 'application/json'}, Credentials(k_access_key, k_secret_key, 'translate', 'cn-north-1'), 5, 5) k_api_info = { 'submit_audio': ApiInfo('POST', '/', { 'Action': 'SubmitAudio', 'Version': '2020-06-01' }, {}, {}), 'query_audio': ApiInfo('POST', '/', { 'Action': 'QueryAudio', 'Version': '2020-06-01' }, {}, {}), } service = Service(k_service_info, k_api_info) # 提交任务 submit_body = { 'SourceLanguage': 'en', 'TargetLanguage': 'zh', 'Uri': "http://xx/xx.mp4", } submit_result = json.loads(service.json('submit_audio', {}, json.dumps(submit_body))) task_id = submit_result["TaskId"] print(task_id) # 查询任务 status = "created" while status == "created": time.sleep(60) query_body = { 'TaskId': task_id, } query_result = json.loads(service.json('query_audio', {}, json.dumps(query_body))) status = query_result["Status"] print(status) if status == "success": for subtitle in query_result["Subtitles"]: print("{} - {}: {} -> {}".format(subtitle["StartTime"], subtitle["EndTime"], subtitle["Text"], subtitle["Translation"])) ``` -------------------------------- ### TranslateImage API with Go Source: https://www.volcengine.com/docs/4640/65105 Uses the volc-sdk-golang to translate an image. Requires configuring the ServiceInfo and ApiInfoList with your credentials. ```golang package main import ( "encoding/base64" "encoding/json" "fmt" "io/ioutil" "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-07-01" // 示例图片url imgUrl = "https://s1.ax1x.com/2020/07/07/UAtqnf.png" ) 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{ "TranslateImage": { Method: http.MethodPost, Path: "/", Query: url.Values{ "Action": []string{"TranslateImage"}, "Version": []string{kServiceVersion}, }, }, } ) func newClient() *base.Client { client := base.NewClient(ServiceInfo, ApiInfoList) client.SetAccessKey(kAccessKey) client.SetSecretKey(kSecretKey) return client } func main() { imgRes, _ := http.Get(imgUrl) defer imgRes.Body.Close() imgData, _ := ioutil.ReadAll(imgRes.Body) imgBase64 := base64.StdEncoding.EncodeToString(imgData) jsonBody := map[string]string{ "Image": imgBase64, "TargetLanguage": "zh"} body, _ := json.Marshal(jsonBody) client := newClient() res, code, err := client.Json("TranslateImage", nil, string(body)) if err != nil { panic(err) } fmt.Printf("%d %s\n", code, string(res)) } ``` -------------------------------- ### Java: Maven dependencies for WebSocket speech translation Source: https://www.volcengine.com/docs/4640/127504 Maven pom.xml snippet listing required dependencies for using Java WebSocket client, SLF4J logging, and the Volcengine Java SDK. Placeholders like {version} must be replaced with actual versions. ```xml javax.websocket javax.websocket-client-api {version} org.java-websocket Java-WebSocket 1{version} org.slf4j slf4j-simple {version} runtime org.slf4j slf4j-api {version} com.volcengine volc-sdk-java {version} ``` -------------------------------- ### TranslateConfig.java - Configure Speech Translate API Source: https://www.volcengine.com/docs/4640/127504 Defines access keys, API name, path, host, and service info for the Volcengine Speech Translate API. Sets connection and socket timeouts, headers, credentials, and API method/path/query parameters. ```java //src/main/java/translate/TranslateConfig.java package translate; import com.volcengine.helper.Const; import com.volcengine.model.ApiInfo; import com.volcengine.model.Credentials; import com.volcengine.model.ServiceInfo; import org.apache.http.Header; import org.apache.http.NameValuePair; import org.apache.http.message.BasicHeader; import org.apache.http.message.BasicNameValuePair; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; public class TranslateConfig { public static String accessKey = "your access key"; public static String secretKey = "your secret key"; public static String api = "SpeechTranslate"; public static String path = "/api/translate/speech/v1/"; public static String host = "translate.volces.com"; public static ServiceInfo serviceInfo = new ServiceInfo( new HashMap<>() { { put(Const.CONNECTION_TIMEOUT, 5000); put(Const.SOCKET_TIMEOUT, 5000); put(Const.Host, host); put(Const.Header, new ArrayList
() { { add(new BasicHeader("Accept", "application/json")); } }); put(Const.Credentials, new Credentials(Const.REGION_CN_NORTH_1, "translate")); } } ); public static Map apiInfoList = new HashMap<>() { { put(api, new ApiInfo( new HashMap<>() { { put(Const.Method, "GET"); put(Const.Path, path); put(Const.Query, new ArrayList() { { add(new BasicNameValuePair("Action", api)); add(new BasicNameValuePair("Version", "2020-06-01")); } }); } } )); } }; } ``` -------------------------------- ### TranslateImage API with Java Source: https://www.volcengine.com/docs/4640/65105 Snippet for using the volc-sdk-java to perform image translation. Assumes an existing translateService instance. ```java // byte[] input = new byte[10]; // read file String base64Image = Base64.getEncoder().encodeToString(input); TranslateImageRequest translateImageRequest = new TranslateImageRequest(); translateImageRequest.setTargetLanguage("zh"); translateImageRequest.setImage(base64Image); TranslateImageResponse translateImageResponse = translateService.translateImage(translateImageRequest); System.out.println(JSON.toJSONString(translateImageResponse.getResponseMetadata())); System.out.println(JSON.toJSONString(translateImageResponse.getResult())); byte[] output = Base64.getDecoder().decode(translateImageResponse.getImage()); // write file ``` -------------------------------- ### POST /submit-audio-translation-task Source: https://www.volcengine.com/docs/4640/78985 Submits an audio/video file translation task. This is the first step of the audio/video file translation API, which integrates speech recognition, intelligent sentence segmentation, and machine translation to process audio/video files. ```APIDOC ## POST /submit-audio-translation-task ### Description Submits an audio/video file translation task. This is the first step of the audio/video file translation API, which integrates speech recognition, intelligent sentence segmentation, and machine translation to process audio/video files. ### Method POST ### Endpoint Not specified in the source. The API is invoked via a POST request with the request body described below. ### Parameters #### Request Body - **SourceLanguage** (String) - Required - Source language. Supported values: en, zh, ko. - **TargetLanguage** (String) - Required - Target language. Supported values: en, zh, ko, ja, pt, fr, de, es. - **Uri** (String) - Required - URL of the video/audio file to be translated. It is recommended to use with video-on-demand service to avoid server-side download failures. ### Request Example { "SourceLanguage": "en", "TargetLanguage": "zh", "Uri": "http://xx/xx.mp4" } ### Response #### Success Response (200) - **ResponseMetadata** (ResponseMetadata) - Common metadata. - **TaskId** (String) - Task ID for querying the result later. #### Response Example { "TaskId": "asdasda", "ResponseMetadata": { "RequestId": "202004092306480100140440781F5D7119", "Action": "SubmitAudio", "Version": "2020-06-01", "Service": "translate", "Region": "cn-north-1", "Error": null } } ``` -------------------------------- ### Speech Translation with Python SDK Source: https://www.volcengine.com/docs/4640/127504 Uses volc-sdk-python and websocket-client to stream audio data to the translation service. Requires valid access and secret keys from the Volcengine console. ```python # 需要引入https://github.com/volcengine/volc-sdk-python import base64 import json import threading import time import websocket from volcengine.ApiInfo import ApiInfo from volcengine.Credentials import Credentials from volcengine.ServiceInfo import ServiceInfo from volcengine.base.Service import Service k_access_key = "k_access_key" # https://console.volcengine.com/iam/keymanage/ k_secret_key = "k_secret_key" k_host = 'translate.volces.com' k_path = '/api/translate/speech/v1/' k_timeout = 5 # second k_service_info = \ ServiceInfo(k_host, {'Content-Type': 'application/json'}, Credentials(k_access_key, k_secret_key, 'translate', 'cn-north-1'), 5, 5) k_query = { 'Action': 'SpeechTranslate', 'Version': '2020-06-01' } k_api_info = { 'SpeechTranslate': ApiInfo('GET', k_path, k_query, {}, {}) } file_path = './audio.wav' # 音频的文件 def get_websocket_url(): service = Service(k_service_info, k_api_info) url = 'wss://' + k_host + k_path + '?' + service.get_sign_url("SpeechTranslate", {}) return url def send_audio(ws): file = open(file_path, 'rb') while True: chunk = file.read(200 * 32) if not chunk: break audio = { "AudioData": base64.b64encode(chunk).decode('utf-8') } ws.send(json.dumps(audio)) time.sleep(0.2) end = { "End": True } ws.send(json.dumps(end)) def recv(ws): while True: print(ws.recv().decode("utf-8")) if __name__ == '__main__': websocket.enableTrace(False) ws = websocket.WebSocket() ws.connect(get_websocket_url(), header=["Content-Type: application/json"]) configuration = { "Configuration": { "SourceLanguage": "zh", "TargetLanguages": [ "en" ], "HotWordList": [ { "Word": "hello", "Scale": 1 } ] } } ws.send(json.dumps(configuration)) t2 = threading.Thread(target=recv, args=(ws,)) t1 = threading.Thread(target=send_audio, args=(ws,)) t2.start() t1.start() ``` -------------------------------- ### 提交音视频翻译任务请求与响应 Source: https://www.volcengine.com/docs/4640/78985 提交翻译任务的请求体包含源语言、目标语言和文件链接,响应返回任务ID。 ```json { "SourceLanguage": "en", "TargetLanguage": "zh", "Uri": "http://xx/xx.mp4" } ``` ```json { "TaskId": "asdasda", "ResponseMetadata": { "RequestId": "202004092306480100140440781F5D7119", "Action": "SubmitAudio", "Version": "2020-06-01", "Service": "translate", "Region": "cn-north-1", "Error": null } } ``` -------------------------------- ### 文本语种检测API 请求与返回样例 Source: https://www.volcengine.com/docs/4640/65066 展示了调用文本语种检测接口的JSON请求体格式以及对应的返回体结构,包含语言代码和置信度信息。 ```json { "TextList": [ "Hello world" ] } ``` ```json { "DetectedLanguageList": [ { "Language": "en", "Confidence": 1 } ], "ResponseMetadata": { "RequestId": "202004092241580100140440770840151B", "Action": "LangDetect", "Version": "2020-06-01", "Service": "translate", "Region": "cn-north-1", "Error": null } } ``` -------------------------------- ### Client.java - WebSocket Client for Speech Translate Source: https://www.volcengine.com/docs/4640/127504 Implements a WebSocket client that prints connection events and received messages. Handles both text and binary messages, and prints errors. ```java // src/main/java/websocket/Client.java package websocket; import org.java_websocket.client.WebSocketClient; import org.java_websocket.handshake.ServerHandshake; import java.net.URI; import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; public class Client extends WebSocketClient { public Client(URI serverUri) { super(serverUri); } @Override public void onOpen(ServerHandshake serverHandshake) { System.out.println("onopen"); } @Override public void onMessage(String s) { System.out.println("onmessage"); System.out.println(s); } @Override public void onMessage(ByteBuffer message) { System.out.println("onmessage"); System.out.println(new String(message.array(), StandardCharsets.UTF_8)); } @Override public void onClose(int i, String s, boolean b) { System.out.println("onclose"); } @Override public void onError(Exception e) { e.printStackTrace(); } } ``` -------------------------------- ### TranslateService.java - Extend BaseServiceImpl Source: https://www.volcengine.com/docs/4640/127504 Defines a service class that extends BaseServiceImpl, taking ServiceInfo and API info map as constructor arguments. Used to interact with the Volcengine Speech Translate API. ```java // src/main/java/translate/TranslateService.java package translate; import com.volcengine.model.ApiInfo; import com.volcengine.model.ServiceInfo; import com.volcengine.service.BaseServiceImpl; import java.util.Map; public class TranslateService extends BaseServiceImpl { public TranslateService(ServiceInfo info, Map apiInfoList) { super(info, apiInfoList); } } ``` -------------------------------- ### POST / Source: https://www.volcengine.com/docs/4640/65066 Detects the language of the provided text list. Supports 140 languages and returns the most reliable result. ```APIDOC ## POST / ### Description Detects the language of the provided text list. Supports 140 languages and returns the most reliable result. ### Method POST ### Endpoint / ### Parameters #### Request Body - **TextList** ([String]) - Required - The list of texts to detect. List length must not exceed 16. ### Request Example { "TextList": [ "Hello world" ] } ### Response #### Success Response (200) - **ResponseMetadata** (ResponseMetadata) - Common fields. - **DetectedLanguageList** ([DetectedLanguage]) - List of detected languages. - **Language** (String) - Detection result. - **Confidence** (Double) - Confidence score, range 0-1; higher means more reliable. #### Response Example { "DetectedLanguageList": [ { "Language": "en", "Confidence": 1 } ], "ResponseMetadata": { "RequestId": "202004092241580100140440770840151B", "Action": "LangDetect", "Version": "2020-06-01", "Service": "translate", "Region": "cn-north-1", "Error": null } } ``` -------------------------------- ### Java 音频翻译任务提交与查询 Source: https://www.volcengine.com/docs/4640/78985 该示例演示了创建翻译任务、等待处理以及根据任务 ID 查询翻译结果的完整调用流程。 ```java // 提交任务,获取任务ID TranslateAudioSubmitRequest translateAudioSubmitRequest = new TranslateAudioSubmitRequest(); translateAudioSubmitRequest.setSourceLanguage("en"); translateAudioSubmitRequest.setTargetLanguage("zh"); translateAudioSubmitRequest.setUri("http://xx/xx.mp4"); TranslateAudioSubmitResponse translateAudioSubmitResponse = translateService.translateAudioSubmit(translateAudioSubmitRequest); System.out.println(JSON.toJSONString(translateAudioSubmitResponse)); // 等待任务完成 Thread.sleep(5000); // 视频时长*0.3 // 查询结果 TranslateAudioQueryRequest translateAudioQueryRequest = new TranslateAudioQueryRequest(); translateAudioQueryRequest.setTaskId(translateAudioSubmitResponse.getTaskId()); TranslateAudioQueryResponse translateAudioQueryResponse = translateService.translateAudioQuery(translateAudioQueryRequest); System.out.println(JSON.toJSONString(translateAudioQueryResponse)); ```