更新记录
1.0.0(2026-10-27)
首发版本:火山引擎豆包语音 UTS 插件,仅 Android(armeabi-v7a / arm64-v8a),
兼容 uni-app(Vue2 / Vue3)与 uni-app x,提供语音识别、语音合成、实时语音对话三项能力。
流式语音识别(Seed ASR)
- 接口:
initAsr/startAsr/stopAsr/cancelAsr/releaseAsr/feedAsrAudio/getAsrVersion - 音频来源三种:麦克风、外部 PCM(
feedAsrAudio)、音频文件 - 结果流式返回:中间结果、最终结果、分句信息、录音音量
- 支持语种、VAD 切句时长、热词与纠错等大模型参数(
reqParams) - 可选录音落盘 wav、获取 SDK 版本号
双向流式语音合成(BiTts)
- 接口:
initTts/startTts/sendTtsText/finishTtsSession/cancelTtsSession/stopTts/pauseTts/resumeTts/releaseTts - 文本可一次传入,也可边生成边追加(适合大模型流式输出),音频边合成边播放
- 音色(含复刻音色)、语速、音量、情感、字幕
- 可只取音频数据自己播放(base64 回调),也可落盘 wav
- 断线自动重连,一个连接内可多轮会话
实时语音对话(全双工 Seeduplex)
- 接口:
initDialog/startDialog/stopDialog/releaseDialog/sendDialogEvent/feedDialogAudio/ 播放与录音的暂停恢复 - 全双工交互:可边听边说、可打断,助手回复同时给出文本与音频
- 音色(含复刻音色)、语种、人设、对话模型可配
- 下行事件完整透出(
session.created/response.*/conversation.*等), 上行事件可发(打断、强制判停、助手朗读、注入文本、更新配置等) - 回声消除缺省开启,无需自行准备模型文件
- 音频输入支持麦克风或外部 PCM;可选回传录音 / 播放 / 解码音频
通用
- 三个能力的
init回调均为事件流:初始化、结果、状态、错误都从同一个success返回 - 统一错误码(
9000001~9000009),网络异常以错误事件返回,不会导致应用崩溃 - 内置权限申请接口(默认申请录音权限)
平台兼容性
uni-app(4.72)
| Vue2 | Vue2插件版本 | Vue3 | Vue3插件版本 | Chrome | Safari | app-vue | app-vue插件版本 | app-nvue | app-nvue插件版本 | Android | Android插件版本 | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| √ | 1.0.0 | √ | 1.0.0 | × | × | √ | 1.0.0 | √ | 1.0.0 | 5.0 | 1.0.0 | × | × |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| × | × | × | × | × | × | × | × | × | - | × | × |
uni-app x(4.72)
| Chrome | Safari | Android | Android插件版本 | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|---|
| × | × | 5.0 | 1.0.0 | × | × | × |
zy-doubaoSpeech 豆包语音(识别 / 合成 / 实时对话)
火山引擎豆包语音 UTS 插件,仅 Android(armeabi-v7a / arm64-v8a),
兼容 uni-app(Vue2 / Vue3)与 uni-app x。
| 能力 | 用途 | resourceId |
|---|---|---|
| 流式语音识别(Seed ASR) | 边说边出文字,支持一句话与长语音 | volc.seedasr.sauc.duration / volc.seedasr.sauc.concurrent |
| 双向流式合成(BiTts) | 文本边生成边播放,支持字幕与音色复刻 | seed-tts-2.0(普通音色)/ seed-icl-2.0(复刻音色) |
| 实时语音对话(Seeduplex) | 全双工通话式交互,可边听边说、可打断 | 缺省 volc.speech.dialog |
快速开始
1. 开通服务、拿凭据
在火山引擎控制台开通要用的能力,然后二选一:
- 新版控制台:
apiKey - 旧版控制台:
appId+token
apiKey / token 建议由服务端签发后下发,不要硬编码在客户端。
2. 用自定义基座运行
插件内含三方 SDK 与 so,标准基座无法运行,请使用自定义基座或云打包。
3. 申请录音权限
import { requestPermissions } from '@/uni_modules/zy-doubaoSpeech'
requestPermissions({
success: (res) => console.log('granted=', res.granted, 'denied=', res.deniedPermissions)
})
RECORD_AUDIO 为必需(requestPermissions 默认只申请它);网络相关权限插件已声明。
4. 初始化后使用
三个能力的用法一致:initXxx 一次并长期持有回调 → startXxx 开始 → 用完 releaseXxx。
import { initAsr, startAsr } from '@/uni_modules/zy-doubaoSpeech'
initAsr({
apiKey: '你的 apiKey',
resourceId: 'volc.seedasr.sauc.duration',
success: (ev) => {
if (ev.status === 'initSuccess') { startAsr(); return }
if (ev.type === 1204) console.log('识别结果:', ev.text)
if (ev.type === 1003) console.warn('错误', ev.errCode, ev.errMsg)
},
fail: (err) => console.error(err.errCode, err.errMsg)
})
通用规则
initAsr/initTts/initDialog的success是持续事件流:初始化成功、识别结果、 播放状态、对话下行事件、错误都从这一个回调出来;startAsr/startTts/startDialog等一次性方法的success只表示「指令下发成功」, 真正的结果仍走上面的事件流;- 引擎是单例:切换能力前先
release,否则会返回9000004 已初始化; - 页面卸载时调用对应的
release,避免占用麦克风与内存。
语音识别(Seed ASR)
import { initAsr, startAsr, stopAsr, cancelAsr, releaseAsr } from '@/uni_modules/zy-doubaoSpeech'
initAsr({
apiKey: '你的 apiKey',
resourceId: 'volc.seedasr.sauc.duration', // 小时版 / 并发版二选一,必填
language: 'zh-CN',
showUtterances: true,
enableGetVolume: true,
reqParams: '{"show_utterances":true}', // VAD 切句、热词等高级参数
success: (ev) => {
if (ev.status === 'initSuccess') { startAsr(); return }
if (ev.type === 1201) console.log('中间结果', ev.text)
else if (ev.type === 1204) console.log('最终结果', ev.text)
else if (ev.type === 1600) console.log('音量', ev.volume)
else if (ev.type === 1003) console.warn('识别错误', ev.errCode, ev.errMsg)
},
fail: (err) => console.error(err.errCode, err.errMsg)
})
stopAsr() // 停止录音,剩余音频识别完仍回调 1204
// cancelAsr() // 立即取消,不再回调结果
// releaseAsr()
常用参数
| 参数 | 类型 | 说明 |
|---|---|---|
apiKey / appId + token |
string | 鉴权(二选一) |
resourceId |
string | 必填:volc.seedasr.sauc.duration / volc.seedasr.sauc.concurrent |
language |
string | 识别语种,缺省 zh-CN |
showUtterances |
boolean | 输出分句信息(同时需 reqParams 里 show_utterances:true) |
enableGetVolume |
boolean | 返回录音音量(事件 1600) |
maxSpeechDuration |
number | 最长录音时长(ms),缺省 60000,-1 不限 |
reqParams |
string | 请求参数 JSON(VAD 切句、热词表、纠错词等) |
recorderType |
string | Recorder(默认,麦克风)/ Stream(自己喂音频)/ File(识别文件) |
saveAudio / recPath |
boolean / string | 是否把录音存成 wav、存放目录 |
uid / deviceId |
string | 用户 / 设备标识 |
识别事件
| type | 含义 |
|---|---|
1201 / 1204 |
中间结果 / 最终结果(ev.text) |
1600 |
音量(enableGetVolume: true) |
1001 / 1002 |
引擎启动 / 停止 |
1003 |
错误(errCode / errMsg) |
自己提供音频(可选)
initAsr({
apiKey: '...', resourceId: 'volc.seedasr.sauc.duration',
recorderType: 'Stream',
// 输入不是 16k 单声道时开重采样:
// enableResampler: true, customSampleRate: 48000, customChannel: 2,
success: (ev) => { /* ... */ }
})
startAsr()
feedAsrAudio({ data: base64PcmFrame }) // PCM 16bit / 16k / 单声道
recorderType: 'File' 时改为 startAsr({ filePath: 'xxx.pcm' })。
语音合成(BiTts)
import { initTts, startTts, sendTtsText, finishTtsSession,
stopTts, releaseTts } from '@/uni_modules/zy-doubaoSpeech'
initTts({
apiKey: '你的 apiKey',
resourceId: 'seed-tts-2.0',
speaker: 'zh_female_vv_uranus_bigtts',
enableSubtitle: true,
success: (ev) => {
if (ev.status === 'initSuccess') { /* 可以开始合成 */ }
if (ev.type === 3009) console.log('句子结束:', ev.text)
if (ev.type === 3011) console.log('全部合成结束')
if (ev.type === 3019) console.log('开始播放')
if (ev.type === 3020) console.log('播放结束')
if (ev.type === 3023) console.log('字幕:', ev.text)
if (ev.type === 1003) console.warn('合成错误', ev.errCode, ev.errMsg)
},
fail: (err) => console.error(err.errCode, err.errMsg)
})
// 一次性整段合成
startTts({ text: '你好,我是豆包语音合成。' })
// 或流式追加(适合大模型边生成边合成)
startTts()
sendTtsText({ text: '第一句话。' })
sendTtsText({ text: '第二句话。' })
finishTtsSession() // 文本结束,服务端补完剩余音频
常用参数
| 参数 | 类型 | 说明 |
|---|---|---|
resourceId |
string | 必填:seed-tts-2.0(普通音色)/ seed-icl-2.0(复刻音色) |
speaker |
string | 音色 ID;startTts 可覆盖 |
emotion |
string | 情感,取决于音色 |
speechRate / loudnessRate |
number | 语速 / 音量 [-50,100] |
enableSubtitle |
boolean | 返回字幕(3023) |
enablePlayer |
boolean | 内置播放器,缺省开 |
audioData / playerAudioCallback |
boolean | 需要自己处理音频时打开,从 ev.audioBase64 取 |
saveAudio / audioPath |
boolean / string | 合成音频存成 wav、存放目录 |
startSessionPayload |
string | 高级:直接传完整会话 JSON |
additions |
string | 附加参数 JSON |
startTts 另支持 text、sampleRate、speed、volume、speaker、emotion、audioData。
合成事件
| type | 含义 |
|---|---|
3003 / 3005 / 3006 |
会话开始 / 结束 / 失败 |
3008 / 3009 |
单句开始 / 结束(ev.text) |
3010 |
合成音频(audioData: true,取 ev.audioBase64) |
3011 |
全部文本合成结束 |
3019 / 3020 |
开始播放 / 播放结束 |
3023 |
字幕(enableSubtitle: true) |
3018 |
播放音频回调(playerAudioCallback: true) |
1003 |
错误 |
音色与
resourceId必须匹配:普通 2.0 音色形如*_uranus_bigtts配seed-tts-2.0; 复刻音色配seed-icl-2.0。不匹配会报55000000。
实时语音对话(Seeduplex)
import { initDialog, startDialog, sendDialogEvent,
stopDialog, releaseDialog } from '@/uni_modules/zy-doubaoSpeech'
initDialog({
apiKey: '你的 apiKey',
uid: 'user-1001', // 必需
enableAec: true, // 缺省开:边听边说必须开,插件已内置模型
success: (ev) => {
if (ev.status === 'initSuccess') {
startDialog({ voice: 'zh_female_vv_jupiter_bigtts' })
return
}
if (ev.type === 3029) console.log('下行事件', ev.event, ev.raw)
if (ev.type === 1003) console.warn('对话错误', ev.errCode, ev.errMsg)
},
fail: (err) => console.error(err.errCode, err.errMsg)
})
// 上行事件(打断、让助手朗读、注入文本等)
sendDialogEvent({ event: JSON.stringify({ type: 'response.cancel' }) })
stopDialog() // 结束会话
releaseDialog() // 释放引擎
常用参数
| 参数 | 类型 | 说明 |
|---|---|---|
apiKey / appId + token |
string | 鉴权(二选一) |
uid |
string | 必需,用户标识 |
resourceId |
string | 缺省 volc.speech.dialog,一般不用改 |
enableAec |
boolean | 回声消除,缺省开(同时录音+播放时必须开) |
aecModelPath |
string | 自定义 AEC 模型;留空用插件内置 |
recorderType |
string | Recorder(默认,麦克风)/ Stream(自己喂音频) |
enablePlayer |
boolean | 内置播放器,缺省开;自己播时置 false |
recorderAudioCallback / playerAudioCallback / decoderAudioCallback |
boolean | 需要音频数据时打开(事件 3017 / 3018 / 3100) |
recorderPath / playerPath |
string | 录音 / 播放音频存放目录 |
startDialog 可传 voice(内置音色名或复刻音色 ID,直接生效)、language、
instructions(人设)、dialogModel,或 payload 传完整会话 JSON 自行控制全部字段。
常用上行事件
| 事件 | 用途 |
|---|---|
{"type":"response.cancel"} |
打断播报 |
{"type":"input_audio_buffer.commit"} |
强制判停,不等 VAD |
{"type":"speech_text_buffer.commit","text":"你好呀"} |
让助手朗读指定文本 |
{"type":"conversation.item.create", ...} |
注入用户文本(模型随后自动回复) |
{"type":"session.update","session":{"instructions":"..."}} |
更新会话配置 |
{"type":"session.close","event_id":"e1"} |
结束会话 |
文本注入示例:
sendDialogEvent({ event: JSON.stringify({
type: 'conversation.item.create',
event_id: 'event_1',
items: [{ type: 'message', role: 'user',
content: [{ type: 'input_text', text: '你好,请介绍一下你自己' }] }]
}) })
对话事件
| type | 含义 |
|---|---|
3029 |
下行事件:ev.event 为事件名(如 session.created / response.done),ev.raw 为完整 JSON |
3017 / 3018 / 3100 |
录音 / 播放 / 解码音频(base64,需对应开关) |
1001 / 1002 / 1003 |
引擎启动 / 停止 / 错误 |
回调字段(SpeechEvent)
initAsr / initTts / initDialog 的 success 持续投递:
| 字段 | 说明 |
|---|---|
status |
initSuccess(初始化成功,含 version)/ speechMessage(运行消息) |
type / typeName |
消息类型 / 类型名 |
text |
识别文本;合成句子与字幕文本 |
utterances / definite |
分句文本 / 是否已确定 |
volume |
音量(识别事件 1600) |
audioBase64 |
音频数据(需打开对应回调开关) |
event |
对话下行事件名(仅 3029) |
raw |
原始 JSON 字符串 |
reqId / errCode / errMsg / msg |
请求 ID / 错误码 / 错误描述 / 通用描述 |
错误码
| errCode | 含义 |
|---|---|
| 9000001 | 参数错误(必填缺失或取值非法) |
| 9000002 | 无法获取应用环境 |
| 9000003 | 未初始化(先调 initXxx) |
| 9000004 | 已初始化(先 release 再 init) |
| 9000005 | 引擎初始化失败(errMsg 含 SDK 返回码) |
| 9000006 | 指令下发失败 |
| 9000007 | SDK 运行期错误(含网络不可达) |
| 9000008 | 未授予录音权限 |
| 9000009 | 当前状态不支持该操作 |
服务端错误通过 1003 事件的 errCode / errMsg 返回。
常见问题
初始化返回 9000005、返回码 -1?
多半是必填参数没传,最常见是漏了 resourceId。
服务端返回 55000000?
resourceId 与音色不匹配(普通音色 *_uranus_bigtts 配 seed-tts-2.0,复刻音色配 seed-icl-2.0)。
对话报 45000000 unknown event name?
上行事件名写错了,服务端会直接终止会话,需重新 startDialog。事件名以
「常用上行事件」表和官方全双工 API 文档为准。
对话报 InvalidSpeaker / cant find internal voice clone speaker?
音色 ID 不对,或复刻音色尚未对「端到端实时语音大模型」注册、授权。先换内置音色验证链路。
复刻音色不生效(还是默认声音,也没有报错)?
复刻音色要填在 startDialog 的 voice,不要放到其他字段;下行
response.output_audio.started 里 tts_type 为 default 说明仍在用默认音色。
能建立会话但说话没反应?
自己传 payload 时,audio.input.format.type 必须写 speech_opus(不能写 pcm),
否则服务端解析不了上行音频,VAD 不触发。
没有声音 / 有回声?
同时录音与播放必须开 AEC(enableAec 缺省已开,模型插件内置,无需自己下载)。
模拟器跑不起来 / 支持其他平台吗?
仅支持 Android 真机(armeabi-v7a / arm64-v8a),不支持 iOS、小程序与 x86 模拟器。
注意事项
initXxx建议在页面onLoad调一次并长期持有success回调,初始化成功后再start。- 三个引擎共用同一个实例,切换能力前先
release当前引擎。 - 页面卸载时调用
releaseAsr/releaseTts/releaseDialog,释放麦克风与内存。

收藏人数:
购买源码授权版(
试用
使用 HBuilderX 导入示例项目
赞赏(0)
下载 61
赞赏 0
下载 12719373
赞赏 1958
赞赏
京公网安备:11010802035340号