「贵贵」唤醒会话(默认交互方式)
点一次「唤醒贵贵」授权麦克风后即常驻监听:待唤醒 → 听到「贵贵」→ 请说指令 → 识别并执行 → 语音播报结果 → 回到待唤醒。支持一句话直达「贵贵查温度」;说「退出唤醒」或再点按钮立即释放麦克风。
实现上用 MediaRecorder 把每 2.2 秒(指令段 4.2 秒)录成独立完整 webm,先用 Web Audio Analyser 做能量 VAD,静音片段不送 ASR,车间常态安静时几乎不占算力;只有命中唤醒词才把下一段当指令。播报期间设静音窗,防止喇叭声音被自己录回去造成自激;唤醒确认用 0.3 秒提示音,不占用麦克风时间。唤醒词可在设置里改,Whisper 常写的「桂桂 / 龟龟 / 貴貴」等同音与繁体字已做容错。
指令回复一定念出来:唤醒是明确的主动交互,会话内的执行结果会绕过「默认静音」与免打扰时段;自动告警在此期间暂停,不抢话。
响应时延:本机为 2 核 4 线程且内存紧张,base 模型单次转写实测 2–8 秒,随整机负载波动;前端已用 VAD 让静音片段完全不送 ASR、尾端静音提前收段。若唤醒明显偏慢,可改用 python vision/voice_service.py --asr-model tiny(约快 3 倍,但中文同音错字增多,指令纠错层会尽量兜住)。
两条链路,一条默认可用,一条可选离线
识别 ASR:默认走浏览器 SpeechRecognition(zh-CN),零部署、点开即用;识别出的文字交给本地白名单指令解析器,不调用大模型、不上传录音。
播报 TTS:默认走浏览器 speechSynthesis,优先选中文语音;带优先级队列(告警 > 指令回复 > 常规)、同类去重冷却、免打扰时段。平时默认静音;点「唤醒贵贵」时会在用户手势内自动开启,指令结果随即念出来,也可手动开关,避免浏览器自动播放策略与车间误播。
边缘模式(可选,服务器已部署):python start_web.py --with-voice 一键起页面 + 8200 服务;或单独 python vision/voice_service.py --port 8200 --warmup。页面探测到本地 ASR 会自动切换识别后端,也可点「切换离线识别」。装 faster-whisper(本地转写)+ pyttsx3(系统本地合成)时,全链路不出局域网,适合无外网、噪声大、录音不便外发的车间;追求音质可改用 edge-tts,但它要访问微软在线服务,不算离线,/health 里的 offline_tts 会如实标成 false。服务没装依赖时返回结构化错误,前端自动回退浏览器原生,不会假装成功。
接口一览(经同源 /api/voice 代理,后端仅监听 127.0.0.1:8200)
GET /health(服务与后端可用性)· POST /voice/asr {"audio":"<base64>","format":"webm"}(返回 text / 置信度)·
POST /voice/tts {"text":"…"}(返回音频 base64)· GET /voice/voices(可用中文音色)。
请求体上限 8 MB、文本上限 500 字,服务只做转写与合成,不接触设备网关、不写数据库。
语音能做什么
查询:温度、湿度、CO₂、光照、基质、BX-01 糖度、花果数、病害、产量预估、当前配方/世代、摄像头状态、YOLO 版本、系统状态总览。
操作:暂停/继续/单步、人工接管/交还 AI、运行一代/十代、重新测糖、生成诊断、启动/停止摄像头、抓图、切换页面、导出数据、开关播报。
所有读数都取自 Live.env / Live.vision / Live.brix / Evo 当前值,播报里会说明「仿真」还是「真实权重」,不编造实测数据。指令与播报会写进 agent_memory(kind=voice),可回溯谁在什么时候让 Agent 做了什么。
六条硬边界
1. 不下发设备指令:语音只能触发页面已有的查询与按钮级操作,不能直写执行器、不能改配方基因;实机控制仍须经过网关互锁与人工急停。
2. 不用于安全联锁:车间噪声、方言、回声会让识别率波动,语音告警只是提示,阈值保护必须由 PLC / 控制器硬逻辑承担。
3. 权限与隐私:浏览器原生识别通常把音频送到浏览器厂商的在线服务;file:// 或 HTTP 非 localhost 页面拿不到麦克风,需用 localhost / HTTPS。涉密车间请用 faster-whisper + pyttsx3 的全离线组合,不要用 edge-tts。
4. 播报节制:日志类播报按类型 30 秒节流,环境越界告警按点位 5 分钟冷却,22:00–07:00 只记录不发声,防止同一句话刷屏。
5. 中文音色:浏览器 TTS 的音色由操作系统决定,无中文语音时可能读不出汉字;边缘模式可指定 zh-CN-XiaoxiaoNeural 等音色。首次发声必须由用户点击触发。
6. 唤醒词不是安全口令:同音容错提高命中率的同时也提高误触率,因此语音只触发页面白名单操作,绝不直写执行器;唤醒会话随时可一键结束并释放麦克风。
外部浏览器「点了没反应 / 叫不醒贵贵」的排查顺序
1. 先看打开方式:必须走 http(s)://服务器地址:端口/index.html(同源,勿用 file://)。运行 python start_web.py --with-voice(或双击 start_web.bat)会同时起页面与 8200 离线语音服务;直接双击 index.html 用 file:// 打开,浏览器会静默拒绝麦克风,界面表现就是点了没反应。
2. 再看在线识别服务:Chrome / Edge 的原生 webkitSpeechRecognition 把音频送到境外在线服务。本机实测 google.com 与 speech.googleapis.com 均连接超时,因此原生识别必然报 network,不是代码故障。点面板「语音自检」可看到红色阻断项。
3. 用离线服务:本机已装 faster-whisper(中文 base 模型,实测「查温度」识别准确;--asr-model tiny 更轻但会出同音错字)+ pyttsx3(系统 Microsoft Huihui 中文音色),并预置 hf-mirror.com 镜像与本地模型缓存。启动 8200 后页面会自动切换识别后端;也可点「切换离线识别」。换机器时执行 pip install faster-whisper pyttsx3。
4. 麦克风权限:地址栏右侧的麦克风图标设为「允许」;被拒过一次要去站点设置里改回允许。localhost / HTTPS 才会弹授权。
5. 看唤醒会话状态条:点「唤醒贵贵」后应显示「待唤醒」;说「贵贵」后变「请说指令」,此时再下指令。播报期间暂停收音,等它念完再说;想立刻静音就说「退出唤醒」。首次发声由这次点击授权,不用再单独点「开启播报」。
6. 叫不醒时先看「最近唤醒片段」:面板里这段流水会逐条显示 丢弃(未检测到足够人声)/ 跳过(播报静音窗)/ 送ASR / 听到 / 未唤醒 / 已唤醒,并附上该段峰值与自适应阈值——能直接看出是麦克风电平太低、声音被切段、ASR 没认出,还是唤醒词没匹配上。旧版固定窗口硬切 + 固定 0.012 阈值会把轻声的「贵贵」整段丢掉,现已改为自适应底噪阈值、检测到声音才起算、尾静音才收段。
7. 绕过唤醒词:点「手动唤醒(叫不醒时点这里)」直接进入「请说指令」,仍可用语音下指令并听结果;这是唤醒词识别不稳时的兜底入口。另外「识别后端」下拉框现在不再影响唤醒会话:只要 8200 离线 ASR 在线就会自动接管,避免手动选过「浏览器原生」后永久走不通的在线服务。
8. 还不行:看「语音自检」的唤醒循环 / 离线 ASR 两行与「指令与播报记录」;python vision/voice_service.py --self-test 可确认后端。这台机器 2 核且负载偏高,base 模型单段转写约 4~17 秒,说完请等 1~2 秒再继续;明显偏慢可换 --asr-model tiny。文字输入框始终可用,功能与语音指令等价。
0. 最常见的原因:服务没在运行 —— 页面能打开不代表 8200 在线。语音服务是本机独立进程,必须运行 start_server.bat / start_server.sh 并保持终端开启;关掉窗口、重启电脑、或关闭会话都会让服务停止。面板顶部有「离线语音服务已连接 / 未启动」状态灯,每 15 秒刷新一次。喊不醒时先点「点击说话(免唤醒词)」验证录音与识别链路,再点「复制诊断报告(发我定位)」把真实流水发出来;服务端同时会把流水写到 voice_debug.log。
入口:右下角「语音助手」或顶栏状态条 → 点「唤醒贵贵」→ 说「贵贵」→ 说指令 → 听结果。浏览器不支持语音识别时,仍可用面板里的文字输入框完成全部指令(功能等价,只是不用嘴)。