[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M718WSJ1PYVCSMAJVSZH68WS":3,"skill-same:01M718WSJ1PYVCSMAJVSZH68WS":93},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":44,"linkOnly":45,"markdownContent":46,"markdownBody":47,"frontMatter":48,"refName":49,"commitSha":50,"skillDirectory":51,"forksCount":52,"repositoryHtmlUrl":53,"repositoryHomepageUrl":6,"ownerHtmlUrl":54,"ownerBlogUrl":55,"ownerDescription":6,"updatedAt":56,"install":57,"resources":70},"01M718WSJ1PYVCSMAJVSZH68WS","oma-voice",null,"Local-first text-to-speech and speech-to-text via the Voicebox MCP server. Generates speech from cloned or preset voice profiles for agent notifications, content voiceovers, and audio asset creation, and transcribes audio files for meeting notes or memos. Runs entirely on-device with no cloud, no API keys, no per-call cost. Use for voice generation, TTS, STT, transcription, voiceover, narration, dictation, audio asset work.","vasceannie\u002Fslopgate","vasceannie","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F20271133?v=4","01M718RGA8VV2EF22XJEMXVQ0Q","Travis Vasceannie","01M718RGB0GWSXBBZBN67Q6NHQ",1,"MIT","https:\u002F\u002Fgithub.com\u002Fvasceannie\u002Fslopgate\u002Fblob\u002Fmaster\u002F.agents\u002Fskills\u002Foma-voice\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43],"voice","oma voice","voicebox","stt","meeting notes","asset","voiceover","work","server","notes","text","notifications","api","mcp server","MCP","files","local","api keys","creation","Audio","2026-11-10 10:12:30",false,"---\nname: oma-voice\ndescription: Local-first text-to-speech and speech-to-text via the Voicebox MCP\n  server. Generates speech from cloned or preset voice profiles for agent\n  notifications, content voiceovers, and audio asset creation, and transcribes\n  audio files for meeting notes or memos. Runs entirely on-device with no cloud,\n  no API keys, no per-call cost. Use for voice generation, TTS, STT,\n  transcription, voiceover, narration, dictation, audio asset work.\n---\n\n# Voice Skill - Local TTS and STT via Voicebox\n\n## Scheduling\n\n### Goal\nDrive the Voicebox local app through its MCP server so any MCP-aware agent can speak (TTS) or listen (STT) without invoking cloud vendors. The skill standardizes intent routing, voice profile resolution, output layout, and guardrails while voicebox itself owns the engines, voice cloning UI, captures archive, and stories editor.\n\n### Intent signature\n- User asks to generate speech, narrate text, produce a voiceover, create an mp3 or wav from text.\n- User wants an audio file transcribed into text, meeting notes, or a transcript.\n- User asks for a voice notification when a long task completes or a workflow step is blocked.\n- Another skill needs local audio generation infrastructure.\n\n### When to use\n- Generating short notification audio for agent task completion or blockers.\n- Producing voiceover, narration, or audio assets (mp3 or wav) for apps and content.\n- Transcribing local audio files (mp3, wav, m4a, webm, flac) to Markdown.\n- Comparing voice profiles by re-running the same text against different profile ids.\n\n### When NOT to use\n- Cloud TTS or high-fidelity multilingual cloud voices -> out of scope; future multi-vendor extension.\n- Real-time microphone dictation loop in the terminal -> use Voicebox app's built-in hotkey dictation.\n- Voice cloning sample upload and profile creation -> done in the Voicebox desktop app UI.\n- Video synthesis, music, sound design -> out of scope.\n- Stories Editor multi-voice timeline composition -> use the Voicebox app UI.\n\n### Expected inputs\n- TTS: text (\u003C= 5000 chars per call), optional profile id, optional engine, optional language, optional output path.\n- STT: audio file path (absolute or relative to `$CWD`), optional language hint.\n- Notification: short message (\u003C= 240 chars), profile id resolved from config.\n\n### Expected outputs\n- TTS: audio file (`wav` — Voicebox's native TTS output format; `mp3` optional via a local ffmpeg transcode) at `.agents\u002Fresults\u002Fvoice\u002F{timestamp}-{shortid}\u002Foutput.{wav|mp3}` plus `manifest.json`.\n- STT: `transcript.md` at `.agents\u002Fresults\u002Fvoice\u002Ftranscripts\u002F{timestamp}-{shortid}\u002F` plus `manifest.json`.\n- Notification: ephemeral playback through Voicebox; no disk write by default.\n\n### Dependencies\n- Voicebox desktop app installed and running locally.\n- Voicebox MCP registered (`claude mcp add --transport http voicebox http:\u002F\u002F127.0.0.1:17493\u002Fmcp`).\n- TTS only: at least one voice profile created in the Voicebox app UI.\n- TTS only: optionally pre-downloaded engine models for the selected profile.\n\n### Control-flow features\n- Branches by mode (notify, asset, transcribe), language, and profile availability.\n- Calls voicebox via MCP tools, with REST `GET \u002Fhealth` as the handshake probe.\n- Reads input audio files and writes generated audio plus manifests.\n- Caches discovered MCP tool names after the first successful `tools\u002Flist`.\n\n## Structural Flow\n\n### Entry\n1. Detect the requested mode: notification, asset TTS, or transcription.\n2. Verify Voicebox is reachable via MCP handshake or `GET \u002Fhealth`.\n3. On the first run only, call MCP `tools\u002Flist` and cache the resolved tool names.\n4. For notification or asset TTS, resolve the target voice profile id. For transcription,\n   validate the audio input and continue without a profile.\n\n### Scenes\n1. **PREPARE**: Validate text length, audio duration, language, output path, and profile id.\n2. **ACQUIRE**: If a required signal is missing, run the clarification protocol once.\n3. **ACT**: Invoke the appropriate MCP tool (TTS or STT) with the resolved parameters.\n4. **VERIFY**: Confirm the response carries audio output or transcript content. Validate manifest fields.\n5. **FINALIZE**: Write `manifest.json` alongside the output. Report the path or transcript to the user.\n\n### Transitions\n- If voicebox is unreachable, surface the install or launch hint and exit. Do not attempt auto-relaunch.\n- If a TTS request has no usable profile, point the user at the Voicebox app UI to create a profile, then exit. A transcription request never needs a profile.\n- If a TTS request exceeds 5000 chars, ask whether to truncate or split. Do not auto-chunk in v1.\n- If an STT input exceeds 30 minutes, ask whether to proceed. Do not auto-split.\n- If the selected engine model is not loaded, ask the user before triggering a download.\n\n### Failure and recovery\n| Failure | Recovery |\n|---------|----------|\n| Voicebox app not running | Print install\u002Flaunch hint, exit code 5 |\n| No voice profile for TTS | Print \"create a profile in Voicebox\" hint, exit code 3 |\n| Engine model missing | Ask before triggering download |\n| Output path outside `$PWD` | Warn the user, require explicit confirmation |\n| TTS over 5000 chars | Ask the user to split or truncate |\n| STT over 30 minutes | Ask the user to confirm |\n| MCP tool name drift | Re-run `tools\u002Flist` and update the cache |\n| SIGINT | Abort the MCP call, write no partial output |\n\n### Exit\n- Success: audio file or transcript exists with a complete manifest, and the path is reported.\n- Partial success: output exists but a guardrail warning is surfaced (length, disk, model fallback).\n- Failure: no output, the blocker (auth, profile, engine, network) is explicit.\n\n## Logical Operations\n\n### Actions\n| Action | SSL primitive | Evidence |\n|--------|---------------|----------|\n| Validate mode and inputs | `VALIDATE` | Clarification protocol in execution-protocol.md |\n| Resolve TTS voice profile | `SELECT` | `voicebox_list_profiles` + config defaults |\n| Health check | `READ` | MCP handshake or `GET \u002Fhealth` |\n| Generate speech | `CALL_TOOL` | MCP `voicebox_speak` |\n| Transcribe audio | `CALL_TOOL` | MCP `voicebox_transcribe` |\n| Write output and manifest | `WRITE` | Audio or transcript plus `manifest.json` |\n| Inspect result | `VALIDATE` | Output presence, duration, manifest fields |\n| Report result | `NOTIFY` | Final user-facing summary |\n\n### Tools and instruments\n- Voicebox MCP server at `http:\u002F\u002F127.0.0.1:17493\u002Fmcp`.\n- REST surface for health and audio retrieval (`GET \u002Fhealth`, `GET \u002Faudio\u002F{generation_id}`).\n- Resource references: voice matrix, prompt tips, execution protocol, checklist.\n\n### Canonical command path\n```text\n# 1. MCP handshake or REST health\nGET http:\u002F\u002F127.0.0.1:17493\u002Fhealth  ->  200 OK\n\n# 2. Discover tool names on first run\nMCP tools\u002Flist                      ->  cache real names\n\n# 3. TTS only: resolve profile\nMCP voicebox_list_profiles          ->  pick profile by name or config default\n\n# 4. Generate or transcribe (STT skips profile lookup and model-status check)\nMCP voicebox_speak     { text, profile, language?, engine?, personality? }\nMCP voicebox_transcribe { audio_path | audio_base64, language?, model? }\n\n# 5. Fetch the generated audio (MCP has no save-to-disk; TTS output is wav)\nGET http:\u002F\u002F127.0.0.1:17493\u002Faudio\u002F{generation_id}  ->  wav bytes\n\n# 6. Persist output + manifest\n.agents\u002Fresults\u002Fvoice\u002F\u003Ctimestamp>-\u003Cshortid>\u002Foutput.wav + manifest.json\n.agents\u002Fresults\u002Fvoice\u002Ftranscripts\u002F\u003Ctimestamp>-\u003Cshortid>\u002Ftranscript.md + manifest.json\n```\n\n### MCP tool mapping (verified against Voicebox 0.5.0)\n\n| Use case | MCP tool | REST backing |\n|---|---|---|\n| TTS generation | `voicebox_speak` | `POST \u002Fspeak` |\n| STT transcription | `voicebox_transcribe` | `POST \u002Ftranscribe` |\n| Profile listing | `voicebox_list_profiles` | `GET \u002Fprofiles` |\n| Captures listing | `voicebox_list_captures` | `GET \u002Fhistory` (captures view) |\n\nTools not exposed via MCP (REST only): model status (`GET \u002Fmodels\u002Fstatus`), audio file serving (`GET \u002Faudio\u002F{generation_id}`), per-version audio (`GET \u002Faudio\u002Fversion\u002F{version_id}`). The skill calls those over loopback HTTP when needed.\n\n**Notes on `voicebox_speak`:**\n- Required: `text`. Optional: `profile`, `engine`, `language`, `personality` (bool).\n- Audio plays on the user speakers and is saved to the Captures \u002F History panel automatically. There is no `save_to_disk` toggle on the MCP tool itself; to persist a local copy, fetch `GET \u002Faudio\u002F{generation_id}` (Voicebox TTS always stores `wav`).\n- Without a default profile set in Voicebox Settings, `profile=` is required.\n\n**Notes on `voicebox_transcribe`:**\n- Accepts exactly one of `audio_base64` or `audio_path` (loopback only). Optional `language`, `model`.\n\n### Resource scope\n| Scope | Resource target |\n|-------|-----------------|\n| `LOCAL_FS` | Input audio, generated audio, transcripts, manifests |\n| `PROCESS` | Local Voicebox app subprocess (managed by the user) |\n| `NETWORK` | Loopback HTTP to `127.0.0.1:17493` only |\n| `MEMORY` | Cached MCP tool names, resolved profile metadata |\n| `CREDENTIALS` | None. Voicebox is local and key-free. |\n\n### Preconditions\n- Voicebox app is running and the MCP handshake succeeds.\n- TTS only: at least one voice profile exists.\n- TTS only: the selected engine model is loaded or the user approves a download.\n- Output directory is inside `$PWD` unless explicitly allowed.\n\n### Effects and side effects\n- Creates audio files, transcripts, and manifests under `.agents\u002Fresults\u002Fvoice\u002F`.\n- Triggers local Voicebox generation, which consumes CPU or GPU.\n- May trigger an engine model download when the user approves.\n- Does not call any cloud service. No external network traffic.\n\n### Guardrails\n\n1. **Voicebox required**: if the MCP handshake or `GET \u002Fhealth` fails, exit with a one-shot install or launch hint. Do not retry, do not auto-relaunch.\n2. **Profile required for TTS only**: resolve a profile and check the TTS engine only for notification or asset mode. Transcription proceeds with a valid audio input and optional STT model even when no profile exists.\n3. **Tool-name discovery**: on first invocation, call MCP `tools\u002Flist` and cache the resolved names. Reuse the cache for subsequent calls in the same session.\n4. **Length limits**: TTS calls cap at 5000 chars per call; warn at 2000. STT inputs cap at 30 minutes. v1 does not auto-chunk or auto-split.\n5. **Auto-invocation transparency**: notifications fire automatically only when the active task exceeds `auto_notify_after_sec` (default 60s). This threshold is agent-enforced guidance — no hook measures task duration — so apply it by judgment when a long task completes or blocks. Always announce intent in one short line before generating audio.\n6. **Path safety**: when the user requests an output path outside `$PWD`, warn once and require explicit confirmation.\n7. **Cancellation**: SIGINT aborts the MCP call and writes no partial output.\n8. **Manifest required for persisted output**: asset TTS and transcription modes write `manifest.json` with at minimum: `skill`, `mode`, `voicebox_generation_id`, `text` (or `transcript_preview`), `profile`, `engine`, `language`, `format` (TTS only), `created_at`. Notification mode is exempt because Voicebox Captures is its system of record and no disk output is written by default.\n9. **Out of scope**: voice cloning UI, captures archive, stories editor, microphone dictation loop, and cloud vendors are intentionally not exposed.\n10. **No cost guard**: Voicebox is free. The cost guardrail from `oma-image` does not apply.\n\n### Clarification protocol\n\nBefore invoking a TTS or STT call, the agent checks the following. If any required signal is missing, clarify with the user first.\n\n**TTS (asset mode) required:**\n- [ ] Text content provided?\n- [ ] Voice profile id or tone description provided?\n\n**TTS strongly recommended:**\n- [ ] Language explicit or detectable from the text?\n- [ ] Output format (wav default; mp3 requires a local ffmpeg transcode)?\n\n**STT required:**\n- [ ] Audio path provided and the file exists?\n- [ ] Duration within 30 minutes, or user approves splitting?\n\n**Notification mode skips clarification.** It uses `notification_profile` from config and language is auto-detected from the message.\n\n### Invocation\n\n#### Standalone\n```text\n\u002Foma-voice \"build succeeded, 4 minor warnings\"\n\u002Foma-voice transcribe ~\u002FDownloads\u002Fstandup.m4a\n\u002Foma-voice --profile prof_warm_korean \"다음 단계 진행 준비됐어요\"\n```\n\n#### Shared infrastructure (other skills)\n\nOther skills can request audio output by calling the same MCP tools directly, or by invoking `\u002Foma-voice` with their text. There is no separate CLI; the skill is MCP-native.\n\n## References\n\n- Voice engine matrix: `resources\u002Fvoice-matrix.md`\n- Prompt writing rules: `resources\u002Fprompt-tips.md`\n- Execution protocol: `resources\u002Fexecution-protocol.md`\n- Pre-flight checklist: `resources\u002Fchecklist.md`\n- Configuration: read the `voice:` section of `.agents\u002Foma-config.yaml` first, then fall back to `config\u002Fvoice-config.yaml` for any key it does not set. Both profiles ship as `null` and must be set per machine — write them to `.agents\u002Foma-config.yaml`, since `oma update` overwrites the skill config.\n- Context loading: `..\u002F_shared\u002Fcore\u002Fcontext-loading.md`\n- Quality principles: `..\u002F_shared\u002Fcore\u002Fquality-principles.md`\n- Design reference: `..\u002F..\u002F..\u002Fdocs\u002Fplans\u002Fdesigns\u002F012-oma-voice.md` (source repo only; absent in global-mode installs)","# Voice Skill - Local TTS and STT via Voicebox\n\n## Scheduling\n\n### Goal\nDrive the Voicebox local app through its MCP server so any MCP-aware agent can speak (TTS) or listen (STT) without invoking cloud vendors. The skill standardizes intent routing, voice profile resolution, output layout, and guardrails while voicebox itself owns the engines, voice cloning UI, captures archive, and stories editor.\n\n### Intent signature\n- User asks to generate speech, narrate text, produce a voiceover, create an mp3 or wav from text.\n- User wants an audio file transcribed into text, meeting notes, or a transcript.\n- User asks for a voice notification when a long task completes or a workflow step is blocked.\n- Another skill needs local audio generation infrastructure.\n\n### When to use\n- Generating short notification audio for agent task completion or blockers.\n- Producing voiceover, narration, or audio assets (mp3 or wav) for apps and content.\n- Transcribing local audio files (mp3, wav, m4a, webm, flac) to Markdown.\n- Comparing voice profiles by re-running the same text against different profile ids.\n\n### When NOT to use\n- Cloud TTS or high-fidelity multilingual cloud voices -> out of scope; future multi-vendor extension.\n- Real-time microphone dictation loop in the terminal -> use Voicebox app's built-in hotkey dictation.\n- Voice cloning sample upload and profile creation -> done in the Voicebox desktop app UI.\n- Video synthesis, music, sound design -> out of scope.\n- Stories Editor multi-voice timeline composition -> use the Voicebox app UI.\n\n### Expected inputs\n- TTS: text (\u003C= 5000 chars per call), optional profile id, optional engine, optional language, optional output path.\n- STT: audio file path (absolute or relative to `$CWD`), optional language hint.\n- Notification: short message (\u003C= 240 chars), profile id resolved from config.\n\n### Expected outputs\n- TTS: audio file (`wav` — Voicebox's native TTS output format; `mp3` optional via a local ffmpeg transcode) at `.agents\u002Fresults\u002Fvoice\u002F{timestamp}-{shortid}\u002Foutput.{wav|mp3}` plus `manifest.json`.\n- STT: `transcript.md` at `.agents\u002Fresults\u002Fvoice\u002Ftranscripts\u002F{timestamp}-{shortid}\u002F` plus `manifest.json`.\n- Notification: ephemeral playback through Voicebox; no disk write by default.\n\n### Dependencies\n- Voicebox desktop app installed and running locally.\n- Voicebox MCP registered (`claude mcp add --transport http voicebox http:\u002F\u002F127.0.0.1:17493\u002Fmcp`).\n- TTS only: at least one voice profile created in the Voicebox app UI.\n- TTS only: optionally pre-downloaded engine models for the selected profile.\n\n### Control-flow features\n- Branches by mode (notify, asset, transcribe), language, and profile availability.\n- Calls voicebox via MCP tools, with REST `GET \u002Fhealth` as the handshake probe.\n- Reads input audio files and writes generated audio plus manifests.\n- Caches discovered MCP tool names after the first successful `tools\u002Flist`.\n\n## Structural Flow\n\n### Entry\n1. Detect the requested mode: notification, asset TTS, or transcription.\n2. Verify Voicebox is reachable via MCP handshake or `GET \u002Fhealth`.\n3. On the first run only, call MCP `tools\u002Flist` and cache the resolved tool names.\n4. For notification or asset TTS, resolve the target voice profile id. For transcription,\n   validate the audio input and continue without a profile.\n\n### Scenes\n1. **PREPARE**: Validate text length, audio duration, language, output path, and profile id.\n2. **ACQUIRE**: If a required signal is missing, run the clarification protocol once.\n3. **ACT**: Invoke the appropriate MCP tool (TTS or STT) with the resolved parameters.\n4. **VERIFY**: Confirm the response carries audio output or transcript content. Validate manifest fields.\n5. **FINALIZE**: Write `manifest.json` alongside the output. Report the path or transcript to the user.\n\n### Transitions\n- If voicebox is unreachable, surface the install or launch hint and exit. Do not attempt auto-relaunch.\n- If a TTS request has no usable profile, point the user at the Voicebox app UI to create a profile, then exit. A transcription request never needs a profile.\n- If a TTS request exceeds 5000 chars, ask whether to truncate or split. Do not auto-chunk in v1.\n- If an STT input exceeds 30 minutes, ask whether to proceed. Do not auto-split.\n- If the selected engine model is not loaded, ask the user before triggering a download.\n\n### Failure and recovery\n| Failure | Recovery |\n|---------|----------|\n| Voicebox app not running | Print install\u002Flaunch hint, exit code 5 |\n| No voice profile for TTS | Print \"create a profile in Voicebox\" hint, exit code 3 |\n| Engine model missing | Ask before triggering download |\n| Output path outside `$PWD` | Warn the user, require explicit confirmation |\n| TTS over 5000 chars | Ask the user to split or truncate |\n| STT over 30 minutes | Ask the user to confirm |\n| MCP tool name drift | Re-run `tools\u002Flist` and update the cache |\n| SIGINT | Abort the MCP call, write no partial output |\n\n### Exit\n- Success: audio file or transcript exists with a complete manifest, and the path is reported.\n- Partial success: output exists but a guardrail warning is surfaced (length, disk, model fallback).\n- Failure: no output, the blocker (auth, profile, engine, network) is explicit.\n\n## Logical Operations\n\n### Actions\n| Action | SSL primitive | Evidence |\n|--------|---------------|----------|\n| Validate mode and inputs | `VALIDATE` | Clarification protocol in execution-protocol.md |\n| Resolve TTS voice profile | `SELECT` | `voicebox_list_profiles` + config defaults |\n| Health check | `READ` | MCP handshake or `GET \u002Fhealth` |\n| Generate speech | `CALL_TOOL` | MCP `voicebox_speak` |\n| Transcribe audio | `CALL_TOOL` | MCP `voicebox_transcribe` |\n| Write output and manifest | `WRITE` | Audio or transcript plus `manifest.json` |\n| Inspect result | `VALIDATE` | Output presence, duration, manifest fields |\n| Report result | `NOTIFY` | Final user-facing summary |\n\n### Tools and instruments\n- Voicebox MCP server at `http:\u002F\u002F127.0.0.1:17493\u002Fmcp`.\n- REST surface for health and audio retrieval (`GET \u002Fhealth`, `GET \u002Faudio\u002F{generation_id}`).\n- Resource references: voice matrix, prompt tips, execution protocol, checklist.\n\n### Canonical command path\n```text\n# 1. MCP handshake or REST health\nGET http:\u002F\u002F127.0.0.1:17493\u002Fhealth  ->  200 OK\n\n# 2. Discover tool names on first run\nMCP tools\u002Flist                      ->  cache real names\n\n# 3. TTS only: resolve profile\nMCP voicebox_list_profiles          ->  pick profile by name or config default\n\n# 4. Generate or transcribe (STT skips profile lookup and model-status check)\nMCP voicebox_speak     { text, profile, language?, engine?, personality? }\nMCP voicebox_transcribe { audio_path | audio_base64, language?, model? }\n\n# 5. Fetch the generated audio (MCP has no save-to-disk; TTS output is wav)\nGET http:\u002F\u002F127.0.0.1:17493\u002Faudio\u002F{generation_id}  ->  wav bytes\n\n# 6. Persist output + manifest\n.agents\u002Fresults\u002Fvoice\u002F\u003Ctimestamp>-\u003Cshortid>\u002Foutput.wav + manifest.json\n.agents\u002Fresults\u002Fvoice\u002Ftranscripts\u002F\u003Ctimestamp>-\u003Cshortid>\u002Ftranscript.md + manifest.json\n```\n\n### MCP tool mapping (verified against Voicebox 0.5.0)\n\n| Use case | MCP tool | REST backing |\n|---|---|---|\n| TTS generation | `voicebox_speak` | `POST \u002Fspeak` |\n| STT transcription | `voicebox_transcribe` | `POST \u002Ftranscribe` |\n| Profile listing | `voicebox_list_profiles` | `GET \u002Fprofiles` |\n| Captures listing | `voicebox_list_captures` | `GET \u002Fhistory` (captures view) |\n\nTools not exposed via MCP (REST only): model status (`GET \u002Fmodels\u002Fstatus`), audio file serving (`GET \u002Faudio\u002F{generation_id}`), per-version audio (`GET \u002Faudio\u002Fversion\u002F{version_id}`). The skill calls those over loopback HTTP when needed.\n\n**Notes on `voicebox_speak`:**\n- Required: `text`. Optional: `profile`, `engine`, `language`, `personality` (bool).\n- Audio plays on the user speakers and is saved to the Captures \u002F History panel automatically. There is no `save_to_disk` toggle on the MCP tool itself; to persist a local copy, fetch `GET \u002Faudio\u002F{generation_id}` (Voicebox TTS always stores `wav`).\n- Without a default profile set in Voicebox Settings, `profile=` is required.\n\n**Notes on `voicebox_transcribe`:**\n- Accepts exactly one of `audio_base64` or `audio_path` (loopback only). Optional `language`, `model`.\n\n### Resource scope\n| Scope | Resource target |\n|-------|-----------------|\n| `LOCAL_FS` | Input audio, generated audio, transcripts, manifests |\n| `PROCESS` | Local Voicebox app subprocess (managed by the user) |\n| `NETWORK` | Loopback HTTP to `127.0.0.1:17493` only |\n| `MEMORY` | Cached MCP tool names, resolved profile metadata |\n| `CREDENTIALS` | None. Voicebox is local and key-free. |\n\n### Preconditions\n- Voicebox app is running and the MCP handshake succeeds.\n- TTS only: at least one voice profile exists.\n- TTS only: the selected engine model is loaded or the user approves a download.\n- Output directory is inside `$PWD` unless explicitly allowed.\n\n### Effects and side effects\n- Creates audio files, transcripts, and manifests under `.agents\u002Fresults\u002Fvoice\u002F`.\n- Triggers local Voicebox generation, which consumes CPU or GPU.\n- May trigger an engine model download when the user approves.\n- Does not call any cloud service. No external network traffic.\n\n### Guardrails\n\n1. **Voicebox required**: if the MCP handshake or `GET \u002Fhealth` fails, exit with a one-shot install or launch hint. Do not retry, do not auto-relaunch.\n2. **Profile required for TTS only**: resolve a profile and check the TTS engine only for notification or asset mode. Transcription proceeds with a valid audio input and optional STT model even when no profile exists.\n3. **Tool-name discovery**: on first invocation, call MCP `tools\u002Flist` and cache the resolved names. Reuse the cache for subsequent calls in the same session.\n4. **Length limits**: TTS calls cap at 5000 chars per call; warn at 2000. STT inputs cap at 30 minutes. v1 does not auto-chunk or auto-split.\n5. **Auto-invocation transparency**: notifications fire automatically only when the active task exceeds `auto_notify_after_sec` (default 60s). This threshold is agent-enforced guidance — no hook measures task duration — so apply it by judgment when a long task completes or blocks. Always announce intent in one short line before generating audio.\n6. **Path safety**: when the user requests an output path outside `$PWD`, warn once and require explicit confirmation.\n7. **Cancellation**: SIGINT aborts the MCP call and writes no partial output.\n8. **Manifest required for persisted output**: asset TTS and transcription modes write `manifest.json` with at minimum: `skill`, `mode`, `voicebox_generation_id`, `text` (or `transcript_preview`), `profile`, `engine`, `language`, `format` (TTS only), `created_at`. Notification mode is exempt because Voicebox Captures is its system of record and no disk output is written by default.\n9. **Out of scope**: voice cloning UI, captures archive, stories editor, microphone dictation loop, and cloud vendors are intentionally not exposed.\n10. **No cost guard**: Voicebox is free. The cost guardrail from `oma-image` does not apply.\n\n### Clarification protocol\n\nBefore invoking a TTS or STT call, the agent checks the following. If any required signal is missing, clarify with the user first.\n\n**TTS (asset mode) required:**\n- [ ] Text content provided?\n- [ ] Voice profile id or tone description provided?\n\n**TTS strongly recommended:**\n- [ ] Language explicit or detectable from the text?\n- [ ] Output format (wav default; mp3 requires a local ffmpeg transcode)?\n\n**STT required:**\n- [ ] Audio path provided and the file exists?\n- [ ] Duration within 30 minutes, or user approves splitting?\n\n**Notification mode skips clarification.** It uses `notification_profile` from config and language is auto-detected from the message.\n\n### Invocation\n\n#### Standalone\n```text\n\u002Foma-voice \"build succeeded, 4 minor warnings\"\n\u002Foma-voice transcribe ~\u002FDownloads\u002Fstandup.m4a\n\u002Foma-voice --profile prof_warm_korean \"다음 단계 진행 준비됐어요\"\n```\n\n#### Shared infrastructure (other skills)\n\nOther skills can request audio output by calling the same MCP tools directly, or by invoking `\u002Foma-voice` with their text. There is no separate CLI; the skill is MCP-native.\n\n## References\n\n- Voice engine matrix: `resources\u002Fvoice-matrix.md`\n- Prompt writing rules: `resources\u002Fprompt-tips.md`\n- Execution protocol: `resources\u002Fexecution-protocol.md`\n- Pre-flight checklist: `resources\u002Fchecklist.md`\n- Configuration: read the `voice:` section of `.agents\u002Foma-config.yaml` first, then fall back to `config\u002Fvoice-config.yaml` for any key it does not set. Both profiles ship as `null` and must be set per machine — write them to `.agents\u002Foma-config.yaml`, since `oma update` overwrites the skill config.\n- Context loading: `..\u002F_shared\u002Fcore\u002Fcontext-loading.md`\n- Quality principles: `..\u002F_shared\u002Fcore\u002Fquality-principles.md`\n- Design reference: `..\u002F..\u002F..\u002Fdocs\u002Fplans\u002Fdesigns\u002F012-oma-voice.md` (source repo only; absent in global-mode installs)",{"name":5,"description":7},"master","5fab8004af1390aa17b3447f2780766c8bf2482c",".agents\u002Fskills\u002Foma-voice",0,"https:\u002F\u002Fgithub.com\u002Fvasceannie\u002Fslopgate","https:\u002F\u002Fgithub.com\u002Fvasceannie","thingswithstuff.io","2026-11-10 23:25:49",{"source":8,"skillName":5,"commands":58,"prompt":68,"zipAvailable":69},[59,62,65],{"tool":60,"command":61},"npx","npx skills add vasceannie\u002Fslopgate --skill oma-voice",{"tool":63,"command":64},"bunx","bunx skills add vasceannie\u002Fslopgate --skill oma-voice",{"tool":66,"command":67},"pnpm","pnpm dlx skills add vasceannie\u002Fslopgate --skill oma-voice","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fvasceannie\u002Fslopgate\u002Fblob\u002Fmaster\u002F.agents\u002Fskills\u002Foma-voice\u002FSKILL.md",true,[71,77,81,85,89],{"path":72,"resourceType":73,"resourceTypeDesc":74,"sizeBytes":75,"sourceHtmlUrl":76},"config\u002Fvoice-config.yaml","REFERENCE","参考文档",1191,"https:\u002F\u002Fgithub.com\u002Fvasceannie\u002Fslopgate\u002Fblob\u002Fmaster\u002F.agents\u002Fskills\u002Foma-voice\u002Fconfig\u002Fvoice-config.yaml",{"path":78,"resourceType":73,"resourceTypeDesc":74,"sizeBytes":79,"sourceHtmlUrl":80},"resources\u002Fchecklist.md",1894,"https:\u002F\u002Fgithub.com\u002Fvasceannie\u002Fslopgate\u002Fblob\u002Fmaster\u002F.agents\u002Fskills\u002Foma-voice\u002Fresources\u002Fchecklist.md",{"path":82,"resourceType":73,"resourceTypeDesc":74,"sizeBytes":83,"sourceHtmlUrl":84},"resources\u002Fexecution-protocol.md",7139,"https:\u002F\u002Fgithub.com\u002Fvasceannie\u002Fslopgate\u002Fblob\u002Fmaster\u002F.agents\u002Fskills\u002Foma-voice\u002Fresources\u002Fexecution-protocol.md",{"path":86,"resourceType":73,"resourceTypeDesc":74,"sizeBytes":87,"sourceHtmlUrl":88},"resources\u002Fprompt-tips.md",3060,"https:\u002F\u002Fgithub.com\u002Fvasceannie\u002Fslopgate\u002Fblob\u002Fmaster\u002F.agents\u002Fskills\u002Foma-voice\u002Fresources\u002Fprompt-tips.md",{"path":90,"resourceType":73,"resourceTypeDesc":74,"sizeBytes":91,"sourceHtmlUrl":92},"resources\u002Fvoice-matrix.md",3504,"https:\u002F\u002Fgithub.com\u002Fvasceannie\u002Fslopgate\u002Fblob\u002Fmaster\u002F.agents\u002Fskills\u002Foma-voice\u002Fresources\u002Fvoice-matrix.md",[94,124,151,186,209,230],{"skillNo":95,"name":96,"nameZh":6,"description":97,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":98,"categories":99,"keywords":103,"publishedAt":44},"01M71951JDWCYMS8GDC2C7395D","type-strictness","Enforce strict type compliance by eliminating `Any` types and `# type: ignore` comments. Use when:\n(1) Editing code that contains `Any` as a type annotation\n(2) Code has `# type: ignore` or `# pyright: ignore` comments\n(3) User requests type fixes or type strictness enforcement\n(4) Importing from untyped third-party libraries\n(5) User asks to \"fix types\", \"remove Any\", or \"add proper typing\"\n(6) Pyrefly or mypy reports type errors that need resolution\n(7) Code review reveals weak typing patterns\nFollows hierarchical resolution: codebase inference → type stubs → library inspection → type guards → casting (last resort).","https:\u002F\u002Fgithub.com\u002Fvasceannie\u002Fslopgate\u002Fblob\u002Fmaster\u002Fbundle\u002Fshared\u002Fskills\u002Ftype-strictness\u002FSKILL.md",[100],{"categoryNo":101,"categoryName":102,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000007","代码审查",[104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123],"type","type strictness","typing","types","remove","code review","fix","errors","inspection","when","code","review","reports","libraries","casting","pyrefly","mypy","pyright","library","patterns",{"skillNo":125,"name":126,"nameZh":6,"description":127,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":128,"categories":129,"keywords":134,"publishedAt":44},"01M7194XGBQXSE7Y5BZ4K5CSTK","slopgate-test-extender","Extend Python test suites with parametrization, fixture reuse, and quality enforcement. Use when asked to add tests, extend existing tests, improve test coverage, consolidate duplicate tests, fix test quality issues, or when Slopgate reports untested-production-code, missing test references, or coverage gaps. Triggers on requests like \"add tests for X\", \"extend these tests\", \"parametrize tests\", \"consolidate tests\", \"fix test quality\", \"improve test coverage\", \"write tests for this function\", \"test this module\", \"behavior tests\", \"integration tests\", \"missing tests\", \"coverage holes\", \"untested code\", or when a hook denies with test-related findings.","https:\u002F\u002Fgithub.com\u002Fvasceannie\u002Fslopgate\u002Fblob\u002Fmaster\u002Fbundle\u002Fshared\u002Fskills\u002Fslopgate-test-extender\u002FSKILL.md",[130,131],{"categoryNo":101,"categoryName":102,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":132,"categoryName":133,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量",[135,136,137,138,139,110,140,141,142,143,144,145,113,114,146,147,116,148,149,150],"slopgate test extender","test","coverage","fixture","testing","issues","write tests","improve","only","cleanup","loop","candidate","consolidate","references","opencode","orchestrator",{"skillNo":152,"name":153,"nameZh":6,"description":154,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":155,"categories":156,"keywords":170,"publishedAt":44},"01M7194RMVQS5YJJ4ZEFXX20VS","slopgate-intelligent-coding-patterns","Pattern-selection playbook for agents editing code with complex branching, stateful parsers\u002Fworkflows, duplicated skeletons, policy checks, or ordered transforms. Load before refactoring if\u002Felif dispatch chains, boolean-flag state machines, repeated validation predicates, parallel provider\u002Flanguage implementations, or regex\u002Fcontent transformation pipelines. Also load when asked to \"apply a design pattern\", \"which pattern should I use here\", \"refactor this switch statement\", \"replace if-elif chain\", \"state machine pattern\", \"strategy pattern\", \"template method\", \"pipeline pattern\", \"specification pattern\", \"dispatch table\", \"guard clause refactor\", \"reduce cyclomatic complexity\", or when Slopgate fires PY-CODE-014, PY-CODE-017, PY-CODE-018, QUALITY-LINT-001, or PY-QUALITY-010. Use with behavior-locking tests and avoid pattern theater for simple one-off code.","https:\u002F\u002Fgithub.com\u002Fvasceannie\u002Fslopgate\u002Fblob\u002Fmaster\u002Fbundle\u002Fshared\u002Fskills\u002Fslopgate-intelligent-coding-patterns\u002FSKILL.md",[157,158,161,162,167],{"categoryNo":101,"categoryName":102,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":159,"categoryName":160,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":163,"categoryName":164,"taxonomyType":165,"taxonomyTypeDesc":166},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",{"categoryNo":168,"categoryName":169,"taxonomyType":165,"taxonomyTypeDesc":166},"01JBSEEDCAT000000000000032","设计师",[171,172,123,173,174,175,176,177,178,179,180,181,182,143,144,183,184,113,185,114],"coding patterns","slopgate intelligent coding patterns","coding","stateful","complexity","branch","which","chain","parsers","pipeline","selection","design","utility","workflows","reduce",{"skillNo":187,"name":188,"nameZh":6,"description":189,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":190,"categories":191,"keywords":194,"publishedAt":44},"01M7194KTXBM85GB0W7JKFQD55","slopgate-hygiene-orchestrator","Orchestrate systematic elimination of linter warnings and errors across Python, TypeScript, and Rust codebases. Use when asked to \"clean up lints\", \"fix all warnings\", \"run hygiene\", \"eliminate type errors\", \"orchestrate code quality fixes\", \"fix lint errors\", \"resolve quality gate failures\", \"pass CI checks\", \"reduce tech debt\", \"refactor to pass hooks\", or when a Slopgate hook denies with QUALITY-LINT-001, PY-CODE-017, PY-CODE-018, or any collector finding. This skill coordinates multiple code-hygiene-enforcer agents working in parallel on non-conflicting file groupings, tracks progress persistently via JSON exports, and loops until all issues are resolved. CRITICAL: Never run linters directly—always use `slopgate lint check` as the primary gate, discover project-specific tools from config files, and export findings to JSON for tracking.","https:\u002F\u002Fgithub.com\u002Fvasceannie\u002Fslopgate\u002Fblob\u002Fmaster\u002Fbundle\u002Fshared\u002Fskills\u002Fslopgate-hygiene-orchestrator\u002FSKILL.md",[192,193],{"categoryNo":101,"categoryName":102,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[195,196,150,197,110,198,40,199,200,39,144,185,201,202,203,204,205,206,207,208],"slopgate hygiene orchestrator","hygiene","project","ci","clean","never run","run","lint check","systematic","config","typescript","debt","quality-gates","hook",{"skillNo":210,"name":211,"nameZh":6,"description":212,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":213,"categories":214,"keywords":217,"publishedAt":44},"01M7194G50FZYXXT8VNK360RPA","slopgate-code-smell-utility-locator","Autoactivate when code-smell hooks or reviews mention feature envy, thin wrappers, duplicate helpers, duplicate code,\nscattered helpers, builders\u002Ffactories\u002Fconfig\u002Fconstants\u002Fdataclass reuse, PY-CODE-012, PY-CODE-013, QUALITY-LINT-001,\nor repeated slopgate code-quality denials. Also load when asked to \"find existing helpers\", \"consolidate utilities\",\n\"search for duplicate code\", \"where is this already implemented\", \"reuse existing logic\", \"don't duplicate this\",\n\"find similar functions\", \"utility inventory\", \"code smell radar\", or before adding new helpers\u002Fwrappers so agents can\nfind existing shared utilities and consolidate instead of duplicating.","https:\u002F\u002Fgithub.com\u002Fvasceannie\u002Fslopgate\u002Fblob\u002Fmaster\u002Fbundle\u002Fshared\u002Fskills\u002Fslopgate-code-smell-utility-locator\u002FSKILL.md",[215,216],{"categoryNo":101,"categoryName":102,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":163,"categoryName":164,"taxonomyType":165,"taxonomyTypeDesc":166},[183,218,114,219,137,220,221,222,223,143,224,113,225,147,149,226,227,204,228,229],"slopgate code smell utility locator","shared","reviews","inventory","search","hooks","new","coordination","radar","code-quality","Utilities","dataclass",{"skillNo":231,"name":232,"nameZh":6,"description":233,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":234,"categories":235,"keywords":238,"publishedAt":44},"01M7194AWG1Q37F9756H4SFDH9","slopgate-code-hygiene-refactor","Recovery playbook for Slopgate and project quality failures. Load after hook\u002Flint denials such as PY-CODE-017 flat sibling modules, PY-CODE-018 oversized modules, QUALITY-LINT-001 post-edit quality backstops, PY-QUALITY-010 magic numbers \u002F repeated literals, PY-CODE-012\u002FPY-CODE-013 smell findings, type-suppression bans, duplicate helpers, or repeated hygiene retry loops. Also load when asked to \"refactor this module\", \"split this file\", \"extract a class\", \"reduce complexity\", \"fix god class\", \"flatten module hierarchy\", \"move code to a package\", \"extract helpers\", \"consolidate duplicates\", \"replace magic numbers with constants\", or when a hook blocks an edit with structural complaints. Focuses on preserving public APIs while refactoring toward packages, cohesive modules, typed seams, and focused tests.","https:\u002F\u002Fgithub.com\u002Fvasceannie\u002Fslopgate\u002Fblob\u002Fmaster\u002Fbundle\u002Fshared\u002Fskills\u002Fslopgate-code-hygiene-refactor\u002FSKILL.md",[236,237],{"categoryNo":101,"categoryName":102,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":163,"categoryName":164,"taxonomyType":165,"taxonomyTypeDesc":166},[239,240,114,241,196,242,175,243,244,197,245,221,246,110,143,183,113,185,225,147],"code hygiene","slopgate code hygiene refactor","refactor","modules","duplicates","retry","move","structural"]