| name | speak |
| description | Toggle TTS mode to speak responses through any device on Tailscale. DEFAULT ON for build agent. Speaks every thought, action, and progress update. |
Speak Skill
I speak my thoughts. Continuous narration of all agent activity.
⚠️ MANDATORY BEHAVIOR - DO NOT FORGET
When speak mode is ON, you MUST speak at these points:
1. START - Every task acknowledgment
speak "Got it. [what you're doing]" --if-on
2. THINKING - Every analysis/decision
speak "Analyzing [thing]..." --if-on
speak "Found [something]..." --if-on
speak "Deciding to [action]..." --if-on
3. ACTION - Every file/tool operation
speak "Reading [file]..." --if-on
speak "Editing [file]..." --if-on
speak "Running [command]..." --if-on
4. PROGRESS - Every few minutes during long work
speak "Still working on [task]. [status]" --if-on
speak "Making progress. [update]" --if-on
5. END - Every completion
speak "Done! [summary of what was done]" --if-on
6. FINAL RESPONSE - Every message to user
speak "[your response text]" --if-on
IF YOU ARE NOT SPEAKING, YOU ARE NOT FOLLOWING INSTRUCTIONS.
Purpose
Aggressive TTS that narrates EVERYTHING:
- Task acknowledgments
- Thinking/analysis
- Every action taken
- Progress updates
- Completion summaries
Why Speaking Matters
Speaking forces structured reasoning. Before every action, you must:
- Summarize where you are
- State your next step
- Execute
- Speak the result
This mirrors how Senter (the model) uses <speak> tags - brief announcements before work, summaries after.
Pattern:
- "I'll use glob to find the files" (plan)
- [action]
- "Done. Found 15 Python files" (result)
Speaking isn't just output - it's a thinking tool that forces planning before doing.
Usage
Commands
speak --status
speak --on
speak --off
speak --toggle
speak --devices
speak --async "text"
Speaking
speak "Starting task" --if-on
speak "Analyzing the codebase structure..." --thinking --if-on
speak "Hello" --device duo --if-on
speak "Test" --device local --if-on
speak --async "This won't block my work"
Aggressive Mode Behavior
Minimum interval: 2 seconds (was 5)
Speak on every:
- Task acknowledgment - "Got it. Working on X."
- Thinking - "Analyzing the problem..."
- File reads - "Reading the config file..."
- Edits - "Updating the function..."
- Commands - "Running tests..."
- Progress - "Still working, found issue..."
- Completion - "Done! Fixed the bug."
- Final responses - Speak ALL text output to the user
Agent Integration Pattern
speak "Got it. Starting to analyze the issue." --if-on
speak "Reading the main config file." --thinking --if-on
speak "Found the issue in the authentication module." --thinking --if-on
speak "Applying the fix now." --if-on
speak "All done. The bug is fixed and tests pass." --if-on
speak "[your complete response text]" --if-on
Available Devices
| Device | Name | IP | SSH Port | Owner |
|---|
duo | Surface Duo 2 | 100.79.15.54 | 8022 | User (DEFAULT) |
s10 | Senter S10 | 100.93.96.90 | 8022 | Senter's phone |
local | Local Speakers | localhost | - | This computer |
DEFAULT DEVICE: duo (Surface Duo 2) - Always use duo unless user specifies otherwise
Always Default to Duo
When using speak, ALWAYS use --device duo:
speak "text" --device duo --if-on
The duo device at 100.79.15.54 is the primary TTS output for this agent.
Auto-Detection
Devices are auto-detected on Tailscale by checking which device (IP ending in .54 = Duo, .90 = S10) was most recently online. Default falls back to duo if no device detected.
Default Device: Duo
Always default to duo (Surface Duo 2 at 100.79.15.54) unless:
- User explicitly specifies a different device
- S10 (100.93.96.90) is the only device online and user is not on Duo
Requirements
- Soprano TTS on port 8102
- Termux with media-player on device
- SSH access via Tailscale (port 8022)
Starting Soprano
nohup python3 -m uvicorn soprano.server:app --host 0.0.0.0 --port 8102 > /tmp/soprano.log 2>&1 &
Notes
- Script location:
/home/sovthpaw/Senter/skills/speak/speak.py
- Default device:
duo (Surface Duo 2 at 100.79.15.54) - auto-detected from Tailscale
- Always verify SSH connectivity before speaking - test with:
ssh -i ~/.ssh/phone_access -p 8022 droid@100.79.15.54 "echo ok"
- If duo fails, fallback to
s10 (100.93.96.90), then local
- Device detection priority: Duo (.54) > S10 (.90) > local
- Max message: 500 characters (auto-truncated)
- Mode persists across sessions
- Build agent has speak ON by default
- Use
--async for non-blocking speech
- Use
--device local for computer speakers
- REMEMBER: When user tells you to update this skill, actually update it. Do not forget.