A web app that lets a nonverbal person take part in a conversation by choosing from response options the AI generates, rather than speaking.
The verbal partner says something → an "AI ear" listens → it offers the person several ways to reply (agree, stay neutral, gently push back, ask a question, keep it light, or share an opinion) → the person (or a trusted person) taps the option that fits. That chosen reply is their voice.
Human talk is largely predictable moves — agreeing, staying neutral,
disagreeing, showing interest, keeping it light, steering. AIVoice turns each
of those moves into a selectable option, so a person who can't speak is
expressing the same conversational intent, just by choosing.
Live at https://aivoice.val.run — open the Profile & Setup tab first to describe the person (especially age), then use the Conversation tab.
Rendering mermaid diagram...
The demo provider works with no configuration. To use a real LLM provider, add the matching key in the val's environment settings — the provider then produces responses tailored to the person's profile:
| Provider | Env vars |
|---|---|
| OpenAI | OPENAI_API_KEY · OPENAI_MODEL (opt) |
| DeepSeek | DEEPSEEK_API_KEY · DEEPSEEK_MODEL (opt) |
| OpenRouter | OPENROUTER_API_KEY · OPENROUTER_MODEL (opt) |
| Ollama | OLLAMA_BASE_URL (point at a reachable/tunneled endpoint; http://localhost:11434/v1 is the default) · OLLAMA_MODEL (opt) |
| Anthropic | ANTHROPIC_API_KEY · ANTHROPIC_MODEL (opt) |
| Gemini | GEMINI_API_KEY · GEMINI_MODEL (opt) |
Pick the provider inside the Profile & Setup tab. If the chosen provider is unreachable or lacks a key, the app falls back to the demo provider so a conversation never hard-stops.
index.ts Hono server (frontend + JSON API)
store.ts Types + SQLite (profile, conversation, pending options)
llm.ts Multi-provider LLM abstraction + demo provider
prompts.ts Direction taxonomy + age-appropriate prompt building
frontend/
root.tsx HTML shell
index.tsx React entrypoint
components/App.tsx Chat + profile UI
Conversations and the profile are stored in the val's own project-scoped SQLite database, isolated to this val. To keep the VULNERABLE edge cases clear: a caregiver writing a child's profile should keep the age field accurate, since it is the strongest guard rail for language level.