更新记录

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 模拟器。

注意事项

  1. initXxx 建议在页面 onLoad 调一次并长期持有 success 回调,初始化成功后再 start。
  2. 三个引擎共用同一个实例,切换能力前先 release 当前引擎。
  3. 页面卸载时调用 releaseAsr / releaseTts / releaseDialog,释放麦克风与内存。

隐私、权限声明

1. 本插件需要申请的系统权限列表:

RECORD_AUDIO / INTERNET / ACCESS_NETWORK_STATE / MODIFY_AUDIO_SETTINGS / READ_EXTERNAL_STORAGE / WRITE_EXTERNAL_STORAGE

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

语音 SDK 会采集录音音频用于在线识别与实时对话,音频经加密链路直传火山引擎服务端。详情参考 https://www.volcengine.com/docs/6561/79827

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

无

暂无用户评论。