uni-app 本身不支持语音转文字,必须依赖微信原生录音上传+后端云ASR(如百度、腾讯、讯飞)实现;小程序无法离线识别,需严格遵循音频格式(pcm/wav、16kHz、单声道)、权限配置、token鉴权及限流处理等要求。

直接说结论:uni-app 本身不提供语音转文字(ASR)能力,必须依赖微信原生 API 或第三方云服务(如百度、腾讯、讯飞)完成识别,且小程序端无法纯前端离线识别。
关键判断是:你选的方案,决定了开发复杂度、识别质量、网络依赖和平台兼容性。别指望写个 uni.speechToText() 就能跑通。
用微信原生 API + 后端 ASR 是最轻量的起步方案
微信小程序提供了 wx.getRecorderManager 和 wx.uploadFile,但没有内置识别能力。所谓“微信原生方案”,其实是用它的录音 + 文件上传能力,把音频发给后端 ASR 接口(比如你自己搭的百度/腾讯识别服务)。
- 录音必须用
format: 'pcm'或'wav',sampleRate: 16000,单声道 —— 这是绝大多数云 ASR 的硬性要求,mp3格式会被拒绝或识别率暴跌 - 临时文件路径(
res.tempFilePath)不能直接传给后端;需用wx.getFileSystemManager().readFile读成base64,或用wx.uploadFile直传二进制流 - 微信自己的
https://api.weixin.qq.com/cv/speechrecognition/v1接口已下线或限频极严,**不要依赖它**;实际项目中基本都走自建中转服务 - 真机调试时,iOS 可能因麦克风被其他 App 占用导致
onStart不触发,需加兜底提示和重试逻辑
集成百度语音识别 SDK 要分清运行环境
百度提供两种接入方式:Web API(HTTP)和原生插件(Android/iOS),但微信小程序不能直接用原生插件,必须走 API 中转。
- 在小程序里调用百度 API,需先用
uni.request向你的后端服务(或直连百度 OAuth 接口)获取access_token,再拼到https://vop.baidu.com/server_api请求中 - 音频数据必须是
pcm格式、16bit、小端序,且长度不能超 60 秒(短语音接口限制);超过得切片 + 多次请求 + 合并结果 - 百度返回的
result是数组(如["你好", "今天天气怎么样"]),不是字符串,别直接.join('')就完事 —— 需要判空、去重、处理标点缺失 - 如果用
@dcloudio/uni-plugin-baiduspeech插件,它只支持 App 端(Android/iOS),对小程序无效;插件市场里标“小程序可用”的多数是伪封装,实际仍是走 HTTP
腾讯云/讯飞 SDK 在 uni-app 里要用“桥接”方式
这些厂商的官方 SDK 都不支持直接在 uni-app 的 JS 层调用。所谓“集成”,本质是:用原生代码写一个中间层,暴露简单 JS 接口给 uni-app 调用。
- Android 端需在
main/AndroidManifest.xml显式声明RECORD_AUDIO权限;iOS 端要在Info.plist加NSMicrophoneUsageDescription字符串,否则真机静默失败 - 讯飞的流式识别需要持续推送 PCM 数据块(每块 200–400ms),uni-app 的
onStop是录音结束才触发,无法满足 —— 必须改用onFrameRecorded(仅 Android 支持)或自研音频采集逻辑 - 腾讯云的
cos-wx-sdk-v5是对象存储 SDK,不是 ASR SDK;想用腾讯 ASR,得调它的https://asr.tencentcloudapi.com接口,走标准 POST + 签名 - 所有云服务的免费额度都有“并发数”或“QPS”限制(如腾讯云默认 5 QPS),用户密集点击“说话”按钮时,容易触发限流返回
FailedOperation.LimitExceeded
真正容易被忽略的点是:语音识别不是“按下说话、松开出字”这么线性。 录音起止时机、网络抖动重试、长句断句、标点补全、方言适配、错误码映射(比如百度的 error_no: 20001 表示音频格式错,不是网络错),这些细节堆起来,才是落地的门槛。别卡在第一步“怎么开始录音”,要提前想好第七步“用户听不清识别结果时,怎么一键重试并保留上下文”。











