diff --git a/crewvoice/.env.example b/crewvoice/.env.example new file mode 100644 index 0000000..7d61ca2 --- /dev/null +++ b/crewvoice/.env.example @@ -0,0 +1,24 @@ +# CrewVoice configuration — copy to .env and fill in. + +# Anthropic API key — powers construction-aware translation (Claude Opus 4.8). +# Get one at https://console.anthropic.com/ +ANTHROPIC_API_KEY=sk-ant-... + +# ElevenLabs API key — powers voice cloning, text-to-speech, and speech-to-text. +# Get one at https://elevenlabs.io/ +ELEVENLABS_API_KEY=... + +# Port the local server listens on. +PORT=3000 + +# --- Delivery (Twilio) — optional; needed to send texts/voicemails to phones --- +# Get these from https://console.twilio.com/ +TWILIO_ACCOUNT_SID= +TWILIO_AUTH_TOKEN= +# The Twilio phone number messages are sent from, in E.164 format. +TWILIO_FROM_NUMBER=+1... + +# Public base URL of THIS server, reachable by Twilio, so it can fetch generated +# audio for voicemail playback (e.g. an ngrok URL in dev, or your deployed domain). +# Only needed for the "voicemail" channel. +PUBLIC_BASE_URL=https://your-domain.example.com diff --git a/crewvoice/.gitignore b/crewvoice/.gitignore new file mode 100644 index 0000000..daf1dd0 --- /dev/null +++ b/crewvoice/.gitignore @@ -0,0 +1,4 @@ +node_modules/ +.env +*.log +.DS_Store diff --git a/crewvoice/README.md b/crewvoice/README.md new file mode 100644 index 0000000..25c5152 --- /dev/null +++ b/crewvoice/README.md @@ -0,0 +1,97 @@ +# CrewVoice + +**Your voice. Every worker's language.** + +A contractor records their voice once. Then they type a message in English, pick a +crew member or a customer, and CrewVoice delivers it as a **voicemail or text in the +recipient's language — in the contractor's own cloned voice.** + +Built for construction: dispatch a job to a Spanish-speaking crew, or follow up on a +bid with a homeowner who doesn't speak English — all in the voice they already know. +It also ships as an **MCP server**, so it plugs straight into the ChatGPT or Claude +you already use. + +> CrewVoice by Allerion · $149/mo · early access. + +--- + +## How it works + +| Agent | What it does | Tech | +|-------|-------------|------| +| **Voice Cloner** | 30-second sample → a voice model that speaks any language as that person | ElevenLabs | +| **Translator** | English → the recipient's language, preserving trade terms (TPO, flashing, drip edge) | Claude Opus 4.8 | +| **Dispatcher** | Speaks the translation in the cloned voice; delivers as voicemail or text | ElevenLabs TTS + Twilio | +| **Two-way** | Crew/customer replies in their language → contractor gets English | ElevenLabs STT + Claude | + +## Setup + +```bash +cd crewvoice +npm install +cp .env.example .env # fill in ANTHROPIC_API_KEY and ELEVENLABS_API_KEY (Twilio optional) +npm start # http://localhost:3000 +``` + +- **`ANTHROPIC_API_KEY`** and **`ELEVENLABS_API_KEY`** are required for the core demo + (clone → translate → speak). +- **Twilio** vars are optional — needed only to deliver texts/voicemails to real phones. +- For the **voicemail** channel, Twilio must be able to reach this server, so set + `PUBLIC_BASE_URL` (an ngrok URL in dev, or your deployed domain). + +## Web demo + +Open `http://localhost:3000`: + +1. **Clone your voice** — record ~30s. +2. **Send a dispatch** — type in English, pick a language, hear it back in *your* voice. +3. **Two-way** — record a reply in any language, get it back in English. + +## HTTP API + +| Endpoint | Body | Returns | +|----------|------|---------| +| `POST /api/clone` | multipart `sample` (audio) | `{ voiceId }` | +| `POST /api/dispatch` | `{ text, targetLanguage, voiceId }` | `{ translation, audio (base64 mp3) }` | +| `POST /api/send` | `{ text, targetLanguage, to, channel: "text"\|"voicemail", voiceId? }` | `{ translation, sid }` | +| `POST /api/transcribe` | multipart `reply` (audio) | `{ original, languageCode, english }` | + +## Use it inside Claude / ChatGPT (MCP) + +CrewVoice ships as an MCP server (`mcp-server.js`) exposing three tools: +`clone_voice`, `translate_dispatch`, and `send_text_dispatch`. + +Register it with any MCP client. For **Claude Code**: + +```bash +claude mcp add crewvoice -- node /absolute/path/to/crewvoice/mcp-server.js +``` + +Or add it to a client's MCP config manually: + +```json +{ + "mcpServers": { + "crewvoice": { + "command": "node", + "args": ["/absolute/path/to/crewvoice/mcp-server.js"], + "env": { + "ANTHROPIC_API_KEY": "sk-ant-...", + "ELEVENLABS_API_KEY": "...", + "TWILIO_ACCOUNT_SID": "...", + "TWILIO_AUTH_TOKEN": "...", + "TWILIO_FROM_NUMBER": "+1..." + } + } + } +} +``` + +Then, from chat: *"Send the crew this in Spanish: start the south elevation, underlayment +down before noon"* — and CrewVoice translates and texts it. + +## Notes + +- This is an early-access MVP. Voice cloning uses ElevenLabs instant cloning; for + production, get consent from anyone whose voice you clone. +- Numbers and vendor choices are illustrative — validate before committing spend. diff --git a/crewvoice/lib.js b/crewvoice/lib.js new file mode 100644 index 0000000..14174af --- /dev/null +++ b/crewvoice/lib.js @@ -0,0 +1,139 @@ +// CrewVoice core — shared by the web server (server.js) and the MCP server (mcp-server.js). +// +// Capabilities: +// translate(text, lang) — construction-aware translation (Claude Opus 4.8) +// cloneVoice(name, buffer, mime) — ElevenLabs instant voice clone -> voice_id +// speak(voiceId, text) — ElevenLabs TTS in the cloned voice -> mp3 Buffer +// transcribe(buffer, mime) — ElevenLabs speech-to-text -> { text, language_code } +// sendText(to, body) — Twilio SMS delivery +// placeVoicemailCall(to, audioUrl)— Twilio call that plays a hosted mp3 (voicemail in your voice) + +import Anthropic from "@anthropic-ai/sdk"; + +const ELEVENLABS = "https://api.elevenlabs.io/v1"; +const TTS_MODEL = "eleven_multilingual_v2"; // multilingual so the cloned voice speaks the target language + +let _anthropic; +function anthropic() { + if (!_anthropic) _anthropic = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY }); + return _anthropic; +} + +function elevenKey() { + const key = process.env.ELEVENLABS_API_KEY; + if (!key) throw new Error("ELEVENLABS_API_KEY is not set."); + return key; +} + +// --- Construction-aware translation ----------------------------------------- + +const TRANSLATE_SYSTEM = `You are a translator for construction and roofing crews. You translate a contractor's spoken dispatch from English into the target language so a field crew or a customer can act on it immediately. + +Rules: +- Output ONLY the translation. No preamble, no quotes, no notes, no alternatives. +- Preserve construction and roofing terminology precisely: TPO, EPDM, flashing, drip edge, underlayment, fascia, soffit, valley, ridge, penetration, elevation, square, course, etc. Use the term a working crew in the target language actually uses on site, not a literal dictionary gloss. +- Keep the tone direct and clear, like a foreman giving instructions or a contractor following up with a homeowner. Keep measurements and numbers exactly as given. +- If the input is already in the target language, return it unchanged.`; + +export async function translate(text, targetLanguage) { + const response = await anthropic().messages.create({ + model: "claude-opus-4-8", + max_tokens: 1024, + system: TRANSLATE_SYSTEM, + messages: [ + { + role: "user", + content: `Target language: ${targetLanguage}\n\nText to translate:\n${text}`, + }, + ], + }); + const block = response.content.find((b) => b.type === "text"); + return block ? block.text.trim() : ""; +} + +// --- ElevenLabs voice ------------------------------------------------------ + +export async function cloneVoice(name, audioBuffer, mimeType) { + const form = new FormData(); + form.append("name", name); + form.append( + "files", + new Blob([audioBuffer], { type: mimeType || "audio/webm" }), + "sample.webm" + ); + const res = await fetch(`${ELEVENLABS}/voices/add`, { + method: "POST", + headers: { "xi-api-key": elevenKey() }, + body: form, + }); + if (!res.ok) throw new Error(`ElevenLabs clone failed (${res.status}): ${await res.text()}`); + return (await res.json()).voice_id; +} + +export async function speak(voiceId, text) { + const res = await fetch(`${ELEVENLABS}/text-to-speech/${voiceId}`, { + method: "POST", + headers: { + "xi-api-key": elevenKey(), + "Content-Type": "application/json", + Accept: "audio/mpeg", + }, + body: JSON.stringify({ + text, + model_id: TTS_MODEL, + voice_settings: { stability: 0.5, similarity_boost: 0.8 }, + }), + }); + if (!res.ok) throw new Error(`ElevenLabs TTS failed (${res.status}): ${await res.text()}`); + return Buffer.from(await res.arrayBuffer()); +} + +export async function transcribe(audioBuffer, mimeType) { + const form = new FormData(); + form.append("model_id", "scribe_v1"); + form.append( + "file", + new Blob([audioBuffer], { type: mimeType || "audio/webm" }), + "reply.webm" + ); + const res = await fetch(`${ELEVENLABS}/speech-to-text`, { + method: "POST", + headers: { "xi-api-key": elevenKey() }, + body: form, + }); + if (!res.ok) throw new Error(`ElevenLabs STT failed (${res.status}): ${await res.text()}`); + return res.json(); +} + +// --- Twilio delivery (text + voicemail) ------------------------------------- + +let _twilio; +async function twilioClient() { + if (_twilio) return _twilio; + const { TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN } = process.env; + if (!TWILIO_ACCOUNT_SID || !TWILIO_AUTH_TOKEN) { + throw new Error("TWILIO_ACCOUNT_SID and TWILIO_AUTH_TOKEN must be set to send messages."); + } + const { default: twilio } = await import("twilio"); + _twilio = twilio(TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN); + return _twilio; +} + +export async function sendText(to, body) { + const from = process.env.TWILIO_FROM_NUMBER; + if (!from) throw new Error("TWILIO_FROM_NUMBER is not set."); + const client = await twilioClient(); + const msg = await client.messages.create({ to, from, body }); + return msg.sid; +} + +// Places a phone call that plays a hosted mp3 — a voicemail in the contractor's voice. +// audioUrl must be publicly reachable by Twilio (see PUBLIC_BASE_URL in server.js). +export async function placeVoicemailCall(to, audioUrl) { + const from = process.env.TWILIO_FROM_NUMBER; + if (!from) throw new Error("TWILIO_FROM_NUMBER is not set."); + const client = await twilioClient(); + const twiml = `${audioUrl}`; + const call = await client.calls.create({ to, from, twiml }); + return call.sid; +} diff --git a/crewvoice/mcp-server.js b/crewvoice/mcp-server.js new file mode 100644 index 0000000..3a510c9 --- /dev/null +++ b/crewvoice/mcp-server.js @@ -0,0 +1,83 @@ +// CrewVoice MCP server — exposes CrewVoice as tools inside ChatGPT, Claude, or any MCP client. +// +// Run over stdio: node mcp-server.js +// Then register it with your MCP client (see README → "Use it inside Claude/ChatGPT"). +// +// Tools: +// clone_voice — clone a contractor's voice from a local audio file +// translate_dispatch — construction-aware English -> target-language translation (text only) +// send_text_dispatch — translate, then deliver as an SMS in the recipient's language + +import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; +import { z } from "zod"; +import { readFile } from "node:fs/promises"; +import path from "node:path"; +import dotenv from "dotenv"; +import { translate, cloneVoice, sendText } from "./lib.js"; + +dotenv.config(); + +const server = new McpServer({ name: "crewvoice", version: "0.1.0" }); + +server.registerTool( + "clone_voice", + { + description: + "Clone a contractor's voice from a local audio sample (~30s). Returns a voiceId used for later dispatches.", + inputSchema: { + audioPath: z.string().describe("Absolute or relative path to an audio file (mp3/wav/webm/m4a)."), + name: z.string().optional().describe("A label for this voice, e.g. the contractor's name."), + }, + }, + async ({ audioPath, name }) => { + const buf = await readFile(audioPath); + const ext = path.extname(audioPath).slice(1).toLowerCase(); + const mime = { mp3: "audio/mpeg", wav: "audio/wav", webm: "audio/webm", m4a: "audio/mp4" }[ext] + || "audio/mpeg"; + const voiceId = await cloneVoice(name || "CrewVoice contractor", buf, mime); + return { content: [{ type: "text", text: `Voice cloned. voiceId: ${voiceId}` }] }; + } +); + +server.registerTool( + "translate_dispatch", + { + description: + "Translate a construction dispatch from English into the crew's or customer's language, preserving trade terminology (TPO, flashing, drip edge, etc.). Returns the translated text only.", + inputSchema: { + text: z.string().describe("The message in English."), + targetLanguage: z.string().describe("Target language, e.g. 'Spanish'."), + }, + }, + async ({ text, targetLanguage }) => { + const translation = await translate(text, targetLanguage); + return { content: [{ type: "text", text: translation }] }; + } +); + +server.registerTool( + "send_text_dispatch", + { + description: + "Translate an English dispatch into the recipient's language and deliver it as an SMS text. Use for crew dispatches or customer/bid follow-ups. Requires Twilio configuration.", + inputSchema: { + text: z.string().describe("The message in English."), + targetLanguage: z.string().describe("Recipient's language, e.g. 'Spanish'."), + to: z.string().describe("Recipient phone number in E.164 format, e.g. +14155551234."), + }, + }, + async ({ text, targetLanguage, to }) => { + const translation = await translate(text, targetLanguage); + const sid = await sendText(to, translation); + return { + content: [ + { type: "text", text: `Sent to ${to} (sid ${sid}).\n\nDelivered text:\n${translation}` }, + ], + }; + } +); + +const transport = new StdioServerTransport(); +await server.connect(transport); +console.error("CrewVoice MCP server running on stdio."); diff --git a/crewvoice/package.json b/crewvoice/package.json new file mode 100644 index 0000000..8a6b86c --- /dev/null +++ b/crewvoice/package.json @@ -0,0 +1,25 @@ +{ + "name": "crewvoice", + "version": "0.1.0", + "private": true, + "description": "CrewVoice — the vertical AI agent for construction crews. Speak a dispatch in English; your crew hears it in their language, in your cloned voice.", + "type": "module", + "main": "server.js", + "scripts": { + "start": "node server.js", + "dev": "node --watch server.js", + "mcp": "node mcp-server.js" + }, + "engines": { + "node": ">=18" + }, + "dependencies": { + "@anthropic-ai/sdk": "^0.69.0", + "@modelcontextprotocol/sdk": "^1.13.0", + "dotenv": "^16.4.5", + "express": "^4.21.2", + "multer": "^1.4.5-lts.1", + "twilio": "^5.3.0", + "zod": "^3.23.8" + } +} diff --git a/crewvoice/public/index.html b/crewvoice/public/index.html new file mode 100644 index 0000000..303b5fe --- /dev/null +++ b/crewvoice/public/index.html @@ -0,0 +1,231 @@ + + + + + +CrewVoice — your voice, their language + + + +
+ +

Your voice. Their language.

+

Speak a dispatch in English. Your crew hears it in their language — in your own cloned voice.

+ + +
+ STEP 1 +

Clone your voice

+

Record ~30 seconds of yourself talking — anything. CrewVoice learns your voice once.

+
+ + + +
+
+
+ + +
+ STEP 2 +

Send a dispatch

+

Type what you'd tell the crew. It comes back as a voice note in their language, in your voice.

+ + + + + +
+
+ Delivered in your voice +
+ +
+
+ + +
+ STEP 3 · TWO-WAY +

Hear back from the crew

+

Record a reply in any language. You get it back in English.

+
+ + + +
+
+
+ In English +
+
+
+
+
+ + + + diff --git a/crewvoice/server.js b/crewvoice/server.js new file mode 100644 index 0000000..fc4dc17 --- /dev/null +++ b/crewvoice/server.js @@ -0,0 +1,131 @@ +// CrewVoice web server — clone a voice, dispatch translated voice notes, deliver as text/voicemail. +// Core logic lives in lib.js (shared with the MCP server). + +import express from "express"; +import multer from "multer"; +import dotenv from "dotenv"; +import crypto from "crypto"; +import { + translate, + cloneVoice, + speak, + transcribe, + sendText, + placeVoicemailCall, +} from "./lib.js"; + +dotenv.config(); + +const { ANTHROPIC_API_KEY, ELEVENLABS_API_KEY, PUBLIC_BASE_URL, PORT = 3000 } = process.env; + +if (!ANTHROPIC_API_KEY || !ELEVENLABS_API_KEY) { + console.warn( + "[CrewVoice] Missing ANTHROPIC_API_KEY and/or ELEVENLABS_API_KEY. " + + "Copy .env.example to .env and fill them in — the API routes will fail until you do." + ); +} + +const app = express(); +app.use(express.json({ limit: "1mb" })); +app.use(express.static("public")); +const upload = multer({ limits: { fileSize: 25 * 1024 * 1024 } }); + +// Short-lived store for generated audio so Twilio can fetch it for voicemail playback. +const audioStore = new Map(); // id -> { buf, expires } +function stashAudio(buf) { + const id = crypto.randomUUID(); + audioStore.set(id, { buf, expires: Date.now() + 60 * 60 * 1000 }); // 1h + return id; +} +app.get("/audio/:id", (req, res) => { + const entry = audioStore.get(req.params.id); + if (!entry || entry.expires < Date.now()) return res.sendStatus(404); + res.type("audio/mpeg").send(entry.buf); +}); + +// Agent 1: clone the contractor's voice from a ~30s sample. +app.post("/api/clone", upload.single("sample"), async (req, res) => { + try { + if (!req.file) return res.status(400).json({ error: "No voice sample uploaded." }); + const name = req.body.name || `CrewVoice contractor ${Date.now()}`; + const voiceId = await cloneVoice(name, req.file.buffer, req.file.mimetype); + res.json({ voiceId }); + } catch (err) { + console.error(err); + res.status(500).json({ error: err.message }); + } +}); + +// Agent 2: dispatch — English in, translated voice note out (in the cloned voice). +app.post("/api/dispatch", async (req, res) => { + try { + const { text, targetLanguage, voiceId } = req.body || {}; + if (!text || !targetLanguage || !voiceId) { + return res.status(400).json({ error: "text, targetLanguage and voiceId are required." }); + } + const translation = await translate(text, targetLanguage); + const audio = await speak(voiceId, translation); + res.json({ translation, audio: audio.toString("base64"), mimeType: "audio/mpeg" }); + } catch (err) { + console.error(err); + res.status(500).json({ error: err.message }); + } +}); + +// Delivery: translate, then send to a recipient's phone as a text or a voicemail. +app.post("/api/send", async (req, res) => { + try { + const { text, targetLanguage, voiceId, to, channel = "text" } = req.body || {}; + if (!text || !targetLanguage || !to) { + return res.status(400).json({ error: "text, targetLanguage and to are required." }); + } + const translation = await translate(text, targetLanguage); + + if (channel === "text") { + const sid = await sendText(to, translation); + return res.json({ translation, channel, sid }); + } + + if (channel === "voicemail") { + if (!voiceId) return res.status(400).json({ error: "voiceId is required for voicemail." }); + if (!PUBLIC_BASE_URL) { + return res.status(400).json({ + error: "PUBLIC_BASE_URL must be set so Twilio can fetch the generated audio.", + }); + } + const audio = await speak(voiceId, translation); + const id = stashAudio(audio); + const sid = await placeVoicemailCall(to, `${PUBLIC_BASE_URL}/audio/${id}`); + return res.json({ translation, channel, sid }); + } + + res.status(400).json({ error: `Unknown channel "${channel}".` }); + } catch (err) { + console.error(err); + res.status(500).json({ error: err.message }); + } +}); + +// Agent 3: two-way — crew/customer replies in their language, contractor gets English. +app.post("/api/transcribe", upload.single("reply"), async (req, res) => { + try { + if (!req.file) return res.status(400).json({ error: "No reply audio uploaded." }); + const { text, language_code } = await transcribe(req.file.buffer, req.file.mimetype); + const english = await translate(text, "English"); + res.json({ original: text, languageCode: language_code, english }); + } catch (err) { + console.error(err); + res.status(500).json({ error: err.message }); + } +}); + +app.get("/api/health", (_req, res) => { + res.json({ + ok: true, + anthropic: Boolean(ANTHROPIC_API_KEY), + elevenlabs: Boolean(ELEVENLABS_API_KEY), + twilio: Boolean(process.env.TWILIO_ACCOUNT_SID), + }); +}); + +app.listen(PORT, () => console.log(`CrewVoice running at http://localhost:${PORT}`)); diff --git a/docs/ai-safety-glasses-brief.md b/docs/ai-safety-glasses-brief.md new file mode 100644 index 0000000..b84dda0 --- /dev/null +++ b/docs/ai-safety-glasses-brief.md @@ -0,0 +1,222 @@ +# AI Safety Glasses — Product & Go-to-Market Brief + +**Status:** Draft v0.1 · **Owner:** TBD · **Last updated:** 2026-06-16 + +--- + +## 1. The opening + +A real production manager, reviewing a consumer smart-glasses product, wrote down the +exact gap we should own: + +> "I am currently investigating sourcing safety-rated lenses to integrate these into my +> daily shop-floor workflow. While the frames themselves aren't officially safety-rated…" + +He bought consumer AI glasses to record POV video of processes and feed it to AI tools +that generate written Standard Operating Procedures (SOPs). It worked — except the +hardware isn't rated for an industrial environment, so he can't actually wear it where +the work happens. + +That is the wedge: **impact-rated (ANSI Z87.1 / EN 166) AI glasses purpose-built for the +shop floor, feeding an SOP/operations intelligence pipeline.** + +## 2. Why this fits Allerion specifically + +Allerion is "autonomous intelligence for the built world" — construction, infrastructure, +industrial operations. The glasses are not a side-quest consumer gadget; they are the +**field data-capture layer** for the platform we already describe: + +| Existing capability | What the glasses add | +|---------------------|----------------------| +| Digital Twin (3D BIM, spatial data) | First-person, geolocated site capture as a live data feed | +| Construction ERP (takeoff, BOQ, estimation) | Hands-free field verification, progress capture, as-built vs. as-designed | +| Agent Orchestration | POV video → transcription → structured SOP / inspection record, generated by agents | +| Sovereign AI (self-hosted) | On-prem processing of sensitive site footage — a hard requirement for many industrial buyers | + +The device is the sensor; the moat is the intelligence pipeline behind it that we already build. + +## 3. The honest competitive read + +**"First to market on AI glasses" is not winnable** and shouldn't be the goal. Meta/Ray-Ban, +Brilliant Labs, Even Realities, Xreal and others own the general-purpose consumer category. +Competing there means losing on capital, supply chain, and brand. + +**"First to own certified industrial AI glasses + an operations-intelligence pipeline" is +winnable**, because: + +- **Certification is a moat, not a feature.** Z87.1 / EN 166 require impact, drop, and lens- + retention testing. It is slow, expensive, and unglamorous — exactly why fashion-first + consumer players avoid it. Once we're through, it protects us. +- **The buyer is a budget holder, not a hobbyist.** A plant/site manager expensing + documentation tooling for a crew is a B2B sale with margin and repeat orders. +- **Demand is already validated** in the field, not hypothesized. + +### Real risks (name them) +- Hardware is capital-intensive and slow. +- Certification lead times run months. +- A consumer incumbent could ship a "rugged" SKU faster than we'd like — so our speed game + is **cert + channel + software**, not the device itself. +- Privacy/consent: always-on cameras in workplaces trigger labor, union, and legal concerns. + This must be designed in (recording indicators, on-prem storage, retention policy), not bolted on. + +## 4. Strategy: buy the hardware, own the intelligence (software-led) + +**We do not manufacture anything.** We white-label glasses that are *already certified and +on the market*, rebrand them **Allerion**, and put 100% of the value in **ALLERION.ai** and +the **crew voice** layer. This is consistent with the company line: *we don't sell software, +we deploy intelligence* — here, the hardware is just the carrier. + +Why this beats building: +- **Zero certification lead time** if we pick a camera-free base (see below) — no re-cert, no + factory, no tooling, no months-long test cycle. +- **Capital-light.** Reseller/white-label agreement + software, not a hardware company. +- **Sidesteps the privacy fight** that made Lucyd drop the camera — voice-first needs no camera. + +### Phase 1 — voice-first, ship now (recommended base: Lucyd Armor) +Rebrand a discreet, already-certified, **camera-free** audio frame (Lucyd Armor: ANSI +Z87.1+ / CSA Z94.3 / EN 166, mic + open-ear audio + walkie-talkie VOIP, 8-hr battery) as the +**Allerion** glasses. Deploy ALLERION.ai + crew voice on it. No re-certification, no privacy +blocker, fastest path to a deployed product. + +### Phase 2 — add a camera SKU for POV → SOP capture +For sites that want video documentation and can manage consent, license a camera-equipped +certified device (Vuzix Blade 2 class / RealWear for rugged, Iristick for ATEX). The video → +SOP pipeline (§6) plugs into the same ALLERION.ai backend. + +### Open commercial questions to close +- White-label/OEM terms with the chosen vendor (Lucyd/Innovative Eyewear or a frame ODM). +- Branding under a reseller agreement vs. becoming the named "manufacturer" — the latter can + shift certification responsibility onto Allerion, so structure the contract deliberately. +- Volume commitments and per-unit economics. + +## 5. Ideal Customer Profile (v0) + +- Manufacturing / production managers documenting SOPs and training materials. +- Construction & infrastructure site supervisors (as-built capture, inspections, progress). +- Field service / maintenance teams needing hands-free, remote-expert workflows. +- Common thread: regulated or hazard environments where eye protection is **mandatory**, so a + certified device is the only device they're allowed to wear. + +## 6. The software pipeline (what we can build now, in this repo's world) + +``` +[Glasses POV capture] → [Secure ingest / on-prem] → [Transcription + vision] + → [Structured extraction: steps, materials, hazards, timestamps] + → [SOP / inspection / progress document generation (agents)] + → [Digital Twin + ERP write-back] +``` + +This is squarely buildable today with current models and is the highest-leverage place to +start, independent of hardware timelines. + +## 6a. CrewVoice — the Phase 1 hero (already built at allerion.io) + +**CrewVoice is the vertical AI agent for construction crews.** It solves the English ↔ +Spanish language barrier that costs the industry billions in rework, injuries, and lost +productivity — not with text translation, but by delivering a contractor's dispatches in the +crew's language, **spoken in the contractor's own cloned voice.** + +The moat is precisely that voice cloning: when a crew member hears *their boss's actual +voice* — in Spanish — telling them what to do, that's trust and authority no text-translation +app (MindForge, Projul, Google Translate) or expensive human interpreter (Boostlingo) can +replicate. It needs no hardware (works on any phone via WhatsApp/SMS), and it understands the +trade ("TPO," "flashing," "drip edge," "underlayment"). + +### Agent architecture (chained, single-purpose agents) +1. **Voice Cloner** — 30-sec sample → a voice model that speaks any language as that person. +2. **Dispatcher** — contractor speaks English → delivered as a Spanish voice note in their voice. +3. **Translator (two-way)** — crew replies in Spanish → contractor receives English. +4. **Safety Agent** (premium) — daily briefing pushed to each crew member at 6 AM, in their + language, in the superintendent's voice. +5. **Documentation Agent** (enterprise) — end-of-day record of what was communicated, to whom, when. + +### Pricing (SaaS, already modeled) +| Tier | Price/mo | Includes | +|------|----------|----------| +| Starter | $149 | 1 voice clone, 100 dispatches, EN→ES | +| Pro | $299 | 3 clones, unlimited dispatches, two-way, 5 languages | +| Enterprise | $499 | Unlimited clones, safety briefings, documentation, API | + +### Why the glasses matter to CrewVoice +CrewVoice already works on a phone — but a phone means a crew member stops, pulls it out, and +looks down. **On the Allerion glasses, CrewVoice becomes hands-free and eyes-up:** the +contractor speaks a dispatch and the crew hears it, in their language, in their own ears, +while their hands stay on the work and their eyes stay on the hazard. The glasses are the +premium delivery layer for a product that already exists — not a new product to invent. + +This is the connective tissue: **CrewVoice (software, built) × Allerion glasses (certified +hardware, white-labeled) = a hands-free bilingual job site.** + +## 7. Proposed first milestones + +| # | Milestone | Why first | +|---|-----------|-----------| +| 1 | **Crew Voice prototype** on a stock camera-free certified frame (Lucyd Armor or sample unit) → ALLERION.ai | Proves the Phase 1 hero with zero manufacturing / cert dependency | +| 2 | **Software pipeline** (voice/video → structured SOP) wired to the existing agents | The compounding asset; works against off-the-shelf footage too | +| 3 | **White-label / OEM terms** with the chosen frame vendor | Unlocks shipping rebranded "Allerion" units | +| 4 | 3–5 design-partner LOIs from ICP sites | Validates demand and shapes the rollout | +| 5 | Privacy/consent + (for Phase 2 camera SKU) re-certification scoping | Gating requirements before camera deployment | + +## 8. Hardware sourcing — what already exists (don't build from scratch) + +The instinct "find safety glasses that are already designed and tested, then just add the +camera" is correct in spirit. The market splits into two camps, and the gap is the space +between them: + +### Camp A — camera + safety rating already exists (but bulky / industrial-looking) +| Product | Certification | Camera | Form factor | +|---------|--------------|--------|-------------| +| **Vuzix Blade 2** | ANSI Z87.1 | Autofocus HD camera | Chunky AR glasses | +| **RealWear Navigator Z1** | Rugged / worn with PPE | HD camera | Headset-style HMD | +| **Iristick G2** | Certified PPE, ATEX (explosive atmospheres) | Camera | Industrial, dual-screen | + +**Implication:** "first to market with a camera safety wearable" is already gone for the +rugged HMD form factor. We don't beat these on industrial AR. + +### Camp B — discreet, all-day, certified safety glasses (but camera deliberately removed) +| Product | Certification | Camera | Why no camera | +|---------|--------------|--------|---------------| +| **Lucyd Armor** | ANSI Z87.1+, CSA Z94.3, EN 16639:2018 | **None — by choice** | Privacy concerns; launched camera-free at CES 2026 | + +Lucyd Armor is exactly the discreet, glasses-like, 8-hour, certified frame the original +reviewer wanted — audio + AI (ChatGPT) + photochromic lenses — but they **intentionally +omit the camera** for workplace-privacy reasons. + +### The actual open gap +**Discreet, all-day-wearable, Z87.1-certified glasses WITH a camera, feeding an AI +SOP/operations pipeline.** Nobody combines all three: the camera players are bulky, and the +discreet-safety players dropped the camera on purpose. + +### ⚠️ The catch with "just add the camera" +ANSI Z87.1 certifies the **complete assembled product as tested**. Bolting an aftermarket +camera onto certified frames generally **voids the certification** — it changes mass, +balance, and structural integrity, and the unit was never impact-tested in that +configuration. So "add a camera" does not dodge certification; it **relocates** it: you +re-certify the integrated camera-glasses unit. + +Good news: starting from a proven certified frame (validated lens geometry and materials) +substantially de-risks and shortens re-certification versus designing optics from zero. + +### Recommended sourcing paths (fastest → slowest) +1. **Partner / license with a discreet Z87.1 frame maker** (e.g. Lucyd/Innovative Eyewear, + or a frame ODM such as Bollé Safety, Uvex, Oakley SI) → integrate a camera module → + re-certify the assembled unit. Closes the exact gap above. +2. **License an existing camera platform** (Vuzix licenses its tech; Iristick for + hazardous/ATEX environments) when industrial-grade or explosive-atmosphere rating matters + more than discreet styling. +3. **Full ODM camera-glasses from Shenzhen** + first-time Z87.1/EN 166 certification — most + control, slowest, highest cost. Only if 1 and 2 can't deliver the form factor. + +The privacy tension Lucyd designed around (always-on cameras in workplaces) is real and must +be engineered in: hardware recording indicator, on-prem/sovereign storage, retention policy. + +## 9. Open questions for the founder + +- Standalone product line, or an accessory/front-end to the existing Allerion platform? (Recommend: the latter.) +- Geography for first certification — US (Z87.1) or EU (EN 166)? +- Build the software pipeline against our own agents now, before any hardware commitment? + +--- + +*This is a strategy draft, not a commitment. Numbers and vendor names are illustrative and +need validation before any spend.* diff --git a/landing/index.html b/landing/index.html new file mode 100644 index 0000000..64240f1 --- /dev/null +++ b/landing/index.html @@ -0,0 +1,126 @@ + + + + + +CrewVoice by Allerion — your voice, every worker's language + + + + + +
+
+ +
Now in early access · Allerion Apps
+

CrewVoice — your voice, every worker's language.

+

+ A contractor records their voice once. Then they type a message in English, pick a + crew or a customer, and CrewVoice sends it as a voicemail or text in the recipient's + language — Spanish, English, more — in the contractor's own cloned voice. Built for + construction. Ships as an MCP server, so it plugs straight into the ChatGPT or Claude + you already use. +

+ Get CrewVoice — $149/mo + Book a demo +
This is the contractor version of the voice-clone voicemail model already proven for real-estate agents.
+
+
+ +
+
+
+
+ Clone once +

Clone your voice

+

Record a short sample and CrewVoice captures your voice. Every message after that goes out sounding like you — no re-recording, no studio.

+
+
+ Translate + send +

In their language

+

Type in English. CrewVoice translates and delivers a voicemail or text in the recipient's language — Spanish, English, and more — in your cloned voice.

+
+
+ MCP +

Works in your existing AI

+

Ships as an MCP server. Plug it into the ChatGPT or Claude you already use and send crew dispatches and bid follow-ups straight from chat.

+
+
+
+
+ +
+
+

Built for the job site.

+

The language barrier between English-speaking contractors and their crews and customers costs the industry billions in rework and lost deals. CrewVoice closes it — in the voice everyone already knows.

+
+
+

Dispatch the crew

+

Send a job to a Spanish-speaking crew as a voice note — in your voice, so it carries your authority.

+
+
+

Follow up the bid

+

Reach a homeowner who doesn't speak English, in their language, without an interpreter or a callback you'll miss.

+
+
+
+
+ +
+
+
CrewVoice by Allerion
+

$149/mo · early access

+

Voicemail, text, and an MCP server for ChatGPT and Claude.

+ Get CrewVoice — $149/mo + Book a demo +
+
+ + + + +