更新记录
1.0.0(2026-09-24) 下载此版本
zxj-pcm-recorder 是给实时语音业务准备的 uni-app UTS 原生录音插件。与“录完生成一个 MP3/WAV 文件”的录音组件不同,它在用户说话时持续吐出短 PCM 帧,调用方拿到一帧就可以立即通过 WebSocket 发给语音识别服务,因此适合低延迟转写和实时语音交互。
平台兼容性
uni-app(5.0)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| - | √ | - | - | √ | - | √ | √ | - |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| - | - | - | - | - | - | - | - | - | - | - | - |
实时录音器|PCM 音频帧与语音识别
插件 ID:zxj-pcm-recorder
App 端实时 PCM 录音 UTS 插件。它把麦克风录到的声音统一转成 16 kHz、单声道、16 位小端 PCM,再按固定字节数回调 Base64 音频帧,适合实时语音识别、边说边上传等场景。
zxj-pcm-recorder 是给实时语音业务准备的 uni-app UTS 原生录音插件。与“录完生成一个 MP3/WAV 文件”的录音组件不同,它在用户说话时持续吐出短 PCM 帧,调用方拿到一帧就可以立即通过 WebSocket 发给语音识别服务,因此适合低延迟转写和实时语音交互。
检索关键词: uni-app PCM 录音、UTS 录音插件、实时语音识别、RTASR、16k PCM、16 位小端 PCM、Base64 PCM、Android AudioRecord、iOS AVAudioEngine、语音转文字、语音输入、实时音量回调。
适用场景
- 讯飞 RTASR、阿里云语音识别、腾讯云语音识别或自建 WebSocket ASR 服务。
- AI 对话输入、会议实时转写、语音搜索、语音表单和语音指令。
- 需要实时音量值驱动麦克风动画或录音波形的 App 页面。
- Android/iOS 希望统一输出 16 kHz、单声道、16 位小端 PCM 的项目。
如果你的需求是“录制一段音频文件后上传”或“播放录音文件”,请使用 uni.getRecorderManager、录音文件方案或音频播放插件;本插件不生成 MP3/WAV 文件,也不负责把音频上传到任何服务器。
支持平台
- Android
- iOS
H5 和小程序请使用各自平台的录音 API;本插件只解决 App 原生录音帧采集。
支持 uni-app Vue2、Vue3 的 App 构建。当前未实现 Harmony、H5 和小程序端;请用 #ifdef APP-PLUS 将调用限制在 App 端。
输出格式与实现原理
- 采样率: 默认 16000 Hz,可传
sampleRate调整。 - 声道: 默认单声道;Android 可传
channels,实时识别通常建议保持 1。 - 采样位数: 固定为有符号 16 位 little-endian PCM。
- 传输格式: 每帧 PCM 字节转 Base64,方便直接作为 JSON/WebSocket 消息内容传输。
- 音量值:
level为 0 到 1 的 RMS 归一化值,适合直接映射到 UI 动画。
Android 底层使用 AudioRecord 持续读取麦克风数据;iOS 使用 AVAudioEngine 采集后转换成目标 PCM 格式。两端都会按照 frameSize 切帧,因此上层不需要自己处理平台音频格式差异。
使用方法
import {
startPcmRecording,
stopPcmRecording,
isPcmRecording,
} from '@/uni_modules/zxj-pcm-recorder'
startPcmRecording({
sampleRate: 16000,
channels: 1,
frameSize: 1280,
onFrame: ({ base64, level }) => {
// base64 可以直接发送给实时语音识别服务
// level 是 0 ~ 1 的音量值,可用于驱动录音动画
sendToSpeechService(base64)
},
success: () => console.log('开始录音'),
fail: (error) => uni.showToast({ title: error.errMsg, icon: 'none' }),
})
stopPcmRecording({
success: () => console.log('已停止录音'),
})
API 一览
| API | 作用 | 常见用途 |
|---|---|---|
startPcmRecording(options) |
申请/检查权限后开始采集,并持续触发 onFrame |
开始实时转写 |
stopPcmRecording(options) |
停止麦克风采集并释放原生资源 | 发送识别结束信号前停止录音 |
isPcmRecording(options) |
查询当前录音状态 | 控制录音按钮和页面离开清理 |
参数说明
| 参数 | 说明 | 默认值 |
|---|---|---|
sampleRate |
采样率,实时语音识别通常使用 16000 | 16000 |
channels |
Android 声道数;建议单声道 | 1 |
frameSize |
单帧字节数;1280 字节约等于 40 ms 的 16 kHz 单声道 PCM | 1280 |
onFrame |
每帧 PCM 数据回调,必填 | - |
权限与配置
- Android 已在插件的
AndroidManifest.xml声明RECORD_AUDIO,调用前仍需由业务侧申请运行时权限。 - iOS 需要在宿主项目的
manifest.json添加NSMicrophoneUsageDescription,说明应用为何使用麦克风。 - 请在真机 App 中运行。录音权限被拒绝时会返回错误码
9050001。 - 音频内容只通过
onFrame回调交给你的业务代码;插件不包含网络请求,不会将声音上传至插件服务端。
接入实时语音识别的建议
- 开始识别会话后再调用
startPcmRecording,避免把无效静音帧发给服务器。 onFrame内不要进行耗时渲染或同步计算,尽快把base64发到 WebSocket/识别 SDK。- 用户松手、取消、页面卸载或识别服务报错时调用
stopPcmRecording,释放麦克风。 - 服务端若要求 16 kHz、单声道、16 位 PCM,请保持默认
sampleRate: 16000、channels: 1、frameSize: 1280。
常见问题
为什么没有收到 onFrame?
优先检查是否在真机 App 上运行、是否已授予麦克风权限、onFrame 是否传入函数,以及应用是否被其他通话/录音功能占用麦克风。
frameSize: 1280 代表多久的声音?
16 kHz、单声道、16 位 PCM 每秒约 32000 字节,因此 1280 字节约为 40 毫秒。这个大小通常能兼顾实时性和网络发送次数。
能否在后台一直录音?
插件只提供前台采集能力。后台录音是否允许还受 iOS/Android 系统能力、应用配置和审核要求影响,需要按你的产品场景单独实现与测试。
错误码
| 错误码 | 含义 |
|---|---|
9050001 |
未获得麦克风权限 |
9050002 |
录音设备初始化失败 |
9050003 |
录音启动失败 |
9050004 |
录音已停止 |

收藏人数:
下载插件并导入HBuilderX
赞赏(0)
下载 261
赞赏 0
下载 12638271
赞赏 1950
赞赏
京公网安备:11010802035340号