【ESP32 在线语音】讯飞星火语音识别功能(听写流式API)文档阅读

接口要求

集成语音听写流式API时,需按照以下要求。

内容 说明
请求协议 ws[s](为提高安全性,强烈推荐wss)
请求地址

中英文(推荐使用):ws[s]: //iat-api.xfyun.cn/v2/iat
中英文:ws[s]: //ws-api.xfyun.cn/v2/iat

(上面这两有啥区别呢???)
小语种:ws[s]: //iat-niche-api.xfyun.cn/v2/iat
注:服务器IP不固定,为保证您的接口稳定,请勿通过指定IP的方式调用接口,使用域名方式调用

请求行 GET /v2/iat HTTP/1.1 
接口鉴权 签名机制,详情请参照下方接口鉴权 (鉴权很重要,是星火大模型的特点)
字符编码 UTF-8
响应格式 统一采用JSON格式
开发语言 任意,只要可以向讯飞云服务发起Websocket请求的均可
操作系统 任意
音频属性 采样率16k或8K、位长16bit、单声道
音频格式

pcm
speex(8k)
speex-wb(16k)
mp3(仅中文普通话和英文支持,其他方言及小语种敬请期待)
样例音频请参照音频样例

(居然不支持 Opus 格式)

音频长度 最长60s
语言种类 中文、英文、小语种以及中文方言,可在控制台-语音听写(流式版)-方言/语种处添加试用或购买

#接口调用流程

  • 通过接口密钥基于hmac-sha256计算签名,向服务器端发送Websocket协议握手请求。详见下方 接口鉴权 。
  • 握手成功后,客户端通过Websocket连接同时上传和接收数据。数据上传完毕,客户端需要上传一次数据结束标识。详见下方 接口数据传输与接收 。
  • 接收到服务器端的结果全部返回标识后断开Websocket连接。

注: Websocket使用注意事项如下

  1. 服务端支持的websocket-version 为13,请确保客户端使用的框架支持该版本。
  2. 服务端返回的所有的帧类型均为TextMessage,对应于原生websocket的协议帧中opcode=1,请确保客户端解析到的帧类型一定为该类型,如果不是,请尝试升级客户端框架版本,或者更换技术框架。
  3. 如果出现分帧问题,即一个json数据包分多帧返回给了客户端,导致客户端解析json失败。出现这种问题大部分情况是客户端的框架对websocket协议解析存在问题,如果出现请先尝试升级框架版本,或者更换技术框架。
  4. 客户端会话结束后如果需要关闭连接,尽量保证传给服务端的错误码为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原始字段由 hostdaterequest-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参数)

说明:

  1. 标准开源speex编解码,需下载编译speex库。详情可参考:https://www.speex.org/
  2. 标准开源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
  1. 讯飞定制编解码工具下载(点击下载 ),使用讯飞定制编码时,无需传speex_size参数

音频样例

语音听写流式 音频样例 中文普通话 PCM文件 采样率16k

语音听写流式 音频样例 中文普通话 PCM文件 采样率8k

语音听写流式 音频样例 中文普通话 MP3文件 采样率16k

语音听写流式 音频样例 中文普通话 MP3文件 采样率8k

语音听写流式 音频样例 中文普通话 SPEEX文件(标准开源SPEEX编码) 采样率8k 7级压缩

语音听写流式 音频样例 中文普通话 SPEEX文件(标准开源SPEEX编码) 采样率16k 7级压缩

语音听写流式 音频样例 中文普通话 SPEEX文件(讯飞定制SPEEX编码) 采样率16k 7级压缩

语音听写流式 音频样例 中文普通话 SPEEX文件(讯飞定制SPEEX编码) 采样率8k 7级压缩

posted @ 2025-10-27 23:57  FBshark  阅读(6)  评论(0)    收藏  举报