character-tts-dialogue
Write, return, validate, or troubleshoot character-faithful spoken replies for RabiRoute's current RabiSpeech workflow.
Skill by vb2250158
Install
Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.
npx agentmarket install skill/vb2250158-character-tts-dialogue
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Use cases: backend, writing, productivity, voice-agents
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.
- Tools
- No tools found
- Secrets
- None asked for
- Install scripts
- None found
Network hosts it talks to 1
codeload.github.com· found in install command
Files it touches
~/.claude/skills/character-tts-dialogue
What's inside
- Skill name
character-tts-dialogue- Description
- Write, return, validate, or troubleshoot character-faithful spoken replies for RabiRoute's current RabiSpeech workflow. Use when an AgentPacket contains characterTtsDialogue=true, when a delivered speech/voice_transcript turn must reach the host playback FIFO, or when checking visible/spoken wording, the injected send request, persona voice, local or explicitly enabled API TTS, 24-hour cache records, and safe non-QQ speech boundaries. Do not use retired OumuQ/FenneNote paths.
- License
- MIT
- Instructions
- 113 lines in SKILL.md · view on GitHub
Files (2)
- SKILL.md
- openai.yaml · agents/
SKILL.md (first lines)
# Character TTS Dialogue
## Current flow
```text
RabiPC speech endpoint -> voice_transcript -> AgentPacket
-> character-faithful reply text
-> POST /api/agent/send with channel=speech and an explicit sessionId
-> Outbox freezes Route persona, voice, model, language, instructions, sessionId
-> RabiSpeech host-wide FIFO
```
RabiRoute owns source binding and playback policy. RabiSpeech owns synthesis and playback. The Agent owns what the character says.
Speech ingress has its own record-before-wake policy. Route `speechPushMode=hot` delivers every completed non-empty ASR segment. `keyword` records every segment but creates an Agent turn only when the text matches persona-owned `speechTriggerKeywords`; an empty keyword list stays record-only. A `recorded` result therefore has no character reply to return.
## Decide whether to speak
Speak automatically only when the injected `replyContext` includes all of:
- `routeKind: "voice_transcript"`
- `adapterType: "speech"`
- `characterTtsDialogue: true`
Do not add this state to QQ, the role panel, ordinary text, or unrelated voice transcripts. Direct TTS explicitly requested by the user is a separate speech-service action; use `rabiroute-voice-workstation` for that workflow.
## Write the reply
- Preserve the active persona's relationship stance, vocabulary, rhythm, honorifics, and emotional posture.
- Keep factual accuracy, safety boundaries, refusals, and uncertainty intact while speaking in character.
- Make the spoken line short, natural, and easy to understand without screen-only context.
- Keep the visible final reply and spoken text semantically identical. Normally use the same sentence for both.
- Avoid markdown tables, URLs, code blocks, citation syntax, long lists, and stage directions in the spoken text.
- Treat user corrections about tone, names, catchphrases, or pronunciation as active guidance.
## Return through Outbox
POST the spoken text with the injected explicit send template to the current Manager URL supplied by `sendApiUrl`:
```http
POST <sendApiUrl>
Content-Type: application/json; charset=utf-8
```
```json
{
"deliveryId": "speech-<stable-id-for-this-send>",
"sender": {
"agentType": "primary_persona",
"sessionId": "<current Codex Primary Persona session ID>"
},
"routeId": "<exact-route-id>",
"channel": "speech",
"params": { "sessionId": "<speech-session-id>" },
"payload": {
"type": "text",
"text": "好呀,我听见了。我们慢慢来。"
}
}
```
Use the injected `sendRequestJson` as the starting point. This example is for the Codex Primary Persona: use the actual sender role and complete current session ID under the common delivery contract. Keep the exact `routeId`, `channel=speech`, and `params.sessionId`; replace the placeholder delivery ID and payload text. The source `replyContext` is audit context and must not be submitted as a destination. Do not invent another target or call a worker directly. Submit once. A `sent` result with autoplay means the audio entered the host FIFO; it does not prove speaker playback has finished.
Interpret other results explicitly:
- `draft`: retained without automatic external action.
- `blocked`: policy, source binding, or payload validation rejected it.
- `failed`: synthesis, queueing, transport, or runtime failed; preserve the visible reply and report the failure.
## Models and voices
Never hardcode a model table as runtime truth. Discover installed models and request schemas from:
- Manager: `GET /api/speech/models`, `GET /api/speech/personas`
- RabiSpeech: `GET /v1/models`, `GET /v1/models/<provider>/<model>`
Availability is machine-specific. Persona `voice/voice-profile.json` is the single source of truth for model, voice, language, speed, and speaking instructions. The selected Provider may be local or an explicitly enabled HTTPS API Provider. Provider secrets and cloned voice IDs must come from the named environment variables referenced by that persona; never copy their values into prompts, logs, public examples, or replies. Do not silently fall back from one Provider to another.
Persona voice material lives under `data/roles/<RoleId>/voice/`. Successful persona TTS retains finalized audio under `voice/cache/tts-audio/` for 24 hours from that file's own timestamp; non-persona direct TTS uses a private fallback. Diagnostic UI may show only the safe persona-relative cache reference and expected expiry, never an absolute path, traversal, reference audio, weights, tokens, or private persona data. Cache retention is not proof that playback completed.
ASR and TTS with the same `sessionId` share the persona's `speech` recent-context budget. The canonical persona ledger records both inbound and outbound messages; injection limits affect only how many recent rows are shown to the Agent, not whether the rows are retained.
## Speaker labeling from an Agent
If the ASR payload exposes a diarization label and the current conversation gives the Agent enough evidence to identify the person, use the Manager's loopback metadata interface:
```http
PUT /api/speech/speaker-identities
```
Send `sessionId`, `speakerLabel`, and either a known `speakerId` or a `displayName` plus optional aliases. The operation idempotently finds or creates one host-wide person profile, merges aliases, and binds that session label in one registry transaction. Several matching profiles return `409`; retry only after selecting an explicit profile ID.
The WebGUI keeps the corresponding human entry under **Speech Service → ASR → Speaker / voiceprint settings**, with separate unknown/known collapsible cards and the latest ten utterances for each diarization cluster. Both paths share the same registry. This is explicit person metadata, not biometric recognition: `voiceprint.supported=false` remains authoritative until a validated embedding matcher exists.
## Hard boundaries
- Do not use retired OumuQ or FenneNote runtime paths, fixed worker ports, or an unconfigured Provider. DashScope or another API Provider is allowed only when the persona and RabiSpeech configuration explicitly enable it through named environment variables and HTTPS.
- Do not call `/v1/audio/speech` during an Agent-routed dialogue turn; Outbox must freeze Route settings and enqueue exactly once.
- Do not read or forward the resolved Provider voice ID. Outbox/RabiSpeech resolves it from persona configuration at execution time.
- Do not automatically send QQ voice. QQ/NapCat output remains governed by its own Route policy and Action Gate.
- Do not claim playback completion from queue acceptance.
## Troubleshooting
1. Confirm the packet contains the three speech-state fields above plus `sendApiUrl` and `sendRequestJson` with `channel=speech`.
2. Check `GET /api/speech/status`, then model and persona discovery.
3. Check the `/api/agent/send` result before inspecting workers.
4. Check the host FIFO and playback error state; avoid retrying blindly because the first request may already be queued.
5. If Windows emits only an error chime while the FIFO says `done`, inspect the cached WAV with SoundFile. Streamed WAV headers can advertise a placeholder length that `winsound` misreads; RabiSpeech playback must stay on SoundFile / PortAudio.
6. Check `/api/speech/records` with the same `sessionId` to distinguish synthesis, cache retention, queue acceptance, and actual playback state.
7. If tone is wrong, reread the active `persona.md` and `voice/voice-profile.json`. If routing is wrong, inspect Route `speechPushMode` and persona keywords rather than changing character prose.From vb2250158/RabiRoute, MIT.
More from vb2250158/RabiRoute
- 0.813score
rabi-desktop-pet-animation
vb2250158
Locate, inspect, design, repair, package, and activate Rabi or RabiRoute desktop-pet animations.
SkillAFreshness: A★ 492Claude Code +9 - 0.813score
rabi-github-submit
vb2250158
Prepares, reviews, commits, and publishes RabiRoute changes with a mandatory per-commit patch-version bump, bilingual version log, Rabi context, privacy…
SkillAFreshness: A★ 492Claude Code +9 - 0.809score
napcat-qq-gateway
vb2250158
查询 QQ 群聊、私聊、聊天记录或最新反馈,以及配置、排障 NapCatQQ / OneBot11 消息收发。用户说“看看群”“看群聊记录”时也使用;Rabi 管理的消息先经 Rabi 查询,无法完成查询时才使用当前 NapCat 或正式日志补查。
SkillAFreshness: A★ 492Claude Code +9 - 0.809score
create-rabiroute-persona
vb2250158
创建或修改通用 RabiRoute 角色配置。用于根据用户指定的角色和材料忠实写成 persona.md 和 personaConfig.json,尤其适用于用户希望“就是那个角色”、要求按文本、图片、对白、音频、设定集、网页等材料一比一还原,或希望角色从指定时间点分叉到平行世界继续生活的场景;也适用于现实职业、陪伴…
SkillAFreshness: A★ 492Claude Code +9 - 0.807score
tts-router
vb2250158
Route local text-to-speech through RabiSpeech across ONNX-VITS, GPT-SoVITS, IndexTTS2, Qwen3-TTS and CosyVoice3.
SkillAFreshness: A★ 492Claude Code +9 - 0.807score
use-rabi-codex-context
vb2250158
Bind, inspect, refresh, switch, or remove Rabi PC-managed persona context for one Codex session and understand its entry, reasoning, and message-delivery…
SkillAFreshness: A★ 492Claude Code +9 - 0.807score
plan-task-orchestration
vb2250158
Use before any repository task governed by RabiRoute plan admission, including bug fixes, features, UI, assets, config, data, docs, prompts, skills, builds…
SkillAFreshness: A★ 492Claude Code +9 - 0.803score
rabiroute-nas-windows-package
vb2250158
将 NAS 工作区中的 RabiRoute 构建并安装为 Windows 本机可搜索、可双击、带托盘的完整运行包,同时让每台电脑保留独立路由和运行日志,并共享 NAS 上的角色、记忆与计划。用于共享源码与角色目录环境的首次安装、换机安装、第二台电脑部署、本机目录迁移、升级重打包或排查本机包与 NAS 数据边界。
SkillAFreshness: A★ 492Claude Code +9 - 0.803score
rabiroute-voice-workstation
vb2250158
设计、实现或审查 RabiPC 语音消息端与 RabiSpeech TTS/ASR 工作站。覆盖常驻麦克风、RMS/VAD 切句、Route 热投递/角色关键词唤醒、双向语音上下文、直接角色 TTS、24 小时音频缓存、显式 API Provider、会议说话人分离、主机级 FIFO 和公开安全边界。不得恢复对…
SkillAFreshness: A★ 492Claude Code +9 - 0.803score
rabi-github-pull
vb2250158
安全拉取 RabiRoute 更新,并根据项目更新日志和公开示例迁移本地运行配置。用于用户要求 pull、update、sync、upgrade、refresh RabiRoute 仓库,尤其是本地 data、gateway config、route config、persona 文件或 adapter…
SkillAFreshness: A★ 492Claude Code +9 - 0.803score
qwen-tts-audio
vb2250158
通过 RabiSpeech 使用本地 Qwen3-TTS 0.6B 或 1.7B 生成角色、多语言或音色复刻语音。用户指定 Qwen3-TTS、日语/多语言、本地参考音频、角色名或模型大小对比时使用。不得启动技能内 worker、OumuQ 或任何 Qwen/DashScope 云端 API。
SkillAFreshness: A★ 492Claude Code +9 - 0.803score
benchmark-rabispeech-models
vb2250158
运行或更新 RabiSpeech 本机语音模型闭环基准。用于新增、替换或比较本地 TTS / ASR 模型,测试首请求、加载、预热、热态耗时、RTF、显存、波形和 CER,并从统一公开语料生成 JSON、CSV 及 RibiWebGUI 内可查看的 HTML 报告;也用于维护 TTS / ASR…
SkillAFreshness: A★ 492Claude Code +9
Compare and alternatives
Featured in
Signals
- Stars
- 492
- Forks
- 0
- Open issues
- 0
- Last commit (this folder)
- Oct 8, 2026 (19 days ago)
- Last release
- Jul 31, 2026 (2 months ago)
From GitHub (fetched Oct 24, 2026).
Details
- License
- MIT
- Repository
- github.com/vb2250158/RabiRoute
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
More from vb2250158
- 0.813score
rabi-desktop-pet-animation
vb2250158
Locate, inspect, design, repair, package, and activate Rabi or RabiRoute desktop-pet animations.
SkillAFreshness: A★ 492Claude Code +9 - 0.813score
rabi-github-submit
vb2250158
Prepares, reviews, commits, and publishes RabiRoute changes with a mandatory per-commit patch-version bump, bilingual version log, Rabi context, privacy…
SkillAFreshness: A★ 492Claude Code +9 - 0.809score
napcat-qq-gateway
vb2250158
查询 QQ 群聊、私聊、聊天记录或最新反馈,以及配置、排障 NapCatQQ / OneBot11 消息收发。用户说“看看群”“看群聊记录”时也使用;Rabi 管理的消息先经 Rabi 查询,无法完成查询时才使用当前 NapCat 或正式日志补查。
SkillAFreshness: A★ 492Claude Code +9 - 0.809score
create-rabiroute-persona
vb2250158
创建或修改通用 RabiRoute 角色配置。用于根据用户指定的角色和材料忠实写成 persona.md 和 personaConfig.json,尤其适用于用户希望“就是那个角色”、要求按文本、图片、对白、音频、设定集、网页等材料一比一还原,或希望角色从指定时间点分叉到平行世界继续生活的场景;也适用于现实职业、陪伴…
SkillAFreshness: A★ 492Claude Code +9 - 0.807score
use-rabi-codex-context
vb2250158
Bind, inspect, refresh, switch, or remove Rabi PC-managed persona context for one Codex session and understand its entry, reasoning, and message-delivery…
SkillAFreshness: A★ 492Claude Code +9 - 0.807score
tts-router
vb2250158
Route local text-to-speech through RabiSpeech across ONNX-VITS, GPT-SoVITS, IndexTTS2, Qwen3-TTS and CosyVoice3.
SkillAFreshness: A★ 492Claude Code +9
Cite this page
character-tts-dialogue skill. Agent Mart. https://agentmart.dev/skills/vb2250158-character-tts-dialogue (last updated 2026-10-24)