1. 接口说明
性别年龄识别,即机器对说话者的年龄大小以及性别属性进行分析,可以通过收到的音频数据判定发音人的性别(男,女)及年龄范围(小孩,中年,老人),对语音内容和语种不做限制。
该语音能力是通过Websocket API的方式给开发者提供一个通用的接口。Websocket API具备流式传输能力,适用于需要流式数据传输的AI服务场景,比如边说话边识别。相较于SDK,API具有轻量、跨语言的特点;相较于HTTP API,Websocket API协议有原生支持跨域的优势。
2. 接口Demo
示例demo请点击 这里 下载。目前仅提供部分开发语言的demo,其他语言请参照下方接口文档进行开发。也欢迎热心的开发者到 讯飞开放平台社区 分享你们的demo。
3. 接口要求
集成性别年龄识别API时,需按照以下要求。
内容 | 说明 |
---|---|
请求协议 | wss |
请求地址 | wss://ws-api.xfyun.cn/v2/igr |
请求行 | GET /v2/igr HTTP/1.1 |
接口鉴权 | 签名机制,详情请参照下方接口鉴权 |
字符编码 | UTF-8 |
响应格式 | 统一采用JSON格式 |
开发语言 | 任意,只要可以向讯飞云服务发起Websocket请求的均可 |
操作系统 | 任意 |
音频属性 | 采样率16k或8K、位长16bit、单声道 |
音频格式 | PCM、WAV、SPEEX、AMR,样例音频可点击 这里 下载 |
音频大小 | 最长10s,大小不得超过320K。建议持续发音5s左右,太短会影响识别效果 |
音频内容 | 任意 |
语言种类 | 任意 |
4. 接口调用流程
· 通过接口密钥基于hamc-sha256计算签名,向服务器端发送Websocket协议握手请求。详见下方 接口鉴权 。
· 握手成功后,客户端通过Websocket连接同时上传和接收数据。数据上传完毕,客户端需要上传一次数据结束标识。详见下方 接口数据传输与接收 。
· 接收到服务器端的结果全部返回标识后断开Websocket连接。
4.1. 接口鉴权
在握手阶段,请求方需要对请求进行签名,服务端通过签名来校验请求的合法性。
4.1.1. 鉴权方法
通过在请求地址后面加上鉴权相关参数的方式。示例url:
wss://ws-pi.xfyun.cn/v2/igr?authorization=aG1hYyB1c2VybmFtZT0iMTAwSU1FIiwgYWxnb3JpdGhtPSJobWFjLXNoYTI1NiIsIGhlYWRlcnM9Imhvc3QgZGF0ZSByZXF1ZXN0LWxpbmUiLCBzaWduYXR1cmU9IlVSbnk4M3o1elJsNWF1ODl1YXhUL1dGdUtWejZVNkdkWDdDV25SMGdueWc9Ig%3D%3D&date=Tue%2C+18+Dec+2018+09%3A08%3A49+UTC&host=10.1.87.70%3A8000
鉴权参数:
参数 | 类型 | 必须 | 说明 | 示例 |
---|---|---|---|---|
host | string | 是 | 请求主机 | ws-api.xfyun.cn |
date | string | 是 | 当前时间戳,RFC1123格式(Mon, 02 Jan 2006 15:04:05 GMT) | Fri, 18 Jan 2019 07:21:29 UTC |
authorization | string | 是 | 使用base64编码的签名相关信息(签名基于hamc-sha256计算) | 参考下方authorization参数生成规则 |
· date参数生成规则:
date必须是UTC+0或GMT时区,RFC1123格式(Mon, 02 Jan 2006 15:04:05 GMT)。服务端会对Date进行时钟偏移检查,最大允许300秒的偏差,超出偏差的请求都将被拒绝。
· authorization参数生成规则:
1)获取接口密钥APIKey 和 APISecret。在讯飞开放平台控制台,创建WebAPI平台应用并添加性别年龄识别服务后即可查看,均为32位字符串。
2)参数authorization base64编码前(authorization_origin)的格式如下。
api_key="$api_key",algorithm="hmac-sha256",headers="host date request-line",signature="$signature"
其中 api_key 是在控制台获取的APIKey,algorithm 是加密算法(仅支持hmac-sha256),headers 是参与签名的参数。signature 是使用加密算法对参与签名的参数签名后并使用base64编码的字符串,详见下方。
3)signature的原始字段(signature_origin)规则如下。
signature原始字段由 host,date,request-line三个参数按照格式拼接成,拼接的格式为(\n为换行符,’:’后面有一个空格):
host: $host\ndate: $date\n$request-line
例如,请求的url为 wss://ws-api.xfyun.cn/v2/igr那么 signature原始字段(signature_origin)则为:
host: ws-api.xfyun.cn
date: Fri, 18 Jan 2019 07:21:29 UTC
GET /v2/igr HTTP/1.1
4)使用hmac-sha256算法结合apiSecret对signature_origin签名,获得签名后的摘要signature_sha。
signature_sha=hmac-sha256(signature_origin,$apiSecret)
其中 apiSecret 是在控制台获取的APISecret
5)使用base64编码对signature_sha进行编码获得最终的signature。
signature=base64(signature_sha)
6)authorization_origin示例如下。假设 api_key=23b18a1e80cf334f81b0ade291629a536f,参照上述2-4的方法生成的signature=clHXo7gfpxwjhC5vcRt2haKNosUfG8I7b8PMyT9pJEs=。那么生成的base64编码前authorization_origin参数为:
api_key="23b18a1e80cf334f81b0ade291629a536f", algorithm="hmac-sha256", headers="host date request-line", signature="clHXo7gfpxwjhC5vcRt2haKNosUfG8I7b8PMyT9pJEs="
7)最后再对authorization_origin进行base64编码获得最终的authorization参数。
authorization = base64(authorization_origin)
4.1.2. 鉴权url示例(golang)
//@hosturl : like wss://ws-api.xfyun.cn/v2/iat
//@apikey : apiKey
//@apiSecret : apiSecret
func assembleAuthUrl(hosturl string, apiKey, apiSecret string) string {
ul, err := url.Parse(hosturl)
if err != nil {
fmt.Println(err)
}
//签名时间
date := time.Now().UTC().Format(time.RFC1123)
//参与签名的字段 host ,date, request-line
signString := []string{"host: " + ul.Host, "date: " + date, "GET " + ul.Path + " HTTP/1.1"}
//拼接签名字符串
sgin := strings.Join(signString, "\n")
//签名结果
sha := HmacWithShaTobase64("hmac-sha256", sgin, apiSecret)
//构建请求参数 此时不需要urlencoding
authUrl := fmt.Sprintf("api_key=\"%s\", algorithm=\"%s\", headers=\"%s\", signature=\"%s\"", apiKey,
"hmac-sha256", "host date request-line", sha)
//将请求参数使用base64编码
authorization:= base64.StdEncoding.EncodeToString([]byte(authUrl))
v := url.Values{}
v.Add("host", ul.Host)
v.Add("date", date)
v.Add("authorization", authorization)
//将编码后的字符串url encode后添加到url后面
callurl := hosturl + "?" + v.Encode()
return callurl
}
4.1.3. 鉴权结果
如果握手成功,会返回HTTP 101状态码,表示协议升级成功;如果握手失败,则根据不同错误类型返回不同HTTP Code状态码,同时携带错误描述信息,详细错误说明如下:
HTTP Code | 说明 | 错误描述信息 |
---|---|---|
401 | 缺少authorization请参数 | {“message”:”Unauthorized”} |
403 | 时钟偏移校验失败 | {“message”:”HMAC signature cannot be verified, a valid date or x-date header is required for HMAC Authentication”} |
403 | 签名参数解析失败 | {“message”:”HMAC signature cannot be verified”} |
403 | 签名校验失败 | {“message”:”HMAC signature does not match”} |
握手失败返回示例:
HTTP/1.1 403 Forbidden
Date: Thu, 06 Dec 2018 07:55:16 GMT
Content-Length: 116
Content-Type: text/plain; charset=utf-8
{
"message": "HMAC signature does not match"
}
4.2. 接口数据传输与接收
握手成功后客户端和服务端会建立Websocket连接,客户端通过Websocket连接可以同时上传和接收数据。当服务端有识别结果时,会通过Websocket连接推送识别结果到客户端。
发送数据时,建议每次发送音频间隔40ms,每次发送音频字节数1280B。如果间隔时间太短,可能会导致引擎识别有误。数据上传完毕,客户端需要上传一次数据结束标识表示会话已结束,详见下方data参数说明。
4.2.1. 请求参数
请求数据均为json字符串
参数名 | 类型 | 必传 | 描述 |
---|---|---|---|
common | object | 是 | 公共参数,仅在握手成功后首帧请求时上传,详见下方 |
business | object | 是 | 业务参数,仅在握手成功后首帧请求时上传,详见下方 |
data | object | 是 | 业务数据流参数,在握手成功后的所有请求中都需要上传,详见下方 |
公共参数说明(common)
参数名 | 类型 | 必传 | 描述 |
---|---|---|---|
app_id | string | 是 | 在平台申请的APPID信息 |
uid | string | 否 | 请求用户服务返回的uid,用户及设备级别个性化功能依赖此参数 |
注: 以上参数只需要在握手成功后的第一帧请求时带上。
业务参数说明(business)
参数名 | 类型 | 必传 | 描述 |
---|---|---|---|
ent | string | 是 | 引擎类型,目前仅支持igr |
aue | string | 是 | 音频格式raw:原生音频数据pcm格式speex:speex格式(rate需设置为8000)speex-wb:宽频speex格式(rate需设置为16000)amr:amr格式(rate需设置为8000)amr-wb:宽频amr格式(rate需设置为16000) |
rate | int | 是 | 音频采样率 16000/8000 |
注: SPEEX格式仅支持讯飞定制speex编码,压缩等级为7,编解码工具请点击 这里 下载。
业务参数说明(data)
参数名 | 类型 | 必传 | 描述 |
---|---|---|---|
status | int | 是 | 音频的状态0 :第一帧音频1 :中间的音频2 :最后一帧音频,最后一帧必须要发送 |
audio | string | 是 | 音频的数据,需进行base64编码 |
请求参数示例:
{
"common":{
// 公共请求参数
"app_id":"123456"
},
"business":{
"aue": "raw",
"rate": "16000"
},
"data":{
"status":0,
"audio":"exSI6ICJlbiIsCgkgICAgInBvc2l0aW9uIjogImZhbHNlIgoJf..."
}
}
数据上传结束标识示例:
{
"data":{
"status":2
}
}
4.2.2. 返回参数
参数名 | 类型 | 描述 |
---|---|---|
sid | string | 本次会话的id,只在握手成功后第一帧请求时返回 |
code | int | 返回码,0表示成功,其它表示异常,详情请参考错误码 |
message | string | 描述信息 |
data | json | 性别年龄识别返回信息,详见下方 |
data字段具体信息
参数名 | 类型 | 描述 |
---|---|---|
status | int | 返回结果状态1:后续还会有结果2:结果已经全部返回,客户端可以关闭连接 |
result | object | 返回数据的具体对象 |
result.age | object | 识别的年龄数据对象 |
result.age.age_type | string | 表示识别的年龄0:middle1:child2:old |
result.gender | object | 识别的性别数据对象 |
result.gender.gender_type | string | 表示识别的性别0:女性1:男性 |
返回参数示例
{
"code": 0,
"message": "success",
"data": {
"result": {
"age": {
"age_type": "1",
"child": "0.4887",
"middle": "0.3180",
"old": "0.1933"
},
"gender": {
"female": "0.5933",
"gender_type": "0",
"male": "0.4067"
}
},
"status": 2
}
}
5. 错误码
错误码 | 错误描述 | 说明 | 处理方式 |
---|---|---|---|
10003 | Too long audio | 音频过长 | 检查音频长度是否超过了10s |
10005 | licc fail appid | 授权失败 | 申请appid权限 |
10006 | Get audio rate fail | 获取rate参数失败 | 检查是否传了rate参数 |
10007 | Invalid rate rate | 参数不合法 | 检查rate参数是否是16000或8000 |
10043 | Syscall AudioCodingDecode error | 音频解码失败 | 检查aue参数,如果为speex,请确保音频是speex音频并分段压缩且与帧大小一致 |
10139 | invalid param | 参数错误 | 检查business 参数是否正确 |
10221 | cannot find business srv | 没有可用连接 | 请到控制台提交工单联系技术人员 |
10222 | Remote LB,cannot find valued lb | LB找不到有效节点 | 请到控制台提交工单联系技术人员 |
10223 | RemoteLB: can’t find valued addr | lb 找不到节点 | 请到控制台提交工单联系技术人员 |
10225 | Finder: can’t find busin service | 找不到atmos | 请到控制台提交工单联系技术人员 |
10313 | AppId is empty | appid为空 | 检查是否传了appid |
10317 | invalid version | 版本非法 | 请到控制台提交工单联系技术人员 |
11200 | auth no license | 没有权限 | 检查是否开通了该服务 |
11201 | auth no enough license | 权限不足 | 检查是否拥有该服务的权限 |
30101 | invalid character ‘m’ looking for beginning of value | 请求数据格式非法 | 检查请求数据是否是合法的json |
30103 | illegal base64 data at input byte 0 | base64解码失败 | 检查发送的数据是否使用base64编码了 |
30104 | cannot find status because datalist is nil | 获取的data为空 | 检查是否传了data字段 |
30105 | audio not found in object | 服务端无法解析引擎返回数据 | 请到控制台提交工单联系技术人员 |
30200 | read tcp 10.1.87.70:8888-\u003e10.1.107.8:51356: i/o timeout | 读取数据超时 | 检查是否累计10s未发送数据并且未关闭连接 |
30201 | session timeout | session超时 | 会话时间超时,检查是否发送数据时间超过了60s |
30403 | invalid appid | appid和apikey不匹配 | 检查appid是否合法 |
31301 | can cannot find filed /data | 解析内部响应数据失败 | 请到控制台提交工单联系技术人员 |
31302 | Response_Data_Type`(%v) is error | 解析返回数据错误 | 请到控制台提交工单联系技术人员 |
31303 | server error :atmos return an error data | 服务内部响应数据错误 | 请到控制台提交工单联系技术人员 |
31502 | server error: too many datas in resp | 服务配置错误 | 请到控制台提交工单联系技术人员 |
31400 | server cannot parse response data | 服务端无法解析后端响应数据 | 请到控制台提交工单联系技术人员 |
6. 调用示例
注: 其他开发语言请参照 接口调用流程 进行开发,也欢迎热心的开发者到 讯飞开放平台社区 分享你们的demo。
7. 音频样例
注: 音频文件格式转换工具请参考这里 ffmpeg
Copyright © iflytek.com 2018 all right reserved,powered by Gitbook该文件修订时间:2019-05-07 07:12:51