ワンクリックで
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