Dictation
Press the microphone, speak, and a clean, formatted message lands in your composer.
A long reply is slow to type, and a phone call is not always the answer. Dictation gives you a third way. Press the microphone, say what you want to say, and CommSync turns the recording into a written message. It applies spoken punctuation, resolves self-corrections, and spells names the way the conversation spells them. The result lands in the composer as editable text. CommSync sends nothing until you press Send.
Start a take
You can start from three places.
From the closed reply bar
Every conversation ends in a bar that reads Write a reply…. The microphone sits at its right edge, next to the channel chip. Press it and the composer opens already listening.
From the composer
The microphone sits in the composer footer, next to the AI writing menu. It is there in the in-thread composer, in Focus reply, and in the New conversation dialog.
From the keyboard
Press ⌘⇧D (Ctrl+Shift+D on Windows) while the cursor is in the composer. The same keys end the take. Esc cancels it.
The first time, your browser asks for permission to use the microphone. If you refuse, the pill tells you how to allow it again from the address bar.
While you speak
A small pill floats over the composer. It shows a live waveform and a timer while you speak. Press Done (or ⌘⇧D) when you finish. A take stops on its own at three minutes.
Speak the way you would dictate to a person:
- Punctuation. Say "comma", "period", "question mark", "new line", or "new paragraph". CommSync applies them and removes the words. Ordinary punctuation is added where you gave no command.
- Corrections. Say "no wait, make that Wednesday" or "scratch that". Only the corrected version stays.
- Lists. Say "first… second… third" or "bullet point". The message gets a list.
- Names. People on the conversation are spelled the way the conversation already spells them.
CommSync never adds a word you did not say. It does not open with a greeting you did not give, close with a sign-off you did not give, answer a question for you, or continue the message past your last word. A casual one-liner stays a casual one-liner. What you get is your message, written down.
Under the hood, a very short take with nothing to clean — no spoken command, no correction, no list, no stutter — skips the writing model entirely: the transcript is the message. Every other take goes through it, because a false start and a "you know" are exactly what dictation cleans up. CommSync then checks the answer against your words. A word you corrected mid-sentence does not count against it, and a name the conversation already knows is spelled the way the conversation spells it. If the answer dropped or added anything else, CommSync falls back to the plain transcript.
What lands in the composer
Email Greeting, short paragraphs, a list where you enumerated, and your closing. A fresh compose also suggests a subject line when the field is empty.
SMS Short conversational lines. No greeting or closing is added, and no formatting.
- Where it lands. With an empty composer, the take fills it. With text already there, CommSync inserts the take at your cursor. The pill then offers Replace draft and Undo.
- Your signature. If the email account has a signature, CommSync does not add a closing name line. The signature carries your name at send time. Without a signature, a closing you dictated stays as you said it.
- Review first. The result is ordinary editable text. Read it, change what you like, and send when you are ready. Dictation never sends.
Limits and billing
- A take is at most three minutes. Keep to one message per take.
- Each take draws from your workspace's AI credits, like every other AI feature. When the pool is empty the pill reads Add AI credits to dictate and links to billing. See Billing.
- Thirty takes per five minutes per person.
Privacy
The recording exists only for the take. CommSync sends it to the speech model, receives the text, and drops the audio. No recording is stored, and the models run under CommSync's zero-data-retention policy (see CommSync AI). The audit log keeps the length and timing of a take, never its words.
Turn it off
Open Settings, then CommSync AI, and switch off Dictation. The microphone disappears from every composer. The switch is per person.
For developers: the endpoint
API The web composer and the CommSync phone app share one endpoint. It takes an audio clip and returns a transcript plus the formatted message. It is a plain authenticated HTTP call with no browser assumption, so any client that can record audio can use it.
POST /api/ai/dictation
Authorization: Bearer <session token>Send the take as multipart/form-data with an audio file field, or as
application/json with audioBase64. Both shapes carry the same fields.
| Field | Type | Notes |
|---|---|---|
audio | file (multipart) | The clip. audio/wav, audio/m4a, audio/mp4, audio/mpeg, audio/aac, audio/ogg, audio/flac, audio/aiff. Up to 12 MB. |
audioBase64 | string (JSON) | The clip, base64. Same formats and cap. |
mediaType | string | Required with JSON. Optional with multipart (the file's own type wins). |
channel | EMAIL | SMS | Selects the email or the text-message formatting rules. |
mode | reply | compose | reply reads the thread for names and tone. compose suggests a subject. |
threadId | string, optional | The conversation a reply belongs to. Must be visible to the caller. |
emailAccountId | string, optional | Fresh email compose only: the sending line, for the signature rule. |
locale | string, optional | BCP 47, for spelling and punctuation conventions. Example: en-US. |
durationMs | integer, optional | The client's own measure of the take. Recorded in the audit log. |
curl -X POST "$API/api/ai/dictation" \
-H "Authorization: Bearer $TOKEN" \
-F "[email protected];type=audio/wav" \
-F "channel=EMAIL" \
-F "mode=reply" \
-F "threadId=thread_123" \
-F "locale=en-US" \
-F "durationMs=21400"A successful call returns 200 with:
{
"runId": "run_abc",
"transcript": "hi priya comma thanks for sending the revised scope over period",
"formatted": {
"text": "Hi Priya,\n\nThanks for sending the revised scope over.",
"html": "<p>Hi Priya,</p><p>Thanks for sending the revised scope over.</p>",
"subject": null
},
"noSpeech": false,
"channel": "EMAIL",
"mode": "reply",
"durationMs": 21400,
"latencyMs": { "total": 2480, "transcribe": 2210, "format": 270 },
"models": { "transcribe": "…", "format": "…" }
}formatted.htmlis set forEMAILandnullforSMS. It holds only paragraphs, line breaks, and lists.formatted.subjectis set only forEMAILwithmode: compose.noSpeech: truemeans the clip held no intelligible speech. Both text fields are empty, and nothing is billed beyond the transcription call.
Every refusal is JSON with error (a sentence for a person) and a stable
code:
| Status | code | Meaning |
|---|---|---|
| 400 | INVALID_INPUT | A field is missing or malformed. |
| 402 | NOT_ENTITLED | The workspace subscription is inactive. |
| 403 | DICTATION_DISABLED | The person turned dictation or AI off. |
| 404 | THREAD_NOT_FOUND | The thread is not visible to the caller. |
| 413 | AUDIO_TOO_LARGE | Over 12 MB. |
| 415 | UNSUPPORTED_MEDIA_TYPE | Not one of the audio types above. |
| 429 | AI_CREDITS_EXHAUSTED | The workspace is out of AI credits. |
| 429 | AI_SPEND_CAP | The workspace reached its monthly AI spend cap. |
| 429 | RATE_LIMITED | More than thirty takes in five minutes. |
| 502 | UPSTREAM_FAILED | A model call failed. step names which one. |
| 503 | AI_NOT_CONFIGURED | The server has no AI key. |
For the phone app
Record in the device's native format (AAC in an .m4a container is
fine), post it as multipart with mediaType: audio/m4a, and place
formatted.text in the composer. There is no streaming and no second
call: one request, one finished message.