Skip to content

[codex] voxcpm phone assistant bridge#345

Draft
jjuniper-dev wants to merge 5 commits into
OpenBMB:mainfrom
jjuniper-dev:codex/voxcpm-phone-assistant
Draft

[codex] voxcpm phone assistant bridge#345
jjuniper-dev wants to merge 5 commits into
OpenBMB:mainfrom
jjuniper-dev:codex/voxcpm-phone-assistant

Conversation

@jjuniper-dev

@jjuniper-dev jjuniper-dev commented Jun 21, 2026

Copy link
Copy Markdown

Summary

  • Added a phone-first VoxCPM assistant bridge with a default cloned voice profile.
  • Made ASR-assisted prompt transcription optional so the core app installs cleanly without funasr.
  • Documented the mobile assistant workflow and exposed voxcpm-assistant as a CLI entrypoint.
  • Added a PCA capture staging path so the phone assistant can POST a text-first iPhone capture into PCA alongside the voice reply flow.
  • Aligned the capture payload with the PCA webhook schema by sending source, capture_type, timestamp, and text explicitly.

Why

  • This gives the phone UI a reusable assistant surface for voice playback, backend reply routing, and capture staging.
  • The assistant can now be used as the mobile side of the PCA capture/reply flow.

Validation

  • python -m py_compile src/voxcpm/phone_assistant.py tests/test_phone_assistant.py
  • uv run voxcpm-assistant --help
  • pytest is not installed in this checkout, so the test file could not be executed via uv run pytest here.

Notes

  • The local generated voice profile directory is ignored so the PR stays code-only.
  • The PCA backend reply contract and PCA capture webhook are both configurable via env/CLI flags.

@jjuniper-dev

Copy link
Copy Markdown
Author

I need Claude to take a look at this and see if architecturally sound and if it's good for a release

…arity

The capture payload emitted by the phone assistant did not match
schemas/pca_capture_event.schema.json (additionalProperties: false,
required classification/provenance, content not text), so a validating
WF10/WF-Dispatch gateway would reject every capture with HTTP 400 and the
failure was swallowed silently. Rebuild the payload to the contract:
source=iphone_shortcut, capture_type, timestamp, content, classification
(env-overridable via PCA_CAPTURE_CLASSIFICATION, default confidential),
and provenance. Off-contract keys (text/context_note/metadata) are dropped.

Also fix the "Send & Speak" handler: send_btn declared 7 outputs but
prepare_turn returned 6, so Gradio raised on every click. Return
profile_data as the 7th value.

Update tests and README to the conformant contract.

Claude-Session: https://claude.ai/code/session_01RwWk3CSfGsNqpdr47PEMFN
Decouple the phone assistant bridge from PCA so it can be upstreamed:
the PCA-specific ingestion schema mapping now lives downstream, not in
this public TTS project.

- Rename env/UI config to neutral names: ASSISTANT_BACKEND_URL/TOKEN,
  ASSISTANT_CONTEXT, ASSISTANT_BACKEND_MODE, ASSISTANT_BACKEND_MODEL,
  CAPTURE_WEBHOOK_URL/TOKEN. No "PCA" identifiers remain in the code.
- Capture webhook now POSTs a neutral, backend-agnostic event
  ({source, type, timestamp, message, reply, profile, turn}); mapping it
  onto any ingestion schema is the receiving webhook's job.
- OpenAI-compatible backend model name is configurable (default "assistant")
  instead of hardcoded "pca".
- Drop the personal "reddit-female" default profile; --default-profile-name
  now defaults to empty (no auto-load).
- Mask backend/capture tokens in the UI (type="password").
- Update tests and README to the neutral contract.

Claude-Session: https://claude.ai/code/session_01RwWk3CSfGsNqpdr47PEMFN
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant