# 实时语音转写大模型
# 1. 概述
# 1.1 功能整体概述
实时语音转写大模型版,是基于星火大模型预训练技术框架训练的识别大模型,服务核心功能为语音识别,即将不限时长的语音识别为文字内容。
# 1.2 接口协议整体概述
实时转写服务分为两种类型的协议:
- 一种是 websoket(简称 ws)协议,用于实时地将音频输入到服务端,并通过 websocket 协议实时获取转写结果、翻译结果。
- 一种是 http 接口协议,用于操作一些辅助功能,比如:声纹注册。
内容 | 说明 |
---|---|
请求协议 | ws[s](为提高安全性,强烈推荐 wss) |
请求地址 | wss://office-api-ast-dx.iflyaisol.com/ast/communicate/v1?{请求参数} |
接口鉴权 | 签名机制,详见数字签名 |
字符编码 | UTF-8 |
响应格式 | 统一采用 JSON 格式 |
开发语言 | 任意,只要可以向讯飞云服务发起 WebSocket 请求的均可 |
音频属性 | 采样率 16k、位长 16bit、单声道 |
音频格式 | pcm |
数据发送 | 建议音频流每 40ms 发送 1280 字节 |
语言种类 | 中英 + 202种方言混合识别 |
# 2. 音频转写接口
实时语音转写接口调用包括两个阶段:握手阶段和实时通信阶段。
# 2.1 握手阶段
websocket 协议带参请求:
wss://office-api-ast-dx.iflyaisol.com/ast/communicate/v1?{请求参数}
常见的实际生产的一个 ws 握手请求的 url 示例如下,含义为实时转写 pcm 格式 16000 采样率的实时转写结果:
wss://office-api-ast-dx.iflyaisol.com/ast/communicate/v1?accessKeyId=bb1542cda0ab4696031e2f3244206479&appId=27cc644f&uuid=664e7e56f779492ca75a58839914164b&utc=2025-09-04T15%3A38%3A07%2B0800&audio_encode=pcm_s16le&lang=autodialect&samplerate=16000&signature=4PuTRjRmWbJecdZQoANVA4I9B0s%3D
# 请求参数格式
key1=value1&key2=value2…
(key 和 value 都需要进行 urlencode)
# 业务参数说明
字段名称 | 类型 | 是否必须 | 字段说明 |
---|---|---|---|
appId | string | 是 | 讯飞开放平台应用id,从开放平台控制台 (opens new window)获取 |
accessKeyId | string | 是 | 讯飞开放平台应用key,从开放平台控制台 (opens new window)获取 |
uuid | string | 否 | 自定义字段,用于标识业务侧不同用户 |
utc | string | 是 | 当前时间,格式为:2025-09-04T15%3A38%3A07%2B0800 |
signature | String | 是 | 签名规则生成的签名字符串 |
lang | String | 是 | 可选范围: autodialect:支持中英 + 202 种方言免切识别 autominor:支持 37 个语种免切识别 (暂需联系人工对接) |
audio_encode | String | 是 | 1. pcm 格式,传参是 pcm_s16le ,代表 16k16bit 原始音频流2. speex 格式,支持 speex-7 、speex-10 3. opus 格式(推荐),传参为 opus-wb |
samplerate | long | 是 | 采样率,仅在客户端音频为 pcm 时必须传入,支持 16000、8000 |
role_type | short | 否 | 是否开启说话人分离: 0:关闭说话人分离(默认) 2:开启实时角色分离 |
pd | String | 否 | 领域个性化参数,优化特定领域识别效果: 法律:court、 金融:finance、 医疗:medical、 科技:tech、 体育:sport、 教育:edu、 运营商:isp、 政府:gov、 游戏:game、 电商:ecom、 军事:mil、 企业:com、 生活:life、 娱乐:ent、 人文历史:culture、 汽车:car |
trackMode | Short | 否 | 按声道分轨转写模式: 1- 不分轨模式; 2- 双声道分轨模式; 默认为1 备注:如果转写任务使用双声道分轨模式,角色分离(roleType)功能失效。 转写结果字段请参考getResult接口协议定义字段。 |
eng_punc | String | 否 | 标点过滤控制字段,默认返回标点,punc=0 会过滤结果中的标点 |
eng_vad_mdn | int | 否 | vad 远近场切换: 不传或传 1 代表远场,传 2 代表近场 |
# signature 生成
获取 baseString,步骤如下:
- 将所有请求参数(不包含 signature)按参数名进行升序排序
- 对每个参数的键和值分别进行 URL 编码
- 按照 "编码后的键=编码后的值&" 的格式拼接所有参数
- 移除最后一个多余的 "&" 符号,得到 baseString
示例: accessKeyId=XXX&appId=XXX&lang=cn&utc=2025-03-24T00%3A01%3A19%2B0800&uuid=edf53e32-6533-4d6a-acd3-fe4df14ee332
以 accessKeySecret 为密钥,对 baseString 进行 HmacSHA1 加密,得到二进制字节数组
对 HmacSHA1 加密后的字节数组进行 Base64 编码,得到最终的 signature
示例: IrrzsJeOFk1NGfJHW6SkHUoN9CU=
# 2.2 实时通信阶段
握手成功后,进入实时通信阶段,客户端主动操作有两种:上传数据和上传结束标识,被动操作有两种:接收转写结果和错误。
- 上传数据:实时转写过程中,客户端不断构造 binary message 发送到服务端,内容是音频的二进制数据。建议音频流每 40ms 发送 1280 字节,发送过快可能导致引擎出错;音频发送间隔超时时间为 15 秒,超时服务端报错并主动断开连接。
- 上传结束标志:音频数据上传完成后,客户端需发送一个结束标识,并且制定会话sessionId:
{"end": true, "sessionId": "d49ddd6f-c451-35ea-b8c4-2c75af837caa"}
# 2.3 返回结果说明
返回结果为 JSON 格式,具体字段说明如下:
参数 | 类型 | 说明 |
---|---|---|
action | string | 结果标识:started 握手,result 结果,error 异常 |
code | string | 结果码(见错误码) |
data | string | 结果数据 |
desc | string | 描述 |
sid | string | 会话 ID |
# 2.3.1 转写结果
字段 | 含义 | 详细描述 |
---|---|---|
data.cn.st.bg | 句子开始时间 | 中间结果的 bg 为准确值 |
data.cn.st.ed | 句子结束时间 | 中间结果的 ed 为 0 |
data.cn.st.rt.ws.cw.w | 词识别内容 | 具体的转写结果 |
data.cn.st.rt.ws.cw.lg | 转写识别的语言 | lang 为 autominor 时返回当前识别的语言 |
data.cn.st.rt.ws.cw.wp | 词标识 | n-普通词;s-顺滑词;p-标点;g-分段标识 |
data.cn.st.rt.ws.cw.wb | 词开始时间 | 中间结果的 wb 为 0 |
data.cn.st.rt.ws.cw.we | 词结束时间 | 中间结果的 we 为 0 |
data.cn.st.rt.ws.cw.rl | 角色分离标识 | 只有角色分离功能打开时出现,角色切换时变化 |
data.cn.st.type | 结果类型标识 | 0-确定性结果;1-中间结果 |
data.seg_id | 返回消息号 | 从 0 开始 |
data.cn、data.cn.st | 音频段结果 | 无实际意义,按此结构解析 |
data.cn.st.rt | 返回音频转写结果 | 音频转写结果内容从此字段解析 |
data.ls | 是否为转写最终结果 | true 表示最后一帧,false 表示非最后一帧 |
# 2.3.2 返回结果示例
- 正常结果:
{ "msg_type": "result", "res_type": "asr", "data": { "seg_id": 0, "cn": { "st": { "rt": [ { "ws": [ { "cw": [ { "w": "项", "wp": "n", "rl": 0, "lg": "cn" } ], "wb": 15, "we": 64 }, { "cw": [ { "w": "兽", "wp": "n", "lg": "cn" } ], "wb": 65, "we": 95 }, { "cw": [ { "w": "南", "wp": "n", "lg": "cn" } ], "wb": 96, "we": 147 } ] } ], "bg": 930, "type": "0", "ed": 2590 } }, "ls": false } }
- 异常结果:
{ "data": { "desc": "功能异常", "detail": { "domain": "ist_ed_test" }, "fnType": "ast", "normal": false }, "msg_type": "result", "res_type": "frc" }
# 3. 辅助功能接口
# 3.1 个性化热词
为提高用户在自身业务场景的识别准确度,支持在控制台 (opens new window)上传专业词汇,以提高相应的识别权重。
# 3.2 角色分离
角色分离提供两种主要模式:盲分和声纹分离:
- 盲分:应用于说话人群不固定,无法确认对应身份的场景。
- 声纹分离:应用于说话人固定,需要清晰区分出具体是谁说了什么内容的场景。(即将上线,敬请期待)
# 4. 语种列表
语种 | 描述 |
---|---|
autodialect | 自动识别中英,以及中文下的202种方言: 合肥话、芜湖话、皖北话、铜陵话、安庆话、黄山话、滁州话、六安话、池州话、宣城话、粤语、北京话、福州话、闽南语、莆仙话、延平话、宁德话、永安话、兰州话、白银话、天水话、武威话、张掖话、平凉话、酒泉话、庆阳话、定西话、韶关话、潮汕话、客家话、桂南平话、柳州话、桂北平话、桂林话、来宾话、贵阳话、六盘水话、遵义话、安顺话、毕节话、铜仁话、海口话、海南话、儋州话、石家庄话、唐山话、秦皇岛话、邯郸话、邢台话、保定话、张家口话、承德话、沧州话、廊坊话、衡水话、太原话、郑州话、开封话、洛阳话、平顶山话、安阳话、鹤壁话、新乡话、焦作话、濮阳话、许昌话、漯河话、三门峡话、南阳话、商丘话、信阳话、周口话、驻马店话、东北话、武汉话、黄石话、十堰话、宜昌话、襄阳话、鄂州话、荆门话、孝感话、荆州话、黄冈话、咸宁话、随州话、长沙话、湘潭话、衡阳话、邵阳话、岳阳话、常德话、张家界话、益阳话、郴州话、永州话、怀化话、娄底话、延吉话、南京话、无锡话、徐州话、常州话、苏州话、南通话、连云港话、淮安话、盐城话、扬州话、镇江话、泰州话、宿迁话、靖江话、启海话、南昌话、景德镇话、萍乡话、九江话、新余话、鹰潭话、赣州话、吉安话、宜春话、抚州话、上饶话、大连话、丹东话、营口话、朝阳话、晋语、包头话、赤峰话、鄂尔多斯话、银川话、石嘴山话、吴忠话、固原话、中卫话、西宁话、海东话、济南话、青岛话、淄博话、枣庄话、东营话、烟台话、潍坊话、济宁话、泰安话、威海话、日照话、临沂话、德州话、聊城话、滨州话、菏泽话、莱芜话、大同话、阳泉话、长治话、晋城话、朔州话、晋中话、运城话、忻州话、临汾话、吕梁话、汾阳话、西安话、铜川话、宝鸡话、咸阳话、渭南话、延安话、汉中话、榆林话、安康话、商洛话、上海话、四川话、台湾话、天津话、乌鲁木齐话、吐鲁番话、哈密话、云南话、曲靖话、玉溪话、保山话、昭通话、杭州话、宁波话、温州话、嘉兴话、湖州话、绍兴话、金华话、衢州话、舟山话、台州话、丽水话、重庆话 |
autominor | 自动识别37种语种: 中文、英文、日语、韩语、俄语、法语、西班牙语、阿拉伯语、德语、泰语、越南语、印地语、葡萄牙语、意大利语、马来语、印尼语、菲律宾语、土耳其语、希腊语、捷克语、乌尔都语、孟加拉语、泰米尔语、乌克兰语、哈萨克语、乌兹别克语、波兰语、蒙语、斯瓦西里语、豪撒语、波斯语、荷兰语、瑞典语、罗马尼亚语、保加利亚语、维语、藏语 |
# 5. 代码示例
Python 代码示例 (opens new window)
# 6. 错误码表
错误码 | 描述 |
---|---|
35001 | 账号鉴权失败 |
35002 | 用量不足 |
35003 | 内部错误 |
35004 | appId 不存在 |
35005 | appId 已禁用 |
35006 | appId 当前并发路数已满 |
35007 | 内部错误 |
35008 | 内部错误 |
35009 | 内部错误 |
35010 | accessKeyId 不存在 |
35011 | 内部错误 |
35012 | 内部错误 |
35013 | 时区格式错误 |
35014 | 时间戳偏差过大 |
35015 | 参数为空 |
35016 | 参数格式错误 |
35017 | accessKeyId 不匹配 |
35018 | 内部错误 |
35019 | AccessSource 不对 |
35020 | 语种不支持 |
35021 | sourceinfo 字段长度超过限制(128 字符) |
35022 | 转写用量超过最大限制 |
35030 | 签名已过期 |
35031 | 账号已过期 |
35099 | 未知错误 |
37000 | 参数错误 |
37001 | 初始化连接引擎失败 |
37002 | 引擎没有空余路数 |
37003 | 普通翻译无法使用 |
37004 | 流式翻译无法使用 |
37005 | 客户端长时间未传音频 |
37006 | 流式翻译并发数达到上限 |
37007 | 单次转写音频时长已达上限(8 小时) |
37008 | 引擎异常断连 |
37009 | 已收到引擎返回的最后一帧结果 |
37010 | 用户发送 end 后继续发送数据 |
37011 | 发送的 text 文本非 json 结构 |
37012 | 客户端握手成功后直接发送 end=true,属于异常请求 |
100001 | 上传音频速度超出限制 |
100002 | 签名错误 |
100003 | 热词必须为中文 |
100004 | 热词超过长度限制 |
100005 | 热词超过总数限制 |
100006 | 热词分隔符不能连续出现 |
100007 | 热词校验失败 |
100008 | 热词上传失败 |
100009 | 热词保存失败 |
100010 | 热词为空 |
100011 | 热词加载失败 |
100012 | UTC 偏差过大 |
100013 | appId 为空 |
100014 | 热词 Id 错误 |
100015 | 参数错误 |
100016 | accessKeyId 错误 |
100017 | 修改密钥失败 |
100018 | 不支持当前语种 |
100019 | 当前账号未开通当前语种转写能力 |
100020 | 当前 appId 和 accessKeyId 不匹配 |
100021 | 音频解码错误 |
999999 | 内部服务错误 |
在这篇文章中: