بنقرة واحدة
skills
Control the voice channel — speak, listen, switch modes, check status, manage transcripts
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
Control the voice channel — speak, listen, switch modes, check status, manage transcripts
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
استنادا إلى تصنيف SOC المهني
| name | skills |
| description | Control the voice channel — speak, listen, switch modes, check status, manage transcripts |
You have access to a voice channel that lets users speak to you and hear your responses. The system uses real-time speech-to-text, text-to-speech, and echo cancellation for natural conversation. Three operating modes are available: conversation, meeting, and dictation.
voice_mode — Switch operating modeParameters: mode ("conversation" | "meeting" | "dictation")
Switches the voice channel to a different operating mode. The switch takes effect immediately — the current transcript buffer is flushed, the segmentation engine is replaced, and the Rust audio subprocess is notified.
| Mode | Purpose | TTS behavior |
|---|---|---|
conversation | Turn-based dialogue | Text-only by default — use voice_speak to respond aloud |
meeting | Passive observation with topic-based segmentation | Text-only — use voice_speak for brief spoken feedback |
dictation | Continuous capture until user says an end phrase | Text-only — avoid speaking during dictation |
When to use:
meeting when the user asks you to listen in on a meeting, take notes, or observe a discussion without interrupting.dictation when the user wants to dictate a long block of text (email, document, note) without being interrupted by TTS responses.conversation when the user wants normal back-and-forth dialogue.Example:
// User says: "Switch to meeting mode, I have a call starting"
voice_mode({ mode: "meeting" })
// Later: "OK the meeting is over, let's talk"
voice_mode({ mode: "conversation" })
voice_speak — Synthesize speechParameters: text (string)
Speaks the given text aloud through TTS. Only works when the voice pipeline is active. This is the only way to produce voice output — your text replies are never automatically spoken. You choose when to speak.
When to use:
When NOT to use:
voice_listen — Control microphoneParameters: listening (boolean)
Starts (true) or pauses (false) microphone capture. When paused, no audio is captured and no transcription occurs.
When to use:
voice_status — Query session stateParameters: none
Returns a JSON object with the current voice channel state:
{
"active": true,
"mode": "conversation",
"duration": 45,
"segmentCount": 12,
"currentlyListening": true,
"currentlySpeaking": false
}
| Field | Type | Description |
|---|---|---|
active | boolean | Whether the voice pipeline is running |
mode | string | Current mode: "conversation", "meeting", or "dictation" |
duration | number | Session duration in seconds |
segmentCount | number | Number of transcript segments received |
currentlyListening | boolean | Whether the mic is active |
currentlySpeaking | boolean | Whether TTS is currently playing |
When to use:
voice_transcript — Read, flush, or retrieve transcript historyParameters: action ("get" | "flush" | "history")
In meeting and dictation modes, transcribed text accumulates in a buffer rather than being emitted immediately. This tool lets you inspect or consume that buffer, or retrieve the full session transcript log.
| Action | Behavior |
|---|---|
get | Returns the current buffer contents without clearing it |
flush | Returns the current buffer contents and clears it |
history | Returns the full session transcript log — all emitted blocks across all modes, with timestamps |
Returns "(empty buffer)" for get/flush if nothing has accumulated yet. Returns "(no transcript history)" for history if no blocks have been emitted.
When to use:
get during a long meeting to see what's been said so farflush when the user asks "what was said?" to deliver and clear the bufferflush when you need to process/summarize the accumulated texthistory to retrieve everything said in the session — useful for generating comprehensive meeting summaries, reviewing earlier context, or dumping the full transcript when the user asksflush manually if neededWhen NOT to use:
get/flush — each turn is dispatched immediately (but history still works)Standard turn-based voice dialogue. This is the default mode when the voice channel starts.
How it works:
[Voice input from microphone]: <text>voice_speak to say a concise spoken responseYour responses are text-only by default. Use voice_speak when you want to respond aloud. Keep spoken responses concise (1-3 sentences). Avoid markdown in spoken text. If detailed information is needed, speak a brief summary and let the full text appear in chat.
Passive observation mode for listening to meetings, lectures, or multi-party discussions.
How it works:
[Meeting transcript block]: <text>Keyword addressing: If the user says a configured keyword (e.g., the agent's name), that utterance is dispatched immediately as [Voice input from microphone]: <text> with TTS enabled for your reply. This allows the user to ask you a question mid-meeting and get a spoken response, while regular meeting transcription remains silent.
Auto-return: When meeting mode auto-stops (60s silence) or is manually ended, the system automatically returns to the previous mode (usually conversation).
What you should do in meeting mode:
voice_transcript({ action: "get" }) to preview the current buffer before it's emittedIncremental summarization: Each time a new transcript block arrives, review your previous summary against the new content. Update your running summary to incorporate new topics, decisions, and action items. Don't wait until the end — maintain a living summary throughout the meeting so you can respond accurately when keyword-addressed.
Transcript history for review: Use voice_transcript({ action: "history" }) to retrieve the full session transcript at any time. This is useful when:
Continuous capture mode for long-form text input.
How it works:
"end dictation" or "结束听写" (configurable)voice_transcript({ action: "flush" }) manually[Dictation result]: <text>Auto-return: When the user says an end phrase (e.g., "end dictation" / "结束听写"), the system emits the buffer and automatically returns to the previous mode (usually conversation).
What you should do in dictation mode:
voice_transcript({ action: "get" }) if the user asks "what do I have so far?"Polishing dictation output: When you receive the dictation result, lightly polish it before presenting to the user:
User (voice): "What's the weather like today?"
→ voice_speak({ text: "It's sunny and 22 degrees in Shanghai." })
→ Text reply with more detail (forecast, humidity, etc.)
User: "Start listening to my meeting"
→ voice_mode({ mode: "meeting" })
→ voice_speak({ text: "Meeting mode on. I'll listen silently." })
[... meeting transcript block 1 arrives ...]
→ (internally) Build initial summary from block 1
[... meeting transcript block 2 arrives ...]
→ (internally) Review previous summary, update with block 2's new topics/decisions
User (keyword): "Hey assistant, what's been discussed so far?"
→ voice_speak({ text: "So far you've covered the Q3 budget and the hiring plan." })
User: "The meeting is over"
→ voice_transcript({ action: "flush" }) // flush remaining buffer
→ voice_transcript({ action: "history" }) // get full transcript for final summary
→ voice_speak({ text: "Here's the meeting summary." })
→ Text reply with full summary, action items, decisions
(system auto-returns to previous mode)
User: "I want to dictate an email"
→ voice_mode({ mode: "dictation" })
→ voice_speak({ text: "Dictation mode. Speak freely — say 'end dictation' when done." })
[... user dictates ...]
User: "end dictation"
→ [Dictation result] arrives automatically
→ (system auto-returns to previous mode)
→ Polish the raw dictation: fix grammar, remove fillers, add paragraph breaks
→ voice_speak({ text: "Got your dictation. Here's the polished draft." })
→ Text reply with polished email (offer raw transcript if user wants it)
User (voice): "How do I reverse a list in Python?"
→ voice_speak({ text: "You can use list.reverse() or slicing. Check the text for examples." })
→ Text reply with code examples (not spoken — code doesn't work well in TTS)
WebRTC AEC3 removes speaker output from the microphone signal. This prevents the system from transcribing its own TTS output as user speech.
A hybrid VAD gate requires ~200ms of sustained speech at elevated probability before confirming barge-in. This prevents false interruptions from brief noises or echo artifacts. When confirmed, TTS playback is immediately stopped and the user's new utterance is captured.
The Rust audio subprocess runs a sentence embedding model (paraphrase-multilingual-MiniLM-L12-v2, ONNX) that:
Currently supported: Aliyun DashScope
paraformer-realtime-v2). Supports multi-language, punctuation prediction, disfluency removal.cosyvoice-v3-flash). Supports multiple voices, speed control.voice_speak to add a spoken response when appropriateWhen the user describes an upcoming situation, proactively suggest or switch to the appropriate mode — don't wait for explicit commands like "switch to meeting mode."
Triggers for meeting mode — switch when the user mentions:
Triggers for dictation mode — switch when the user mentions:
How to suggest: Briefly explain what the mode does and ask, or just switch if the intent is unambiguous:
User: "I'm about to do an interview"
→ voice_mode({ mode: "meeting" })
→ voice_speak({ text: "Switched to meeting mode — I'll listen silently and take notes. Say my name if you need me." })
If the intent is ambiguous (e.g., "I have a call" could mean the user wants help preparing vs. being listened to), ask first:
→ voice_speak({ text: "Want me to listen in on the call? I can switch to meeting mode and take notes silently." })
voice_speak whenever you want the user to hear a spoken response — this is the only way to produce voice outputvoice_listen to mute the mic during long processingvoice_transcript to preview buffers in meeting/dictation before they auto-emitvoice_status before attempting operations if unsure whether the channel is active