【ESP32 在线语音】讯飞星火语音识别功能(听写流式API)文档阅读
接口要求
集成语音听写流式API时,需按照以下要求。
| 内容 | 说明 |
|---|---|
| 请求协议 | ws[s](为提高安全性,强烈推荐wss) |
| 请求地址 |
中英文(推荐使用):ws[s]: //iat-api.xfyun.cn/v2/iat (上面这两有啥区别呢???) |
| 请求行 | GET /v2/iat HTTP/1.1 |
| 接口鉴权 | 签名机制,详情请参照下方接口鉴权 (鉴权很重要,是星火大模型的特点) |
| 字符编码 | UTF-8 |
| 响应格式 | 统一采用JSON格式 |
| 开发语言 | 任意,只要可以向讯飞云服务发起Websocket请求的均可 |
| 操作系统 | 任意 |
| 音频属性 | 采样率16k或8K、位长16bit、单声道 |
| 音频格式 |
pcm (居然不支持 Opus 格式) |
| 音频长度 | 最长60s |
| 语言种类 | 中文、英文、小语种以及中文方言,可在控制台-语音听写(流式版)-方言/语种处添加试用或购买 |
#接口调用流程
- 通过接口密钥基于
hmac-sha256计算签名,向服务器端发送Websocket协议握手请求。详见下方 接口鉴权 。 - 握手成功后,客户端通过Websocket连接同时上传和接收数据。数据上传完毕,客户端需要上传一次数据结束标识。详见下方 接口数据传输与接收 。
- 接收到服务器端的结果全部返回标识后断开Websocket连接。
注: Websocket使用注意事项如下
- 服务端支持的websocket-version 为13,请确保客户端使用的框架支持该版本。
- 服务端返回的所有的帧类型均为TextMessage,对应于原生websocket的协议帧中opcode=1,请确保客户端解析到的帧类型一定为该类型,如果不是,请尝试升级客户端框架版本,或者更换技术框架。
- 如果出现分帧问题,即一个json数据包分多帧返回给了客户端,导致客户端解析json失败。出现这种问题大部分情况是客户端的框架对websocket协议解析存在问题,如果出现请先尝试升级框架版本,或者更换技术框架。
- 客户端会话结束后如果需要关闭连接,尽量保证传给服务端的错误码为websocket错误码1000(如果客户端框架没有提供关闭时传错误码的接口。则无需关注本条)。
接口鉴权
在握手阶段,请求方需要对请求进行签名,服务端通过签名来校验请求的合法性。
#鉴权方法
通过在请求地址后面加上鉴权相关参数的方式。示例url:
wss://iat-api.xfyun.cn/v2/iat
?authorization=
YXBpX2tleT0ia2V5eHh4eHh4eHg4ZWUyNzkzNDg1MTlleHh4eHh4eHgiLCBhbGdvcml0aG09ImhtYWMtc2hhMjU2IiwgaGVhZGVycz0iaG9zdCBkYXRlIHJlcXVlc3QtbGluZSIsIHNpZ25hdHVyZT0iSHAzVHk0WmtTQm1MOGpLeU9McFFpdjlTcjVudm1lWUVIN1dzTC9aTzJKZz0i
&date=Wed%2C%2010%20Jul%202019%2007%3A35%3A43%20GMT
&host=iat-api.xfyun.cn
鉴权参数:
| 参数 | 类型 | 必须 | 说明 | 示例 |
|---|---|---|---|---|
| host | string | 是 | 请求主机 | iat-api.xfyun.cn |
| date | string | 是 | 当前时间戳,RFC1123格式 | Wed, 10 Jul 2019 07:35:43 GMT |
| authorization | string | 是 | 使用base64编码的签名相关信息(签名基于hmac-sha256计算) | 参考下方authorization参数生成规则 |
· date参数生成规则
date必须是UTC+0或GMT时区,RFC1123格式(Wed, 10 Jul 2019 07:35:43 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 是参与签名的参数(注: headers是参与签名的参数,请注意是固定的参数名("host date request-line"),而非这些参数的值。)
- signature 是使用加密算法对参与签名的参数签名后,并使用base64编码的字符串,详见下方。
3)signature的原始字段(signature_origin)规则如下
signature原始字段由 host,date,request-line三个参数按照格式拼接成,
拼接的格式为(\n为换行符,’:’后面有一个空格):
host: $host\ndate: $date\n$request-line
假设
请求url = wss://iat-api.xfyun.cn/v2/iat
date = Wed, 10 Jul 2019 07:35:43 GMT
那么 signature原始字段(signature_origin)则为:
host: iat-api.xfyun.cn
date: Wed, 10 Jul 2019 07:35:43 GMT
GET /v2/iat 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。
假设
APISecret = secretxxxxxxxx2df7900c09xxxxxxxx
date = Wed, 10 Jul 2019 07:35:43 GMT
则signature为
signature=Hp3Ty4ZkSBmL8jKyOLpQiv9Sr5nvmeYEH7WsL/ZO2Jg=
6)根据以上信息拼接authorization base64编码前(authorization_origin)的字符串,示例如下。
api_key="keyxxxxxxxx8ee279348519exxxxxxxx", algorithm="hmac-sha256", headers="host date request-line", signature="Hp3Ty4ZkSBmL8jKyOLpQiv9Sr5nvmeYEH7WsL/ZO2Jg="
7)最后再对authorization_origin进行base64编码获得最终的authorization参数。
authorization = base64(authorization_origin)
示例:
authorization=YXBpX2tleT0ia2V5eHh4eHh4eHg4ZWUyNzkzNDg1MTlleHh4eHh4eHgiLCBhbGdvcml0aG09ImhtYWMtc2hhMjU2IiwgaGVhZGVycz0iaG9zdCBkYXRlIHJlcXVlc3QtbGluZSIsIHNpZ25hdHVyZT0iSHAzVHk0WmtTQm1MOGpLeU9McFFpdjlTcjVudm1lWUVIN1dzTC9aTzJKZz0i
#鉴权url示例(golang)
//@hosturl : like wss://iat-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
}
鉴权结果
如果握手成功,会返回HTTP 101状态码,表示协议升级成功;如果握手失败,则根据不同错误类型返回不同HTTP Code状态码,同时携带错误描述信息,详细错误说明如下:
| HTTP Code | 说明 | 错误描述信息 | 解决方法 |
|---|---|---|---|
| 401 | 缺少authorization参数 | {“message”:”Unauthorized”} | 检查是否有authorization参数,详情见authorization参数详细生成规则 |
| 401 | 签名参数解析失败 | {“message”:”HMAC signature cannot be verified”} | 检查签名的各个参数是否有缺失是否正确,特别确认下复制的api_key是否正确 |
| 401 | 签名校验失败 | {“message”:”HMAC signature does not match”} | 签名验证失败,可能原因有很多。 1. 检查api_key,api_secret 是否正确 2.检查计算签名的参数host,date,request-line是否按照协议要求拼接。 3. 检查signature签名的base64长度是否正常(正常44个字节)。 |
| 403 | 时钟偏移校验失败 | {“message”:”HMAC signature cannot be verified, a valid date or x-date header is required for HMAC Authentication”} | 检查服务器时间是否标准,相差5分钟以上会报此错误 |
| 403 | IP白名单校验失败 | {"message":"Your IP address is not allowed"} | 可在控制台关闭IP白名单,或者检查IP白名单设置的IP地址是否为本机外网IP地址 |
握手失败返回示例:
HTTP/1.1 401 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"
}
speex编码
讯飞开放平台rest_api支持speex编码压缩音频文件,相较于PCM可以节约网络传输成本,推荐使用speex格式。
请注意压缩前的原始音频文件,必须为采样率16K、16bit、单声道的PCM格式。
接口支持标准开源speex编码(speex-size参数必传)和讯飞定制speex编码(讯飞定制speex,无需额外传speex-size参数)
说明:
- 标准开源speex编解码,需下载编译speex库。详情可参考:https://www.speex.org/
- 标准开源speex格式,speex_size与speex库压缩等级(quantity)关系表如下:
| quantity(压缩等级) | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| speex_size(speex)8k | 6 | 10 | 15 | 20 | 20 | 28 | 28 | 38 | 38 | 46 | 62 |
| speex_size(speex-wb)16k | 10 | 15 | 20 | 25 | 32 | 42 | 52 | 60 | 70 | 86 | 106 |
- 讯飞定制编解码工具下载(点击下载 ),使用讯飞定制编码时,无需传speex_size参数
音频样例
语音听写流式 音频样例 中文普通话 PCM文件 采样率16k
语音听写流式 音频样例 中文普通话 MP3文件 采样率16k
语音听写流式 音频样例 中文普通话 SPEEX文件(标准开源SPEEX编码) 采样率8k 7级压缩
语音听写流式 音频样例 中文普通话 SPEEX文件(标准开源SPEEX编码) 采样率16k 7级压缩

浙公网安备 33010602011771号