3.4 KiB
报修语音输入操作日志
操作时间:2026-09-08。操作类型:扩展。影响模块:图05故障描述、系统权限。
实现
speech_to_text 7.4.0 调用设备系统识别服务;只在点击语音输入时初始化和申请权限。应用不保存录音文件,不向业务后端发送音频,系统识别服务可能使用网络。识别结果进入原故障描述,可在结束后校对编辑,再沿用既有草稿与报修提交接口。
RepairSpeech 接口隔离平台和组件测试;SystemRepairSpeech.instance 复用唯一系统实例,优先匹配设备提供的 zh-CN 语种。RepairSpeechButton 保存启动时的文本与选区,将本轮完整识别结果替换同一区域,避免中间结果重复追加。保留前后文字,按字符簇限制2000字,避免截断表情。拒绝权限、不可用、网络错误、无识别结果均有中文反馈,已有文字保留。
识别期间禁止下一步、暂存、地址切换及照片操作;用户可结束识别。初始化时的系统授权窗口可能触发 inactive,不能误判为切后台;paused、离页和50秒兜底超时会取消识别,迟到回调不再修改输入。
变更文件
apps/user_app/lib/data/services/repair_speech.dart:系统单例适配、识别回调、停止与取消。apps/user_app/lib/ui/features/tickets/repair_speech_button.dart:文字选区保护、状态、权限错误与生命周期。apps/user_app/lib/ui/features/tickets/repair_page.dart:描述框内语音入口、识别中操作约束。apps/user_app/android/app/src/main/AndroidManifest.xml:麦克风权限及 RecognitionService 查询;显式禁用蓝牙识别支持,未额外申请蓝牙权限。apps/user_app/ios/Runner/Info.plist:麦克风和语音识别用途;相机/相册用途补充实际报修照片功能。apps/user_app/pubspec.yaml、pubspec.lock:新增speech_to_text及3项传递依赖,未升级其他既有依赖。apps/user_app/test/ui/repair_speech_test.dart:5项语音组件测试。
验证
analyze无问题,全量68项测试通过;随后增加权限弹窗/切后台边界,语音5项定向测试全部通过。8组图05视觉与滚动溢出检查通过,已打开390×844实际截图,语音按钮位于故障描述框右下。Web Release构建通过,API地址为127.0.0.1:12426。
Android Debug构建通过(174.4秒),产物 apps/user_app/build/app/outputs/flutter-apk/app-debug.apk,159209325字节。本次APK编译的API地址为127.0.0.1:12426,设备运行需通过adb reverse转发12426端口或重新构建指定设备可访问的API地址,不能直接把手机环回地址当开发电脑。该构建仍提示speech_to_text/tobias的旧Kotlin Gradle插件兼容性警告,未阻止当前构建;未来升级Flutter需复核。
原API/Web进程已退出且旧临时API文件不存在,已重新编译启动API与Web预览,仍读取原远程配置。浏览器重新登录测试账户后实际看到描述框中的语音输入入口,控制台无警告/错误;本轮未开启麦克风,没有采集现场声音、修改地址或提交工单。
识别平台能力以插件官方说明为准。自动化测试注入可控识别结果,不等同于真实麦克风语音成功;Android/iOS设备和实际语音采集仍未验收。没有新增数据库字段、后端接口或迁移;PostgreSQL和Redis保持原远程配置。