长音频语音翻译

服务概述

  • 云上曲率的语音翻译,采用新一代NMT神经网络机器翻译技术,集成高精准度的语音识别和翻译能力,提供离在线融合解决方案。
  • 长音频的语音翻译,异步返回结果,支持轮询&回调查结果

服务申请

语音翻译API采用全流程自助申请的模式。在云上曲率官网(https://www.ilivedata.com/) 注册并激活账号后,在控制台创建语音翻译的项目,即可获得pid和服务密钥。

如需开通更多服务,可在管理控制台-总览页面开通其他服务。

音频提交

参数规范

请求URL: https://speech.ilivedata.com/api/v1/speech/translate/submit

HTTP请求头

请求头 描述
Content-Type application/json;charset=UTF-8 请求体类型
Accept application/json;charset=UTF-8 接受的返回类型
X-AppId 例:1000 项目或应用的唯一标识符
X-TimeStamp 例:2020-09-01T07:06:55Z 请求的UTC时间戳。需要把时间戳按W3C标准格式化,例如: 2010-01-31T23:59:59Z. (http://www.w3.org/TR/xmlschema-2/#dateTime)。
Authorization 例:Njl86M/jY6zZaZoGhZdGO+GI/8+yGFECusGH1yQHUFE= 签名值

请求方法:POST

请求体:

参数 子参数 必需 描述
speechLanguageCode 必需 音频对应的语种 支持语种
textLanguageCode 必需 文本语言码
uri 必需 音频或视频uri
video 可选 uri是否为视频文件(默认为False,表示uri文件为音频)
config codec 可选 编码格式,支持AMR_WB、OPUS、PCM、AMR。如未指定则默认使用AMR_WB
sampleRateHertz 可选 采样率,AMR只支持8000,其他编码格式只支持16000。
userId 可选 唯一的终端用户ID。 用户ID应当不超过32个字符。
alternativeLangCodes 可选 候选语种数组,最多支持传入4个候选语种 支持语种
callbackRegion 可选 回调区域:默认cn,可选cn、us、ap。
callbackUrl 可选 回调 url,http协议。 例 https://example.com/callback
callbackSecretKey 可选 回调密钥,可自行定义,需要在回调验签方式使用密钥一致,否则无法验证回调数据是否被篡改
textToSpeech 可选 语音到语音的翻译开关 True/False,默认为 False
textToSpeechConfig outputFormat 可选 选择输出合成音频编码,候选为pcm、mp3、opus,默认为pcm
voiceGender 可选 指定合成声音的性别 0-女生音色 / 1-男生音色,默认为 0
outputStrategy 可选 选择合成策略 0-整段合成 / 1-按片段合成,默认为 0
durationAlign 可选 合成音频时长与片段音频时长对齐,0(默认)-关,1-开。 备注:变速会影响听感,只针对outputStrategy=1 时生效,变速会出现一个音频前后语速不一致的情况

请求体示例

{
  "speechLanguageCode": "zh-CN",
  "textLanguageCode": "en",
  "config": {
        "codec": "OPUS",
        "sampleRateHertz": 16000
  },
  "uri":"https://example.com/test.wav",
  "callbackRegion":"cn",
  "callbackUrl":"https://example.com/callback",
  "callbackSecretKey":"YOUR_SECRETKEY",
  'textToSpeech':True,
  'textToSpeechConfig':{
      'voiceGender':'1',
      'outputFormat':'pcm',
      'outputStrategy':'0',
      'durationAlign':'1',
}

请求签名:

当用户请求Speech Recognition API时,可以使用appId和secretKey对请求做签名,当API收到带签名信息的请求之后,将使用相同的算法验证签名,如果发现签名不一致,API将会返回401给用户。

如果API验证签名一致,且appId对应的用户有权限操作请求的资源,则请求成功,否则API返回401。

通过 HTTP 请求 Header 发送签名

方法: 在请求中加入名为 Authorization 的 Header,值为签名值。如下:

Authorization: Njl86M/jY6zZaZoGhZdGO+GI/8+yGFECusGH1yQHUFE=

签名计算方法

1.构造规范化的请求字符串(Canonicalized Query String)

将请求体JSON字符串以UTF-8字符编码做sha256编码后转换为16进制字符串(注意不是Base64)

CanonicalizedQueryString = hex(sha256(jsonBody))

2.构造被签名字符串 StringToSign ("\n” 代表ASCII里的换行符)

StringToSign = HTTPMethod + "\n" +
               HostHeaderInLowercase + "\n" +
               HTTPRequestURI + "\n" +
               CanonicalizedQueryString <从上一步得到> + "\n" +
               "X-AppId:" + SAME_APPID_IN_HEADER + "\n" +
               "X-TimeStamp:" + SAME_TIMESTAMP_IN_HEADER

HTTPRequestURI是请求URI的绝对路径,不包含请求串。如果HTTPRequestURI为空,也要保留一个正斜杠 ( / )

使用 HMAC-SHA256 协议创建基于哈希的消息身份验证代码 (HMAC),然后计算签名。

3.StringToSign作为签名字符串,secretKey作为秘钥,SHA256作为哈希算法

有关 HMAC 的更多信息,请参阅 https://tools.ietf.org/html/rfc2104

4.将上一步的结果转换为BASE64串

5.将BASE64串放入HTTP请求Header的Authorization

签名示例

下面是appId & secretKey & audio的示例

appId=1000
secrectKey=****
audio_base64="https://example.com/test.wav"

下面是示例请求体

{"speechLanguageCode": "zh-CN", "textLanguageCode": "en", "config": {"codec": "AMR_WB", "sampleRateHertz": 16000}, "audio": "https://example.com/test.wav", "userId": "12345678"}

生成CanonicalizedQueryString

3ff89070a25e4091c94f03ad3cf014d712aaf9e069ef654b0e7e58b2b4550e31

生成StringToSign

POST
speech.ilivedata.com
/api/v1/speech/translate/submit
3ff89070a25e4091c94f03ad3cf014d712aaf9e069ef654b0e7e58b2b4550e31
X-AppId:1000
X-TimeStamp:2021-01-12T07:38:29Z

HMAC计算得到的签名

1nNkKezG9XgkbCau9aENhDDRJhoTMHAI85NnjY+Mm4k=

HTTP响应

字段名 子字段名 描述
errorCode 0表示成功
taskId 任务ID

响应示例

{
  "errorCode": 0,
  "taskId":"us_21c61c2f-6fbc-4c0e-b3b0-8a906fb4df8a_1698828479533"
}

结果查询

接口说明

用于客户主动轮询查结果,结果将以 taskId 为维度,将语音翻译结果返回给客户。

请求URL: https://speech.ilivedata.com/api/v1/speech/translate/result

HTTP请求Header:

Header 描述
Content-Type application/json;charset=UTF-8 请求体类型
Accept application/json;charset=UTF-8 接受的返回类型
X-AppId 项目或应用的唯一标识符
X-TimeStamp 请求的UTC时间戳。需要把时间戳按W3C标准格式化,例如: 2010-01-31T23:59:59Z. (http://www.w3.org/TR/xmlschema-2/#dateTime)。
Authorization 签名值

请求方法:POST

请求体:

参数 必需 描述
taskId 必需 任务ID

请求体示例

{
  "taskId": "us_a0cf4d0c-4804-484d-96e1-9ebf1e42d37d_1614329510676"
}

请求签名:

当用户请求Speech Recognition API时,可以使用appId和secretKey对请求做签名,当API收到带签名信息的请求之后,将使用相同的算法验证签名,如果发现签名不一致,API将会返回401给用户。

如果API验证签名一致,且appId对应的用户有权限操作请求的资源,则请求成功,否则API返回401。

通过 HTTP 请求 Header 发送签名

方法: 在请求中加入名为 Authorization 的 Header,值为签名值。如下:

Authorization: Njl86M/jY6zZaZoGhZdGO+GI/8+yGFECusGH1yQHUFE=

签名计算方法

1.构造规范化的请求字符串(Canonicalized Query String)

将请求体JSON字符串以UTF-8字符编码做sha256编码后转换为16进制字符串(注意不是Base64)

CanonicalizedQueryString = hex(sha256(jsonBody))

2.构造被签名字符串 StringToSign ("\n” 代表ASCII里的换行符)

StringToSign = HTTPMethod + "\n" + 
               HostHeaderInLowercase + "\n" + 
               HTTPRequestURI + "\n" + 
               CanonicalizedQueryString <从上一步得到> + "\n" +
               "X-AppId:" + SAME_APPID_IN_HEADER + "\n" + 
               "X-TimeStamp:" + SAME_TIMESTAMP_IN_HEADER

HTTPRequestURI是请求URI的绝对路径,不包含请求串。如果HTTPRequestURI为空,也要保留一个正斜杠 ( / ) 使用 HMAC-SHA256 协议创建基于哈希的消息身份验证代码 (HMAC),然后计算签名。

3.StringToSign作为签名字符串,secretKey作为秘钥,SHA256作为哈希算法

有关 HMAC 的更多信息,请参阅 https://tools.ietf.org/html/rfc2104

4.将上一步的结果转换为BASE64串

5.将BASE64串放入HTTP请求Header的Authorization

签名示例

下面是appId & secretKey的示例

appId=1000
secrectKey=d9e23d93053f49ade2f8fce185acedd4

下面是示例请求体

{"taskId": "us_a0cf4d0c-4804-484d-96e1-9ebf1e42d37d_1614329510676"}

生成CanonicalizedQueryString

a18830926600e82dbb6c464ce60f2c6c62d53ed3f3f24123fc09fbdc4e17b5ff

生成StringToSign

POST
speech.ilivedata.com
/api/v1/speech/translate/result
a18830926600e82dbb6c464ce60f2c6c62d53ed3f3f24123fc09fbdc4e17b5ff
X-AppId:1000
X-TimeStamp:2021-02-26T09:11:42Z

HMAC计算得到的签名

cv3tQcZpKJhvrivA/pb0vd+FAd0ifrqZ36Fp/Hc05vY=

HTTP响应

Content-Type: application/json;charset=UTF-8 结果为JSON格式,请参考以下示例。

HTTP响应返回json字段说明:

字段名 子字段名 描述
errorCode 错误代码
errorMessage 错误消息
taskId 任务ID
status 任务状态。0:成功, 1:失败, 2:处理中
source 音频源语言
target 翻译目标语言
translation startTime 区间开始时间
endTime 区间结束时间
sourceText 从音频中识别出的文本
targetText 翻译后目标语言后的文本
targetAudio 翻译后对应的语音,outputStrategy=1时返回
targetAudio 翻译后对应的语音,outputStrategy=0时返回

响应示例

{
    "errorCode": 0,
    "taskId":"us_21c61c2f-6fbc-4c0e-b3b0-8a906fb4df8a_1698828479533",
    "source": "zh-CN",
    "status": 0,
    "target": "en",
    "translation": 
    [{
      "startTime":0.01,
      "endTime":1.98,
      "sourceText": "你好!",
      "targetText": "Hello!",
      "targetAudio": "https://xxxx"//outputStrategy=1
    },...], 
    "targetAudio": "https://xxxx"//outputStrategy=0
}

结果回调

回调接口概述

针对于语音翻译结果的回调,用于将异步结果推送给客户,客户需要按照以下规范实现接收结果的接口。

接口说明

结果将以 taskId 为维度,将语音翻译结果推送给客户。如需使用回调功能,请参见回调规范。

接口鉴权

客户可通过配置完回调参数后分配的密钥信息字段进行接口鉴权。具体方式如下:

  • 签名算法

    1> 将接受的的请求体参数按照ASCII码表升序顺序排序。

    2> 将排序好的参数 append 成字符串。格式为:key1 + value1 +key2 + value2…。

    3> 将配置完回调参数后生成的密钥 append 到 2> 步骤生成的字符串后。

    4> 将 3> 步骤生成的字符串使用 UTF-8 进行编码,使用 MD5 进行加密生成 signature 参数值,并将其放入 请求 header 中。

  • 示例代码

    /**
     * 生成签名
     * @param secretKey 后台密钥
     * @param params 接口请求参数名和参数值map,不包括signature参数名
     * @return
     */    
    public static String signature(String secretKey, Map<String, String> params){
    
        String[] keys = params.keySet().toArray(new String[0]);
        Arrays.sort(keys);
    
        StringBuilder signBuilder = new StringBuilder();
        for (String key : keys) {
          signBuilder.append(key).append(params.get(key));
        }
        signBuilder.append(secretKey);
    
        try {
          return DigestUtils.md5Hex(signBuilder.toString().getBytes("UTF-8"));
        } catch (UnsupportedEncodingException e) {
          // error
        }
        return null;
    }
    

接入说明

  • 协议说明:客户方需提供支持 http 协议的 post 请求方式的接口。
  • 接口性能:客户需保持接口的稳定性与可靠性。
  • 失败重试:我们在收到客户回调响应后,如果不符合规定的接受成功规范,则认为此次推送失败。将以规定间隔时间 10s 推送 3 次,如果第三次继续失败将不再继续推送。如要获取结果则调用主动查询结果接口。

请求说明

  • 请求地址及方式

    名称
    callbackUrl 回调地址url(http协议)
    HTTP_METHOD POST
  • 请求头

    名称 类型 必填 说明
    Content-Type String 固定值:application/json
    signature String 签名,验证请求的合法性,参照鉴权算法
  • 请求参数

    名称 类型 说明
    appId String 所属项目ID
    taskId String 提交异步任务时,返回的任务id
    result String 语音翻译结果
    checkType String 固定值"speech-translation"
  • 回调请求示例

{
  "appId": "91300001",
  "taskId": "test_21c61c2f-6fbc-4c0e-b3b0-8a906fb4df8a_1698828479533",
  "result": "{\"errorCode\":0,\"taskId\":\"test_21c61c2f-6fbc-4c0e-b3b0-8a906fb4df8a_1698828479533\",\"source\":\"zh-CN\",\"target\":\"en\",\"translation\":[{\"startTime\":0.15,\"endTime\":1.15,\"sourceText\":\"你好!\",\"targetText\":\"hello!\"}]}",
  "checkType": "speech-translation"
}
  • 请求响应

    客户接口接收到我们回调的结果后,需要返回应答信息,接口响应 code 状态码为 0,当回调处理异常时,应答的 code 状态码应为 500,或者 4xx; 应答信息为json格式,字段定义如下:

    名称 类型 必填 说明
    code Number 应答code,code 值为 0 代表此次回调成功
    message String 具体描述信息

回调结果result规范

字段名 子字段名 描述
errorCode 0表示成功
taskId 任务ID
source 音频源语言
target 翻译目标语言
translation startTime 区间开始时间
endTime 区间结束时间
sourceText 从音频中识别出的文本
targetText 翻译后目标语言后的文本
targetAudio 翻译后对应的语音,outputStrategy=1时返回
targetAudio 翻译后对应的语音,outputStrategy=0时返回

回调结果result示例

{
    "errorCode": 0,
    "taskId":"us_21c61c2f-6fbc-4c0e-b3b0-8a906fb4df8a_1698828479533",
    "source": "zh-CN",
    "target": "en",
    "translation": 
    [{
      "startTime":0.01,
      "endTime":1.98,
      "sourceText": "你好!",
      "targetText": "Hello!",
      "targetAudio": "https://xxxx"//outputStrategy=1
    },...], 
    "targetAudio": "https://xxxx"//outputStrategy=0
}

错误码

HTTP状态码 错误码 错误消息
200 0 no message
429 1104 Out of Rate Limit
429 1105 Out of Quotas
405 1004 Method Not Allowed
411 1007 Not Content Length
400 1002 API Not Found
400 1003 Bad Request
400 2000 Missing Parameter
400 2001 Invalid Parameter
400 2002 Invalid Request
400 2102 Input Too Long
400 2109 Speech Recognition Failed
400 2110 File is invalid
400 2111 Failed to download file
400 2112 TaskId is invalid
401 1102 Unauthorized Client
401 1106 Missing Access Token
401 1107 Invalid Token
401 1108 Expired Token
401 1110 Invalid Client
401 2000 Missing Parameter
401 2001 Invalid Parameter
401 2002 Invalid Request
401 2003 Invalid Scope
401 2004 Unsupported Response Type
401 2100 Translation Failed
401 2101 No Match
401 2103 Detection Failed
401 2104 Language Not Supported
401 2105 Normalization Failed
401 2106 Inappropriate Word Used
401 2107 Invoke Service Failed
401 2108 Service Unavaliable