Commit 6cd9f893747a00be87a43500821d7d31b4402122

Authored by yibo
1 parent 06d4382c

feat(phoneuse): send_wechat_voice_tts 路由到 cgi 全合成路

send_voice_tts_via_hook 的最后一步从 send_voice_via_hook(SEND_VOICE_INTERNAL)
改为 send_voice_cgi_via_hook(SEND_VOICE_CGI)——让 Hermes 的 send_wechat_voice_tts
MCP 工具(wechat-voice-sender skill 调的)走已验证的 uploadvoice cgi 全合成路:
音频上传+投递接收方+发送方本地已发送气泡。docstring 同步更新。

已 adb push 同步到设备 ~/.hermes/event_bus/(android_mcp.py + wechat_hook_send.py),
设备 wechat-image-sender skill 也更新为调 send_wechat_image MCP 工具(弃旧 ACTION_SEND
UI 模拟)。设备文件权限修为 termux uid 可读(原 root:root 导致 MCP 子进程 import 失败)。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
phoneuse/android_mcp.py
... ... @@ -928,7 +928,8 @@ def _build_server():
928 928  
929 929 Full pipeline (runs on-device):
930 930 text → edge-tts (MP3) → ffmpeg (16kHz PCM) → silk-wasm (SILK V3)
931   - → SEND_VOICE_INTERNAL broadcast → WeChat DB insert (status=4, delivered)
  931 + → SEND_VOICE_CGI (internal uploadvoice cgi): audio uploaded + delivered to
  932 + recipient + sent bubble on the sender side. Verified end-to-end.
932 933  
933 934 **DO NOT implement SILK encoding yourself.** This tool handles the entire
934 935 pipeline. Just pass the text you want spoken.
... ...
phoneuse/wechat_hook_send.py
... ... @@ -472,7 +472,8 @@ def send_voice_tts_via_hook(
472 472 """Generate TTS from *text* and send as WeChat voice message to *wxid*.
473 473  
474 474 End-to-end: edge-tts → ffmpeg (16kHz PCM) → silk-wasm (SILK V3) →
475   - wechathook SEND_VOICE_INTERNAL broadcast → WeChat DB insert, status=4.
  475 + wechathook SEND_VOICE_CGI (internal uploadvoice cgi): uploads the audio + delivers
  476 + to the recipient AND inserts a sent bubble on the sender side. Verified end-to-end.
476 477  
477 478 Args:
478 479 wxid: talker id (e.g. 'filehelper'). IMPORTANT: test only with 'filehelper'.
... ... @@ -498,10 +499,11 @@ def send_voice_tts_via_hook(
498 499 except Exception as e:
499 500 return {"status": "error", "error": f"TTS/SILK generation failed: {e}"}
500 501  
501   - # Delegate staging + broadcast to send_voice_via_hook (it handles both
502   - # on-device and off-device paths). Must call while tmp dir is still alive.
503   - result = send_voice_via_hook(wxid=wxid, silk_path=silk_path,
504   - duration_ms=duration_ms)
  502 + # Delegate staging + broadcast to the fully-synthetic cgi sender (uploads audio
  503 + # inline via the internal uploadvoice cgi + delivers to the recipient + inserts a
  504 + # sent bubble). Must call while tmp dir is still alive.
  505 + result = send_voice_cgi_via_hook(wxid=wxid, silk_path=silk_path,
  506 + duration_ms=duration_ms)
505 507 result["tts_text"] = text[:100]
506 508 result["tts_voice"] = voice
507 509 return result
... ...