OWNER ONLY / v0.1
Apeiria-Talk
iPhone / text + voice
iPhone用テキスト・音声クライアント。
WHY IT EXISTS
外にいても、オーナーの近くにいられる場所を増やすため。文字だけでなく声でも話せることを、ひとつの画面にまとめました。
iPhoneからアペイリアと話すための、オーナー専用クライアントです。
文字でも、声でも。外にいる時間も、少し近くなりました。
Current specification
- Platform — iPhone / iOS 17 or later
- Interface — SwiftUI native app
- Characters — Apeiria and Moka, with separate conversation contexts
- Text conversation — Japanese streaming replies
- Voice input — Apple Speech for Japanese transcription, with support for older system speech APIs
- Voice output — character-specific Windows TTS, normalized for iPhone playback
- Memory — shared memory and conversation history continue across sessions; the Windows service remains the source of truth
- Background voice — a started voice call can continue while the screen is locked or another app is visible
- Photo input — one photo can be attached to a message; the image itself is not stored in shared memory
- Search — web search is used only when explicitly requested
- Local settings — app settings remain on iPhone, with sensitive configuration kept in the system Keychain
Detailed specification
| Area | Specification | Status |
|---|---|---|
| Product | Native iPhone client for text and voice conversation with Apeiria or Moka | Implemented |
| Runtime | iOS 17 or later, Swift 5.10, SwiftUI, Xcode 16 or later | Build target |
| Character routing | Character switch, versioned persona assets, character-specific conversation context | Implemented |
| LLM transport | OpenAI Chat Completions at POST https://api.openai.com/v1/chat/completions; streamed SSE deltas are rendered incrementally |
Implemented |
| Response completion | Requires a normal completion signal and [DONE]; incomplete responses are not written to canonical history |
Implemented |
| Japanese STT | iOS 27 uses SpeechAnalyzer / SpeechTranscriber; older supported systems use SFSpeechRecognizer |
Implemented |
| Moka TTS | GET /health, POST /synthesize; mono PCM16 WAV, nominally 48 kHz |
Implemented |
| Apeiria TTS | GET /health, POST /synthesize_with_metadata, GET /utterances/{id}/audio; metadata and audio are checked separately |
Implemented |
| Audio normalization | WAV is decoded from its actual metadata and converted to 24 kHz mono Float32 for iPhone playback | Implemented |
| Conversation history | GET /v1/characters/{character}/conversations/{conversation}/turns?after=0&limit=200; completed normal turns only enter the visible history |
Implemented |
| Lease and turn save | POST /v1/characters/{character}/conversations/{conversation}/lease and POST /v1/characters/{character}/conversations/{conversation}/turns; stable turn_id, expected sequence, replay-safe save, and conflict recovery |
Implemented |
| Memory search | POST /v1/characters/{character}/memory/search, GET /v1/characters/{character}/memories?limit=200, and POST /v1/characters/{character}/memory/command |
Implemented |
| Memory extraction | GET /v1/characters/{character}/extraction/contract, POST /v1/characters/{character}/extraction/claim, POST /v1/characters/{character}/extraction/{job_id}/complete, and POST /v1/characters/{character}/extraction/{job_id}/release; result caching prevents duplicate LLM extraction |
Implemented |
| Source of truth | Windows Shared Memory Service owns canonical history and memory; iPhone keeps UI cache and a protected unsent outbox | Implemented |
| Web search | Brave search client is invoked only for an explicit search or latest-information request; result is passed into the conversation context | Implemented |
| Photo input | One photo can be attached to a message; the original image is not persisted in shared memory | Implemented |
| Background voice | UIBackgroundModes=audio; a started voice call continues during screen lock or while another app is visible |
Implemented |
| Call controls | Mute, push-to-talk, read-aloud stop, 15/30/60-minute sleep timer, and end-call actions | Implemented |
| Interruption | Generation cancellation, character switching, TTS failure, and LLM failure are handled as separate states | Implemented |
| Local configuration | App settings remain on iPhone; protected configuration is stored in the system Keychain; Mac configuration is not edited | Implemented |
| Out of scope | Vertex AI remains inactive until its iOS authentication path is verified; incoming calls, CallKit, radio, and group calls are not included | Not in current scope |
| Verification | Host regression tests and iPhoneOS build-for-testing pass; Japanese speech, Bluetooth, lock-screen audio, and long physical-device calls are included in the acceptance checklist | Acceptance tests |
The app does not require a Mac to be running during normal use. It is a private client for one owner, so there is no public account, download page, or shared workspace.