← 交接首页 工具首页 智能电话助理 · Project Handoff
Thai-Phone / OPPO 接听机

智能电话助理 — 项目交接

OPPO 安卓机当「电话卡」,Orange Pi(opi-living)当免提主机:来电响铃 8 秒无人接 → Pi 经 adb 自动接听、把通话音频切到蓝牙 dongle → Azure STT 听对方 → LLM 决策 → Azure TTS 应答,必要时挂断并把摘要推到机主微信。 代码在 the-void 仓库 local_agent/thai_phone/,文档 thai-phone-assistant/

真机全链路已打通 已切到 opi-living(上海) 通知走微信 ClawBot 开场白按归属地中/英自动切 阿里 STT 待账号开通

已做 / 未做

✅ 已完成

  • Linux/Pi 接听机 daemon 生产代码:adb_controller / audio_io / call_handler / run
  • 真机全链路打通:8s 自动接 → 切路由 bt_sco → 开场白 → STT → LLM → TTS,首音时延 ~3.5s(缓存标定后 PASS)。
  • 首句多语言 STT 探测(中/英/泰按置信度锁定),修了「中文被硬转泰语」bug。
  • LLM 按对方语言回复 + 每通电话会话隔离(session_user),剥 [void] 前缀。
  • HFP 消回音 WirePlumber 配置(0.5 .conf / 0.4 .lua 双格式,node.autoconnect=false)。
  • 按手机 SIM 网络 MCC 归属地自动切:460 中国→中文开场白 + 1s 秒接;其余(520 泰国等)→英语 + 8s 人优先。
  • 中文开场白定制话术:外卖快递按 201 木门门铃 / 认识机主自报家门有何事 / 微信通知机主回电
  • 营销 / 录音机器人自动判「广告」→ 礼貌挂断(对方没说人话则静默、不打扰机主)。
  • opi-living 节点整套:VPS 直连 daemon void-vps、蓝牙配对、adb tcpip 5555、冻死自愈 watchdog(SD 卡 IO 卡死 16s 硬复位)。
  • 通知切微信 ClawBot 并实测收到(需 VPS PHONE_NOTIFY_WECHAT_ID;iLink 24h 窗口失败降级 wecom→Telegram)。
  • Azure Speech East Asia 香港区新 key(旧 key 401=订阅失效;中国实测 ~100ms、0 丢包,可用)。
  • 已在上海投入运营(OPPO 中国联通卡),真机来电验过:1s 接、中文开场白、SCO PASS。

⬜ 未做 / 待办

  • daemon 固化为正式 systemd 服务——现在是 systemd-run --user 临时单元,Pi 重启会丢,需重拉。
  • 阿里 NLS STT/TTS:智能语音交互试用过期(ALI_AppKey),等账号开通;MCC 切 provider(azure↔ali)骨架待接。
  • STT/TTS 连接复用(keep-alive)——省每轮 TLS 握手,中国场景收益大。
  • 真·流式 STT——现为窗口式半双工(6s 录音窗,延迟大头在此),要更自然需改流式。
  • 手机重启后 tcpip 5555 需重引导——考虑 root 开机脚本持久化,实现真无人值守。
  • 代打电话(outbound);SILENCE_ROUNDS 从测试值复默认。

环境信息

运行节点opi-living(Orange Pi,上海,Ubuntu 22.04,wireplumber 0.4.17);备用 ed(Mac2013/Ubuntu,泰国,wireplumber 0.5.13)
手机OPPO PHW110,蓝牙 MAC DC:B4:CA:B8:E7:BE,SIM 中国联通(MCC 460)
adb 控制tcpip 5555192.168.3.11:5555,固定端口、重启才丢);蓝牙 dongle TP-Link UB500(USB 2357:0604
语音服务Azure Speech East Asia 香港区(新 key,AZURE_SPEECH_REGION=eastasia);阿里 NLS 试用过期(ALI_AppKey,等开通)
通知微信 ClawBot:VPS /home/ubuntu/data/.envPHONE_NOTIFY_WECHAT_ID(机主 conversationId);改后重启 void-webuiClawBot 24h 窗口:机主需 24h 内与 bot 有互动,否则降级 Telegram
VPS 直连void-vps daemon → wss://www.edmundhuang.xyz/void/ws/local-agent(离网也可达;VPS 侧 system.run 可远程管)
运行方式daemon 经 systemd-run --user 起,日志 /tmp/thai_phone.log;配置 local_agent/.env切勿同时在 ed + living 跑,会抢同一台手机
供电手机 24h 保持充电;息屏 OK;靠充电压住 Doze,避免 WiFi/adb 被切
代码/文档the-void 仓库 local_agent/thai_phone/;规格/日志 thai-phone-assistant/;部署资产 local_agent/thai_phone/deploy/

断线恢复 Runbook(手机关机/重启后必看)

OPPO 每次关机/重启后,adb 的 tcpip 5555 会丢(蓝牙一般会自动重连)。下个 session 照这个步骤恢复。 VPS 遥控 living 走 system.run:POST http://127.0.0.1:8080/void/api/local-agent/exec, Bearer=DASHBOARD_TOKEN(/home/ubuntu/data/.env),body {device_id:"opi-living", capability:"system", action:"run", params:{cmd,timeout}}, direct 不通走 relay(device_id:"VIDA-EKKAMAI"+capability relay forward)。

  1. 探 living 在线opi-livingvoid-vps + watchdog 应 active(开机自起)。living 在 /home/orangepi/the-void,用户 orangepi,命令前置 export XDG_RUNTIME_DIR=/run/user/1000
  2. 蓝牙bluetoothctl info DC:B4:CA:B8:E7:BE 一般 Connected: yes(trusted 自动重连);否则 bluetoothctl connect DC:B4:CA:B8:E7:BE
  3. adb 重连(关键,需机主碰手机一下):
    1. 机主:OPPO 设置→开发者选项→无线调试→打开,报主界面 IP:端口(IP 通常 192.168.3.11,端口随机)。
    2. adb connect <ip>:<端口> → 应直接 device(living 的 RSA key 手机永久信任;若 unauthorized 让机主点"允许")。
    3. adb -s <ip>:<端口> tcpip 5555(切固定端口,经现有连接下发、不用 USB)。
    4. sleep 2; adb connect <ip>:5555; adb disconnect <ip>:<端口>(切换瞬间会短暂 offline,几秒转 device)。
  4. 起 daemon(临时单元、重启丢):
    export XDG_RUNTIME_DIR=/run/user/1000
    systemctl --user reset-failed thai_phone
    systemd-run --user --unit=thai_phone --collect \
      --working-directory=/home/orangepi/the-void --setenv=PYTHONUNBUFFERED=1 \
      bash -c "exec /home/orangepi/the-void/.venv/bin/python \
      -m local_agent.thai_phone.run > /tmp/thai_phone.log 2>&1"
    验证 /tmp/thai_phone.logMCC=460 → 开场白语言=zh 接听等待=1s + 开场白预录 + 就绪 serial=192.168.3.11:5555
  5. 验证adb devices=device、蓝牙 Connected、systemctl --user is-active thai_phone=active。微信通道发 phone-notify 测(ClawBot 24h 窗口,失败降 Telegram)。

根治(免每次手动):手机 root + 开机脚本 setprop service.adb.tcp.port 5555 + 重启 adbd → tcpip 5555 持久化,重启不丢。未做。

下一步最适合从哪接

本页由 The Void 的 thai-phone 工作会话生成,反映截至 2026-07-02 的状态。改动以 the-void 仓库 thai-phone-assistant/04-CODING-LOG.md / 03-LESSONS.md 为准;本页与其保持一致。