更新记录
1.0.9(2026-09-08)
- 修复「锁屏 / 切后台后会话一直停在进行中」:Android 静默续听本无上限,锁屏后系统掐掉麦克风(后台应用收音静音),识别器反复报「没听到语音」导致插件在后台无限重启。现两端在应用退后台的瞬间自动收尾——Android 监听 Activity onPause(UTSAndroid.onAppActivityPause),iOS 在原生核心监听 didEnterBackgroundNotification 并以内部事件(EVENT_BACKGROUND=6,不进用户回调)通知状态机。收尾语义与手动停止一致:有已识别文字则照常 onFinish 交付(autoStopped = true),并恢复提示音音量;无文字按无语音/看门狗路径收尾
- 回归测试新增锁屏用例:收音中锁屏自动收尾并交付文字、静默续听等待中锁屏结算已积累文字
1.0.8(2026-09-08)
- 新增
mutePrompts选项(默认 true):会话期间静音 Android 系统识别提示音。Google 语音服务在每段识别开始/结束会播放「哔」声,公开 API 无法关闭(Google Issue Tracker 36955936 悬而未决),静默续听频繁重启识别器时提示音随每段连续作响。按业界通行做法(Spokestack / SpeechNotes / speech_to_text 社区方案),会话开始用 AudioManager 静音提示音所在音频流——媒体流与通知流随 Google App 版本而异,两者都压(API 23+ 用 ADJUST_MUTE 并以 isStreamMute 校验,个别 ROM 回退音量置 0,21/22 回退 setStreamMute)——会话结束(onFinish / onError / cancelListening)自动恢复,原生层幂等、异常安全,结果打fzVoiceSpeech日志便于 logcat 核实。注意:会话期间媒体播放与通知提示音会被临时压掉,需要保留时传mutePrompts: false;iOS 的 Speech 识别不播提示音,本选项在 iOS 无作用 - 示例页设置新增「静音提示音」开关(默认开);
interface.uts/index.d.ts类型与文档同步 - 回归测试新增提示音静音用例:会话静音一次(重启不重复)、结束/取消恢复,持续失败报错路径恢复
1.0.7(2026-09-08)
- 示例页改为点击开始、再次点击结束,默认不限时(
maxDuration: 0),可选择时长上限。 - Android 在识别器尚未就绪时收到停止请求,等待就绪后再通知原生停止,保留 3 秒收尾兜底。
- Android 静音收段自动续听,不消耗网络/服务错误重试预算;持续网络/服务失败仍有上限并通过 onError 报错。
- 文档与类型注释同步区分 Android / iOS 续听和回调行为;插件 API 默认最长时长仍为 60000 毫秒,手动结束需显式传入 maxDuration: 0。
- 新增 6 项语音会话模拟回归测试,覆盖连续静音续听、全文拼接、停止时序和按钮重复点击。
平台兼容性
uni-app(4.27)
| Vue2 | Vue3 | Vue3插件版本 | Chrome | Safari | app-vue | app-nvue | Android | Android插件版本 | iOS | iOS插件版本 | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| - | √ | 1.0.2 | - | - | - | - | 5.0 | 1.0.2 | 13 | 1.0.2 | - |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| - | - | - | - | - | - | - | - | - | - | - | - |
fz-voice-speech
1.0.9
零 SDK 的实时语音转文字。Android 走系统 SpeechRecognizer(Google 语音服务),iOS 走系统 Speech。不要 API Key,音频只交给系统官方识别。默认语言 en-US。
拷到 uni_modules 即可。UTS 必须打自定义基座或正式包。改原生代码后重新打基座。
环境
| 项 | 要求 |
|---|---|
| HBuilderX | 4.27+ |
| 工程 | uni-app Vue3 |
| Android | minSdk 21,设备需 Google 应用 / Play 服务 |
| iOS | 13.0+ |
权限由插件 config.json 自动合并:Android RECORD_AUDIO,iOS 麦克风 + 语音识别。自定义 iOS 弹窗文案可在宿主 manifest.json 写 NSMicrophoneUsageDescription / NSSpeechRecognitionUsageDescription。
接入
- 复制
uni_modules/fz-voice-speech到工程。 - 制作自定义调试基座。
- 页面加载时预热权限。
import { prepare, isRecognitionAvailable } from '@/uni_modules/fz-voice-speech'
if (!isRecognitionAvailable()) {
// Android 无 Google 服务时会走到这里,降级打字
}
prepare().then(() => {
// 已授权则立刻返回;首次会弹权限框
}).catch(err => {
// 2001 麦克风被拒 / 2002 语音识别被拒(iOS) / 2003 设备不支持
})
非 App 平台的 import 放在 // #ifdef APP-PLUS 里,或自己写同签名 stub。完整示例见 pages/voice/voice.vue。
用法
点击开始、再次点击结束。示例页默认 maxDuration: 0(不限时),静音会自动续听,锁屏或切后台会自动收尾。
import {
startListening,
stopListening,
cancelListening,
isListening
} from '@/uni_modules/fz-voice-speech'
export default {
data() {
return { text: '', talking: false }
},
onUnload() {
cancelListening()
},
methods: {
onMicTap() {
if (isListening()) {
stopListening()
return
}
startListening({
locale: 'en-US',
maxDuration: 0,
onStart: () => { this.talking = true },
onPartial: res => { this.text = res.text },
onFinish: res => {
this.talking = false
this.text = res.text
},
onError: () => { this.talking = false }
})
}
}
}
<view @click="onMicTap">{{ talking ? '点击结束' : '点击开始说话' }}</view>
onPartial 是全文替换,不要自己拼接。最终文字只从 onFinish 来。页面退出调 cancelListening()。
按住说话用同一套 API:touchstart 调 startListening,touchend 调 stopListening,touchcancel 调 cancelListening。短按或上滑取消直接 cancelListening()。
API
import {
startListening,
stopListening,
cancelListening,
isListening,
prepare,
isRecognitionAvailable
} from '@/uni_modules/fz-voice-speech'
| 接口 | 说明 |
|---|---|
startListening(options?) |
发起会话。立刻返回,结果走回调 |
stopListening() |
收尾,最终文字从 onFinish 回来 |
cancelListening() |
作废本次会话,不触发任何回调 |
isListening() |
会话进行中(含启动、收尾)为 true |
prepare() |
申请权限并检查可用。已授权立即 resolve |
isRecognitionAvailable() |
只查设备是否支持,不弹权限 |
startListening 参数:
| 参数 | 默认 | 说明 |
|---|---|---|
locale |
"en-US" |
BCP 47,如 en-GB、zh-CN |
preferOffline |
false |
尽量端上识别。Android 未下载离线包会回退在线 |
mutePrompts |
true |
静音 Android 识别「哔」声。会话期间媒体/通知声也会被压掉,要保留传 false。iOS 无作用 |
maxDuration |
60000 |
到点自动 onFinish(autoStopped = true)。传 0 由按钮结束 |
onStart |
麦克风就绪。Android 每次会话最多一次;iOS 续听可能再触发 | |
onPartial |
{ text } 实时全文 |
|
onVolume |
{ volume } 0~1,约 80ms 一次 |
|
onFinish |
{ text, duration, autoStopped },恰好一次 |
|
onError |
与 onFinish 互斥,恰好一次 |
autoStopped 在达到时长上限或锁屏/切后台自动收尾时为 true。
错误码
| errCode | 含义 | 处理 |
|---|---|---|
| 1002 | 已有任务进行中 | 忽略 |
| 2001 | 麦克风权限被拒 | 引导去系统设置 |
| 2002 | 语音识别权限被拒(iOS) | 引导去系统设置 |
| 2003 | 设备无识别服务 | 降级打字 |
| 3001 | 没听到内容 | 正常分支,轻提示即可 |
| 4001 | 网络错误 | 提示检查网络 |
| 4002 | 识别超时 | 提示重试 |
| 4003 | 识别服务错误 | 弱网高发,提示重试或改离线 |
| 5001 | 引擎错误 | 带 errMsg 上报 |
注意
- 标准基座跑不了,必须自定义基座或正式打包。
- Android 模拟器要用带 Google APIs 的镜像。
- 锁屏 / Home / 切应用会立刻收尾:有文字走
onFinish,没文字按 3001/4002 结束。不支持后台续听。 - 插件不做网络请求、不落盘音频。App Store 隐私标签声明「音频数据」,用途选 App Functionality。

收藏人数:
购买源码授权版(
试用
赞赏(0)
下载 13
赞赏 0
下载 12701258
赞赏 1956
赞赏
京公网安备:11010802035340号