跳到主要内容

火山引擎实时语音识别从注册到接入:豆包语音 ASR 实践教程

· 阅读需 15 分钟

这篇继续同一组实践教程:第一次使用火山引擎豆包语音 / 大模型流式语音识别,怎么注册开通,怎么拿 Key,怎么选资源 ID,怎么理解 WebSocket 二进制协议,怎么从 smoke test 走到我们自己的网页实时字幕服务。

同主题前情
一句话结论

火山这条线最值得看的不是老“语音识别 API”本身,而是 豆包流式语音识别模型 2.0 / 大模型流式语音识别。如果目标是边说边出字,第一轮优先试 双向流式优化版 bigmodel_async;如果想在快和准之间折中,可以开启二遍识别,让实时临时结果先上屏,再用更稳的分句 final 覆盖。

状态说明

快照时间为 2026-08-10 CST。本文基于火山引擎官方大模型流式语音识别 API、豆包语音计费说明、控制台 FAQ 做静态实践手册;没有使用任何真实账号密钥,也没有发起付费 ASR 调用。真实 App Key、API Key、Access Token、Secret Key、Resource ID、密码、代理凭据一律写成 [REDACTED],不能进入前端、博客、截图或 Git 仓库。

先分清三条实时入口

火山的大模型流式 ASR 文档里列了三个 WebSocket 入口:

入口URL适合什么第一轮建议
双向流式模式wss://openspeech.bytedance.com/api/v3/sauc/bigmodel每输入一个包返回一个包,尽快返回识别到的字符,速度较快可测
流式输入模式wss://openspeech.bytedance.com/api/v3/sauc/bigmodel_nostream发送超过 15 秒音频或最后一包后返回结果,准确率更高但实时性弱准确率对照
双向流式优化版wss://openspeech.bytedance.com/api/v3/sauc/bigmodel_async结果有变化时才返回新包,官方文档更推荐,性能更优优先试

如果我们做会议实时字幕,第一轮建议:

低延迟实时上屏
-> bigmodel_async
-> 开 enable_nonstream 做二遍识别

只看最终准确率对照
-> bigmodel_nostream

旧链路兼容
-> bigmodel

火山文档还明确提醒:单包音频建议 100–200ms,发包间隔建议 100–200ms;双向流式模式推荐 200ms 分包。不要照搬讯飞的 40ms,也不要把浏览器原始 WebM/Opus 不处理就丢过去。

费用先怎么看

价格会变,必须以控制台和官方计费页为准。下面是 2026-08-10 从火山“豆包语音计费说明”抓到的快照,只用于第一轮预算判断。

商品 / 能力资源包示例资源包折算后付费单价
豆包流式语音识别模型 2.030 小时 ¥28;1000 小时 ¥900;10000 小时 ¥8800约 ¥0.93 / 小时到 ¥0.88 / 小时¥1 / 小时
大模型流式语音识别30 小时 ¥132;1000 小时 ¥4000;10000 小时 ¥32000约 ¥4.4 / 小时到 ¥3.2 / 小时¥4.5 / 小时
豆包录音文件识别模型 2.030 小时 ¥23;1000 小时 ¥750约 ¥0.77 / 小时到 ¥0.75 / 小时¥0.8 / 小时
大模型录音文件识别(标准版)30 小时 ¥66;1000 小时 ¥2000约 ¥2.2 / 小时到 ¥2 / 小时¥2.3 / 小时
大模型录音文件识别(极速版)30 小时 ¥132;1000 小时 ¥4300约 ¥4.4 / 小时到 ¥4.3 / 小时¥4.5 / 小时

计费说明里还写到两个非常重要的点:

  1. 按时长计费时,会累加每次调用的语音时长,精确到毫秒,最终折算为小时;
  2. 语音识别相关能力按音频时长计费,双声道也是按单声道时长口径计费。

第一轮建议:

先不要直接买大包
-> 先确认是否有免费额度 / 试用
-> 再买最小 30 小时包或保持后付费但做成本保护
-> 每次测试记录音频秒数、Resource ID、X-Tt-Logid、账单归属

另外,火山文档还列出并发包:豆包流式语音识别模型 2.0 默认并发 / 超出并发价格和大模型流式语音识别不同。第一版 smoke test 不用先买并发包;真要多人同时测,再看并发。

你先打开这些网页

第一次操作可以按下面顺序开网页,不需要先写代码。

步骤打开地址你要做什么
1https://www.volcengine.com/注册或登录火山引擎账号。
2https://www.volcengine.com/product/doubao-speech打开豆包语音产品页,确认产品入口。
3https://console.volcengine.com/speech/new/setting/apikeys?projectName=default新版控制台 API Key 页面,登录后查看 / 创建 X-Api-Key
4https://docs.volcengine.com/docs/6561/1354869?lang=zh大模型流式语音识别 API 文档,重点看三种 WebSocket、鉴权、二进制协议、参数。
5https://docs.volcengine.com/docs/6561/1359370?lang=zh豆包语音计费说明,看资源包、后付费、并发包。
6https://www.volcengine.com/docs/6561/196768控制台 FAQ,看旧版 appid / cluster / token / authorization_type / secret_key 在哪里查。
7https://console.volcengine.com/speech/monitor监控统计 / 资源包使用情况,后续做成本读回。
8https://console.volcengine.com/finance/bill/detail/费用中心账单详情,确认是否欠费、后付费扣费、资源包抵扣。

如果你是子账号,火山 FAQ 明确说:主账号没给对应产品控制台权限时,子账号无法直接访问语音技术控制台,需要主账号在访问控制里授权语音技术系统策略。

从注册到可调用:人工操作流程

1. 注册 / 登录 / 实名

  1. 打开 https://www.volcengine.com/。
  2. 登录或注册火山引擎账号。
  3. 如果提示实名、企业认证、协议确认或付费方式确认,按页面完成。
  4. 进入豆包语音 / 语音技术控制台。

完成后只需要告诉我:

已登录火山 / 已进入语音控制台 / 是否完成实名 / 是否主账号或子账号

不要发送密码、验证码、证件、完整账单截图。

2. 开通豆包语音 / 大模型流式语音识别

目标是确认这些状态:

服务:豆包流式语音识别模型 2.0 / 大模型流式语音识别
计费:免费额度 / 资源包 / 后付费
并发:默认并发是否够第一轮测试
项目:default 或 realtime-asr-test

如果你只是第一轮效果测试,不建议一开始买大资源包。可以先确认有没有试用 / 免费额度;如果必须购买,优先看最小 30 小时包。

3. 获取 Key:新版和旧版不一样

火山文档把鉴权分成新版控制台和旧版控制台:

控制台版本需要什么说明
新版控制台X-Api-Key官方文档写到新版控制台只需要 X-Api-Key,配合 Resource ID、Request ID、Sequence 走 WebSocket header
旧版控制台X-Api-App-Key + X-Api-Access-Key文档解释为 App ID / Access Token 等旧参数;还会涉及 cluster、authorization_type、secret_key 等控制台参数

真实值只放服务器环境变量:

VOLCENGINE_SPEECH_API_KEY=[REDACTED]
VOLCENGINE_SPEECH_APP_KEY=[REDACTED]
VOLCENGINE_SPEECH_ACCESS_KEY=[REDACTED]

浏览器端不能看到这些值。

4. 选择 Resource ID

API 文档里把资源 ID 写得很明确,代表你调用哪种服务和计费模式:

能力小时版 Resource ID并发版 Resource ID
豆包流式语音识别模型 1.0volc.bigasr.sauc.durationvolc.bigasr.sauc.concurrent
豆包流式语音识别模型 2.0volc.seedasr.sauc.durationvolc.seedasr.sauc.concurrent

如果第一轮只是按时长小流量测试,通常从小时版开始:

VOLCENGINE_ASR_RESOURCE_ID=volc.seedasr.sauc.duration

不要把 resource id 和 API key 混为一谈:Resource ID 不是密钥,但它决定调用哪条产品 / 计费线,仍然应当放在服务端配置里统一管理。

5. 请求头最小形态

新版控制台 WebSocket 握手 header 大概是:

X-Api-Key: [REDACTED]
X-Api-Resource-Id: volc.seedasr.sauc.duration
X-Api-Request-Id: <uuid>
X-Api-Sequence: -1

旧版控制台则是:

X-Api-App-Key: [REDACTED]
X-Api-Access-Key: [REDACTED]
X-Api-Resource-Id: volc.seedasr.sauc.duration
X-Api-Request-Id: <uuid>
X-Api-Sequence: -1

WebSocket 握手成功后,服务端会返回 X-Tt-Logid。这个值不是密钥,应该记录到日志里,方便排错。

API 路径:火山不是简单 JSON WebSocket

火山这条比阿里 / 讯飞更工程化一点:WebSocket payload 是二进制协议,不是简单地 send(JSON.stringify(...)) 加音频就完事。

官方协议说明每个 frame payload 包含:

header
payload size
payload

消息类型包括:

类型含义
0b0001端上发送 full client request,包含请求参数
0b0010端上发送 audio only request,包含音频数据
0b1001服务端返回 full server response,包含识别结果
0b1111服务端返回错误

请求流程:

建立 WebSocket
-> 发送 full client request:音频格式、采样率、模型参数、热词 / 上下文等
-> 持续发送 audio only request:每包约 100–200ms 音频
-> 服务端持续返回识别结果 / 错误
-> 最后一包使用负包标记
-> 服务端返回最终结果
-> 关闭连接

这意味着第一版 relay 最好先写成后端 adapter,而不是让浏览器直接实现火山二进制协议。

请求参数怎么选

第一轮会议实时字幕可以从这个配置开始:

{
"audio": {
"format": "wav",
"rate": 16000,
"bits": 16,
"channel": 1,
"language": "zh-CN"
},
"request": {
"model_name": "bigmodel",
"enable_nonstream": true,
"enable_itn": true,
"enable_punc": true,
"enable_ddc": false,
"result_type": "full",
"end_window_size": 800
}
}

参数含义:

参数建议说明
formatpcmwav文档支持 pcm / wav / ogg / mp3;pcm/wav 内部必须是 pcm_s16le
rate16000文档写目前只支持 16000
channel1第一轮用单声道,减少变量
languagezh-CN 或空空值可用默认中英文及部分方言;指定语种只在部分模式支持
model_namebigmodel文档当前写目前只有 bigmodel
enable_nonstreamtrue双向流式优化版可开启二遍识别,用快结果 + 准 final
enable_itntrue把“一九七零年”转成“1970年”等书面格式
enable_punctrue启用标点
enable_ddcfalse语义顺滑可能会改写口语,先看原始效果
end_window_size800静音判停阈值;实时性要求高时可调小,但可能影响准确率

后续可以再测:

  • enable_speaker_info:说话人聚类分离;
  • context:热词 / 上下文;
  • show_speech_rate / show_volume:输出语速、音量;
  • enable_lid:语种检测;
  • enable_emotion_detection:情绪检测;
  • enable_gender_detection:性别检测。

这些都不要第一轮全开。先把“稳定实时出字”跑通,再逐项打开。

我们自己的产品架构

最终还是不让浏览器直连火山。推荐:

浏览器麦克风
-> 我们自己的 WebSocket:wss://realtime-asr.public.wzhecnu.cn/ws
-> 后端读取 VOLCENGINE_SPEECH_API_KEY / Resource ID
-> 后端连接火山 bigmodel_async
-> 后端封装 full client request / audio only request 二进制包
-> 火山返回识别结果
-> 后端统一成 transcript.partial / transcript.final
-> 浏览器实时显示字幕

服务端环境变量形态:

ASR_PROVIDER=volcengine
VOLCENGINE_ASR_ENDPOINT=wss://openspeech.bytedance.com/api/v3/sauc/bigmodel_async
VOLCENGINE_SPEECH_API_KEY=[REDACTED]
VOLCENGINE_ASR_RESOURCE_ID=volc.seedasr.sauc.duration
VOLCENGINE_ASR_AUDIO_FORMAT=wav
VOLCENGINE_ASR_SAMPLE_RATE=16000
VOLCENGINE_ASR_CHUNK_MS=200
VOLCENGINE_ASR_ENABLE_NONSTREAM=true

统一事件建议:

{"type":"transcript.partial","provider":"volcengine","text":"我们今天讨论","seq":12,"logid":"[REDACTED]"}
{"type":"transcript.final","provider":"volcengine","text":"我们今天讨论实时语音识别。","seq":13,"definite":true}

X-Tt-Logid 可以记录,但如果日志里包含业务内容或用户音频关联 ID,生产环境也要按隐私日志处理。

实践分工:你点网页,我写代码

你先做

  1. 登录火山引擎:https://www.volcengine.com/
  2. 进入豆包语音 / 语音技术控制台。
  3. 确认是否能进入新版 API Key 页面:https://console.volcengine.com/speech/new/setting/apikeys?projectName=default
  4. 开通豆包流式语音识别模型 2.0 或大模型流式语音识别。
  5. 确认是否有免费额度、试用、资源包或后付费。
  6. 选择小时版 Resource ID,第一轮优先 volc.seedasr.sauc.duration
  7. 确认监控统计页面能看到资源包 / 调用用量。
  8. 不要把真实 Key 发出来;只告诉我:
- 是否已进入语音控制台:是/否
- 是新版控制台还是旧版控制台:新版/旧版/不确定
- 已开通能力:豆包流式语音识别2.0 / 大模型流式语音识别 / 未开通
- 是否有 X-Api-Key:是/否
- Resource ID 准备用哪个:volc.seedasr.sauc.duration / 其他
- 是否购买资源包或开启后付费:资源包/后付费/未开通
- 默认并发是否够第一轮测试:是/否/不确定

我来做

  1. 写一个最小火山 WebSocket 客户端,只读环境变量,不写死 Key。
  2. 实现火山二进制协议 header / payload size / gzip / JSON 序列化。
  3. 准备 16k/16bit/mono wav 或 pcm 测试音频。
  4. bigmodel_async,记录 X-Tt-Logid、错误码、首字延迟、final 文本。
  5. 再测 bigmodel_nostream 做准确率对照。
  6. 把火山返回结果映射成统一 partial/final 事件。
  7. 接网页实时字幕页和调用时长统计。

第一轮验收标准

验收项通过标准
服务开通控制台显示目标能力可用
鉴权WebSocket 握手成功,不返回 Key / Resource ID / 权限错误
Resource ID账单和日志显示调用的是预期资源 ID
音频格式10–20 秒 16k 单声道音频能被识别
实时性bigmodel_async 发送期间持续返回可上屏文本
final 稳定性开启二遍识别后,final 结果能覆盖临时结果且更稳定
日志记录 X-Tt-Logid、request id、chunk ms、错误码
成本用量能在监控 / 账单里解释,未出现意外后付费长跑

常见坑

坑 1:新版 / 旧版控制台参数混用

新版主要看 X-Api-Key;旧版可能是 App Key / Access Key / token / cluster 等。先确认自己看到的是哪个控制台,不要把两套参数混着填。

坑 2:Resource ID 选错

volc.bigasr.sauc.durationvolc.seedasr.sauc.duration、并发版 ID、小时版 ID代表不同服务和计费模式。第一轮如果要测豆包流式语音识别 2.0 小时版,应优先确认 volc.seedasr.sauc.duration

坑 3:以为 WebSocket 只发 JSON

火山文档使用二进制协议:header、payload size、payload。直接发普通 JSON 大概率不通。这个复杂度应该封装在后端 adapter。

坑 4:分包太大或太小

官方建议 100–200ms,双向流式推荐 200ms。分包节奏会影响性能。

坑 5:一上来打开所有增强功能

说话人、情感、性别、热词、上下文、顺滑、语种检测都可能改变返回结构。第一轮先只开 ITN、标点、必要的二遍识别。

坑 6:后付费没有成本保护

火山文档写了欠费关停 / 回收逻辑,也有资源包监控和到期提醒。测试阶段要记录音频时长,避免长时间后台连接导致账单超预期。

后续更新计划

这篇先作为从零教程第一版。拿到控制台状态后继续补:

  1. 控制台实际路径截图对应的步骤;
  2. 新版 X-Api-Key smoke test;
  3. bigmodel_async 最小 Python / Node WebSocket 客户端;
  4. 10–20 秒中文音频结果、X-Tt-Logid 和错误码样例;
  5. 二遍识别开启 / 关闭 A/B;
  6. 与科大讯飞 / 阿里云同音频 A/B;
  7. 最终是否把火山作为第一版主 provider 或备 provider。

参考入口