更新记录

1.0.0(2026-07-06) 下载此版本

v1.0.0 初始版本,支持录音、上传、播放、倍速、进度拖拽


平台兼容性

uni-app x(5.14)

Chrome Safari Android iOS 鸿蒙 微信小程序
× × 5.0 12 ×

VoiceMemo 语音备忘组件

uni-app x 语音备忘组件,支持按住说话、上划取消、音频播放、倍速控制、进度拖拽。零依赖,开箱即用。


功能特性

  • 按住说话:仿微信交互,按住录音按钮开始录音
  • 上划取消:录音过程中手指上划超过阈值进入取消状态,松手取消发送
  • 自动上传:录音完成后自动上传音频文件到指定服务器
  • 音频播放:支持播放/暂停、0.7x/1.5x 倍速切换、进度条拖拽定位
  • 权限引导:自动检测麦克风权限,引导用户授权
  • 零依赖:不依赖第三方 UI 库,图标全部用 CSS 绘制,自包含可独立使用

平台兼容性

平台 支持情况
App-Android ✅ 支持
App-iOS ✅ 支持
Web ❌ 不支持
小程序 ❌ 不支持

本组件基于 uni-app x(.uvue + UTS)开发,仅支持 App 端。


安装

方式一:插件市场安装(推荐)

DCloud 插件市场 搜索 "VoiceMemo",点击「使用 HBuilderX 导入插件」即可。

方式二:手动安装

voice-memo 目录复制到项目的 components/uni_modules/ 目录下:

components/
└── voice-memo/
    ├── voice-memo.uvue    # 主组件
    ├── audio-player.uvue  # 音频播放器子组件
    └── package.json       # 插件配置

基础用法

<template>
  <VoiceMemo
    uploadUrl="https://your-api.com/upload"
    :uploadHeaders="{ Authorization: 'Bearer ' + token }"
    @uploadSuccess="onUploadSuccess"
    @delete="onDelete"
  />
</template>

<script setup lang="uts">
import VoiceMemo from '@/components/voice-memo/voice-memo.uvue'

const token = 'your-auth-token'

const onUploadSuccess = (data: { fileUrl: string; duration: number }) => {
  console.log('上传成功:', data.fileUrl, '时长:', data.duration + '秒')
}

const onDelete = () => {
  console.log('用户删除了语音')
}
</script>

进阶用法

编辑回显

<template>
  <VoiceMemo
    :audioUrl="existingVoiceUrl"
    :audioDuration="existingDuration"
    uploadUrl="https://your-api.com/upload"
    @uploadSuccess="onUploadSuccess"
    @delete="onDelete"
  />
</template>

自定义上传逻辑

<template>
  <VoiceMemo
    :customUploader="handleCustomUpload"
    @uploadSuccess="onUploadSuccess"
  />
</template>

<script setup lang="uts">
import VoiceMemo from '@/components/voice-memo/voice-memo.uvue'

const handleCustomUpload = (filePath: string): Promise<string> => {
  return new Promise((resolve, reject) => {
    // 你的自定义上传逻辑
    uni.uploadFile({
      url: 'https://your-api.com/upload',
      filePath: filePath,
      name: 'file',
      success: (res) => {
        const data = JSON.parse(res.data) as UTSJSONObject
        resolve(data['url'] as string)
      },
      fail: (err) => {
        reject(err.errMsg)
      }
    })
  })
}

const onUploadSuccess = (data: { fileUrl: string; duration: number }) => {
  console.log('上传成功:', data.fileUrl)
}
</script>

通过 ref 主动控制

<template>
  <VoiceMemo ref="voiceMemoRef" uploadUrl="https://your-api.com/upload" />
  <button @click="startRecord">开始录音</button>
  <button @click="resetVoice">重置</button>
</template>

<script setup lang="uts">
import { ref } from 'vue'
import VoiceMemo from '@/components/voice-memo/voice-memo.uvue'

const voiceMemoRef = ref<InstanceType<typeof VoiceMemo> | null>(null)

const startRecord = () => {
  voiceMemoRef.value?.startRecord()
}

const resetVoice = () => {
  voiceMemoRef.value?.reset()
}
</script>

Props

属性 类型 默认值 说明
audioUrl string '' 已上传的音频地址(用于编辑回显)
audioDuration number 0 音频时长,单位秒(用于编辑回显)
showDelete boolean true 是否显示删除按钮
showSpeed boolean true 是否显示倍速控制(0.7x / 1.5x)
showEmptyTip boolean true 是否显示空态提示文案
emptyTipText string '请按住下方按钮进行说话录制' 空态提示文案
holdText string '按住说话' 按住按钮默认文案
releaseText string '松手发送' 录音中按钮文案
cancelSlideText string '手指上滑,取消发送' 上划取消提示
cancelReleaseText string '松开手指,取消发送' 松开取消提示
recordingHintText string '正在录音' 录音中底部提示
cancelHintText string '松开取消' 取消中底部提示
maxDuration number 600000 最大录音时长,单位毫秒(默认10分钟)
sampleRate number 44100 采样率
numberOfChannels number 1 声道数
encodeBitRate number 192000 编码码率
format string 'aac' 录音格式(aac / mp3)
cancelThreshold number 80 上划取消阈值,单位 px
uploadUrl string '' 上传接口完整地址
uploadHeaders object {} 上传请求头
uploadFileName string 'file' 上传文件字段名
customUploader function null 自定义上传方法,接收文件路径,返回 Promise

Events

事件 回调参数 说明
recordStart - 录音开始
recordStop { cancelled, tempFilePath, duration } 录音结束(含取消)
uploadSuccess { fileUrl, duration } 音频上传成功
uploadFail { message, tempFilePath } 音频上传失败
delete - 用户删除语音
play - 开始播放(可用于列表互斥)
tooShort - 录音时间太短(小于1秒)
permissionDenied - 麦克风权限被拒绝

暴露方法(defineExpose)

通过 ref 可调用以下方法:

方法 返回值 说明
getAudioUrl() string 获取当前音频 URL
getAudioDuration() number 获取当前音频时长
getIsUploading() boolean 获取是否正在上传
startRecord() void 主动开始录音
stopRecord() void 主动停止录音
reset() void 重置组件状态(清空录音)

插槽

插槽名 说明
record-icon 自定义录音按钮图标(默认使用 CSS 绘制的麦克风图标)
<VoiceMemo uploadUrl="https://your-api.com/upload">
  <template #record-icon>
    <image src="/static/custom-mic.png" style="width: 48rpx; height: 48rpx;" />
  </template>
</VoiceMemo>

注意事项

  1. 平台限制:本组件仅支持 uni-app x App 端(Android / iOS),Web 和小程序不支持 uni.getRecorderManager()
  2. 权限申请:首次使用会自动检测并引导申请麦克风权限,请在 manifest.json 中配置录音权限。
  3. 录音格式:默认使用 aac 格式,如需修改请确保服务器支持对应格式。
  4. 上传配置uploadUrlcustomUploader 二选一,同时配置时优先使用 customUploader
  5. 互斥播放:组件内部通过 uni.$emit('audio-player-mutex') 实现列表中多音频互斥播放,如需自定义互斥逻辑可监听 play 事件。

目录结构

voice-memo/
├── voice-memo.uvue    # 主组件:录音管理 + 上传 + UI 交互
├── audio-player.uvue  # 子组件:音频播放 + 进度条 + 倍速控制
├── package.json       # 插件市场发布配置
└── readme.md          # 本文档

更新日志

v1.0.0

  • 初始版本
  • 支持录音、上传、播放、倍速、进度拖拽
  • 零依赖,自包含设计

License

MIT

隐私、权限声明

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

麦克风权限(RECORD_AUDIO):用于录制语音备忘。

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

插件不采集任何数据。录音文件仅通过用户配置的 uploadUrl 上传至用户指定的服务器,插件本身不存储、不传输、不分析任何数据。

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

许可协议

MIT协议

暂无用户评论。