uni-app app端不能直接用navigator.mediadevices.getusermedia,因ios/android webview内核不支持;uni.startvoicerecognition在app端未实现,需用weixin-voice或aliyun-asr等原生插件实现语音识别。

uni-app App端为什么不能直接用navigator.mediaDevices.getUserMedia
因为 iOS 和 Android 的 WebView 内核(WKWebView / X5 / 系统 WebView)根本不支持 getUserMedia,哪怕你写了个 Web 页面在 H5 端能跑,在 App 打包后就是白屏或报错 NotSupportedError: getUserMedia is not supported。uni-app 的 uni.chooseVideo 或 uni.getRecorderManager 也只管录音,不提供语音识别能力——它压根没连上 ASR(自动语音识别)服务。
App端必须走原生层,推荐用uni-app插件市场里的weixin-voice或aliyun-asr
插件市场搜“语音识别”会出来一堆,但真正稳定适配 App(尤其 iOS)的不多。实测下来:weixin-voice 基于微信 SDK 封装,iOS 上需额外配置 URL Scheme 和后台音频权限;aliyun-asr 依赖阿里云实时语音识别 API,要自己配 AccessKey 和 AppKey,但识别准确率高、断句稳。
关键操作步骤:
- 从插件市场下载并导入到
uni_modules目录,不要手动复制文件 - iOS 需在
manifest.json → App SDK 配置 → iOS 模块配置中勾选AudioToolbox和AVFoundation - Android 要在
android/app/src/main/AndroidManifest.xml补上录音权限:<uses-permission android:name="android.permission.RECORD_AUDIO"></uses-permission> - 首次调用前务必加
uni.authorize({scope: 'scope.record'}),iOS 14+ 不授权直接静默失败
uni.startVoiceRecognition 是 H5/小程序专用,App端调用会报undefined
这个 API 在官方文档里没明确标“App 不支持”,但实际运行时返回 undefined 或直接 crash。别被文档误导——uni-app 的语音识别 API 是按平台分发的:uni.startVoiceRecognition 只存在于微信/支付宝/百度小程序和 H5(仅 Chrome 119+),App 端根本没注册该方法。
替代方案是插件暴露的统一接口,比如 weixin-voice 提供:
const voice = uni.requireNativePlugin('weixin-voice');
voice.start({
lang: 'zh-CN',
timeout: 10000
}, (res) => {
console.log('识别结果:', res.result); // res.result 是字符串
}, (err) => {
console.error('识别失败:', err.message);
});
注意:lang 参数对 iOS 影响大,填 en-US 却说中文,识别率会暴跌;timeout 建议设为 8000–12000ms,太短容易截断尾音,太长用户等得烦躁。
识别结果延迟高?检查是否开了continuous但没处理流式回调
有些插件(如 aliyun-asr)支持连续识别(continuous: true),但默认只在结束时吐最终文本。如果你需要“边说边出字”,必须监听 onResult 流式事件,而不是只等 success 回调。
常见掉坑点:
- 没在
start()后立即绑定onResult,导致开头几句丢失 - 把流式结果当最终结果直接渲染,造成重复/错乱(比如“今天天气真”→“今天天气真好”→“今天天气真好啊”)
- Android 上未在
onStop后主动调stop(),下次启动卡住
建议用防抖 + 最终结果校验:流式结果存入临时变量,onStop 触发后再比对长度,只更新更长的结果。
真实项目里,语音识别不是“接上就能用”,而是要反复调 iOS 后台音频开关、测试不同口音下的 lang 适配、处理网络抖动导致的 ASR 中断——这些细节不跑真机、不录十分钟真实对话,根本发现不了。










