更新记录

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。

接入

  1. 复制 uni_modules/fz-voice-speech 到工程。
  2. 制作自定义调试基座。
  3. 页面加载时预热权限。
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。

隐私、权限声明

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

android.permission.RECORD_AUDIO;iOS 需要麦克风(NSMicrophoneUsageDescription)与语音识别(NSSpeechRecognitionUsageDescription)权限描述,已由插件 config.json 自动合并

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

音频数据只交给操作系统的官方识别服务处理(Android 为设备的 Google 语音服务,iOS 为 Apple Speech 服务),不经过插件作者的任何服务器,插件也不做任何网络请求。

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

无