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:

  1. 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

鉴权参数:

参数类型必须说明示例
hoststring请求主机ws-api.xfyun.cn
datestring当前时间戳,RFC1123格式(Mon, 02 Jan 2006 15:04:05 GMT)Fri, 18 Jan 2019 07:21:29 UTC
authorizationstring使用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)的格式如下。

  1. 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为换行符,’:’后面有一个空格):

  1. host: $host\ndate: $date\n$request-line

例如,请求的url为 wss://ws-api.xfyun.cn/v2/igr那么 signature原始字段(signature_origin)则为:

  1. host: ws-api.xfyun.cn
  2. date: Fri, 18 Jan 2019 07:21:29 UTC
  3. GET /v2/igr HTTP/1.1

4)使用hmac-sha256算法结合apiSecret对signature_origin签名,获得签名后的摘要signature_sha。

  1. signature_sha=hmac-sha256(signature_origin,$apiSecret)

其中 apiSecret 是在控制台获取的APISecret

5)使用base64编码对signature_sha进行编码获得最终的signature。

  1. signature=base64(signature_sha)

6)authorization_origin示例如下。假设 api_key=23b18a1e80cf334f81b0ade291629a536f,参照上述2-4的方法生成的signature=clHXo7gfpxwjhC5vcRt2haKNosUfG8I7b8PMyT9pJEs=。那么生成的base64编码前authorization_origin参数为:

  1. api_key="23b18a1e80cf334f81b0ade291629a536f", algorithm="hmac-sha256", headers="host date request-line", signature="clHXo7gfpxwjhC5vcRt2haKNosUfG8I7b8PMyT9pJEs="

7)最后再对authorization_origin进行base64编码获得最终的authorization参数。

  1. authorization = base64(authorization_origin)

4.1.2. 鉴权url示例(golang)

  1. //@hosturl : like wss://ws-api.xfyun.cn/v2/iat
  2. //@apikey : apiKey
  3. //@apiSecret : apiSecret
  4. func assembleAuthUrl(hosturl string, apiKey, apiSecret string) string {
  5. ul, err := url.Parse(hosturl)
  6. if err != nil {
  7. fmt.Println(err)
  8. }
  9. //签名时间
  10. date := time.Now().UTC().Format(time.RFC1123)
  11. //参与签名的字段 host ,date, request-line
  12. signString := []string{"host: " + ul.Host, "date: " + date, "GET " + ul.Path + " HTTP/1.1"}
  13. //拼接签名字符串
  14. sgin := strings.Join(signString, "\n")
  15. //签名结果
  16. sha := HmacWithShaTobase64("hmac-sha256", sgin, apiSecret)
  17. //构建请求参数 此时不需要urlencoding
  18. authUrl := fmt.Sprintf("api_key=\"%s\", algorithm=\"%s\", headers=\"%s\", signature=\"%s\"", apiKey,
  19. "hmac-sha256", "host date request-line", sha)
  20. //将请求参数使用base64编码
  21. authorization:= base64.StdEncoding.EncodeToString([]byte(authUrl))
  22. v := url.Values{}
  23. v.Add("host", ul.Host)
  24. v.Add("date", date)
  25. v.Add("authorization", authorization)
  26. //将编码后的字符串url encode后添加到url后面
  27. callurl := hosturl + "?" + v.Encode()
  28. return callurl
  29. }

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”}

握手失败返回示例:

  1. HTTP/1.1 403 Forbidden
  2. Date: Thu, 06 Dec 2018 07:55:16 GMT
  3. Content-Length: 116
  4. Content-Type: text/plain; charset=utf-8
  5. {
  6. "message": "HMAC signature does not match"
  7. }

4.2. 接口数据传输与接收

握手成功后客户端和服务端会建立Websocket连接,客户端通过Websocket连接可以同时上传和接收数据。当服务端有识别结果时,会通过Websocket连接推送识别结果到客户端。

发送数据时,建议每次发送音频间隔40ms,每次发送音频字节数1280B。如果间隔时间太短,可能会导致引擎识别有误。数据上传完毕,客户端需要上传一次数据结束标识表示会话已结束,详见下方data参数说明。

4.2.1. 请求参数

请求数据均为json字符串

参数名类型必传描述
commonobject公共参数,仅在握手成功后首帧请求时上传,详见下方
businessobject业务参数,仅在握手成功后首帧请求时上传,详见下方
dataobject业务数据流参数,在握手成功后的所有请求中都需要上传,详见下方

公共参数说明(common)

参数名类型必传描述
app_idstring在平台申请的APPID信息
uidstring请求用户服务返回的uid,用户及设备级别个性化功能依赖此参数

注: 以上参数只需要在握手成功后的第一帧请求时带上。

业务参数说明(business)

参数名类型必传描述
entstring引擎类型,目前仅支持igr
auestring音频格式raw:原生音频数据pcm格式speex:speex格式(rate需设置为8000)speex-wb:宽频speex格式(rate需设置为16000)amr:amr格式(rate需设置为8000)amr-wb:宽频amr格式(rate需设置为16000)
rateint音频采样率 16000/8000

注: SPEEX格式仅支持讯飞定制speex编码,压缩等级为7,编解码工具请点击 这里 下载。

业务参数说明(data)

参数名类型必传描述
statusint音频的状态0 :第一帧音频1 :中间的音频2 :最后一帧音频,最后一帧必须要发送
audiostring音频的数据,需进行base64编码

请求参数示例:

  1. {
  2. "common":{
  3. // 公共请求参数
  4. "app_id":"123456"
  5. },
  6. "business":{
  7. "aue": "raw",
  8. "rate": "16000"
  9. },
  10. "data":{
  11. "status":0,
  12. "audio":"exSI6ICJlbiIsCgkgICAgInBvc2l0aW9uIjogImZhbHNlIgoJf..."
  13. }
  14. }

数据上传结束标识示例:

  1. {
  2. "data":{
  3. "status":2
  4. }
  5. }

4.2.2. 返回参数

参数名类型描述
sidstring本次会话的id,只在握手成功后第一帧请求时返回
codeint返回码,0表示成功,其它表示异常,详情请参考错误码
messagestring描述信息
datajson性别年龄识别返回信息,详见下方

data字段具体信息

参数名类型描述
statusint返回结果状态1:后续还会有结果2:结果已经全部返回,客户端可以关闭连接
resultobject返回数据的具体对象
result.ageobject识别的年龄数据对象
result.age.age_typestring表示识别的年龄0:middle1:child2:old
result.genderobject识别的性别数据对象
result.gender.gender_typestring表示识别的性别0:女性1:男性

返回参数示例

  1. {
  2. "code": 0,
  3. "message": "success",
  4. "data": {
  5. "result": {
  6. "age": {
  7. "age_type": "1",
  8. "child": "0.4887",
  9. "middle": "0.3180",
  10. "old": "0.1933"
  11. },
  12. "gender": {
  13. "female": "0.5933",
  14. "gender_type": "0",
  15. "male": "0.4067"
  16. }
  17. },
  18. "status": 2
  19. }
  20. }

5. 错误码

错误码错误描述说明处理方式
10003Too long audio音频过长检查音频长度是否超过了10s
10005licc fail appid授权失败申请appid权限
10006Get audio rate fail获取rate参数失败检查是否传了rate参数
10007Invalid rate rate参数不合法检查rate参数是否是16000或8000
10043Syscall AudioCodingDecode error音频解码失败检查aue参数,如果为speex,请确保音频是speex音频并分段压缩且与帧大小一致
10139invalid param参数错误检查business 参数是否正确
10221cannot find business srv没有可用连接请到控制台提交工单联系技术人员
10222Remote LB,cannot find valued lbLB找不到有效节点请到控制台提交工单联系技术人员
10223RemoteLB: can’t find valued addrlb 找不到节点请到控制台提交工单联系技术人员
10225Finder: can’t find busin service找不到atmos请到控制台提交工单联系技术人员
10313AppId is emptyappid为空检查是否传了appid
10317invalid version版本非法请到控制台提交工单联系技术人员
11200auth no license没有权限检查是否开通了该服务
11201auth no enough license权限不足检查是否拥有该服务的权限
30101invalid character ‘m’ looking for beginning of value请求数据格式非法检查请求数据是否是合法的json
30103illegal base64 data at input byte 0base64解码失败检查发送的数据是否使用base64编码了
30104cannot find status because datalist is nil获取的data为空检查是否传了data字段
30105audio not found in object服务端无法解析引擎返回数据请到控制台提交工单联系技术人员
30200read tcp 10.1.87.70:8888-\u003e10.1.107.8:51356: i/o timeout读取数据超时检查是否累计10s未发送数据并且未关闭连接
30201session timeoutsession超时会话时间超时,检查是否发送数据时间超过了60s
30403invalid appidappid和apikey不匹配检查appid是否合法
31301can cannot find filed /data解析内部响应数据失败请到控制台提交工单联系技术人员
31302Response_Data_Type`(%v) is error解析返回数据错误请到控制台提交工单联系技术人员
31303server error :atmos return an error data服务内部响应数据错误请到控制台提交工单联系技术人员
31502server error: too many datas in resp服务配置错误请到控制台提交工单联系技术人员
31400server cannot parse response data服务端无法解析后端响应数据请到控制台提交工单联系技术人员

6. 调用示例

性别年龄识别demo go语言

性别年龄识别demo java语言

注: 其他开发语言请参照 接口调用流程 进行开发,也欢迎热心的开发者到 讯飞开放平台社区 分享你们的demo。

7. 音频样例

性别年龄识别 音频样例 PCM文件 采样率16k

性别年龄识别 音频样例 PCM文件 采样率8k

性别年龄识别 音频样例 WAV文件 采样率16k

性别年龄识别 音频样例 WAV文件 采样率8k

性别年龄识别 音频样例 AMR文件 采样率16k

性别年龄识别 音频样例 AMR文件 采样率8k

性别年龄识别 音频样例 SPEEX文件 采样率16k

性别年龄识别 音频样例 SPEEX文件 采样率8k

注: 音频文件格式转换工具请参考这里 ffmpeg

Copyright © iflytek.com 2018 all right reserved,powered by Gitbook该文件修订时间:2019-05-07 07:12:51