更新记录

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 回调交给你的业务代码;插件不包含网络请求,不会将声音上传至插件服务端。

接入实时语音识别的建议

  1. 开始识别会话后再调用 startPcmRecording,避免把无效静音帧发给服务器。
  2. onFrame 内不要进行耗时渲染或同步计算,尽快把 base64 发到 WebSocket/识别 SDK。
  3. 用户松手、取消、页面卸载或识别服务报错时调用 stopPcmRecording,释放麦克风。
  4. 服务端若要求 16 kHz、单声道、16 位 PCM,请保持默认 sampleRate: 16000channels: 1frameSize: 1280

常见问题

为什么没有收到 onFrame

优先检查是否在真机 App 上运行、是否已授予麦克风权限、onFrame 是否传入函数,以及应用是否被其他通话/录音功能占用麦克风。

frameSize: 1280 代表多久的声音?

16 kHz、单声道、16 位 PCM 每秒约 32000 字节,因此 1280 字节约为 40 毫秒。这个大小通常能兼顾实时性和网络发送次数。

能否在后台一直录音?

插件只提供前台采集能力。后台录音是否允许还受 iOS/Android 系统能力、应用配置和审核要求影响,需要按你的产品场景单独实现与测试。

错误码

错误码 含义
9050001 未获得麦克风权限
9050002 录音设备初始化失败
9050003 录音启动失败
9050004 录音已停止

隐私、权限声明

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

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

插件不采集任何数据

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

许可协议

MIT协议

暂无用户评论。