# Voice

> Batch ASR / OminiX TTS / Model Management

- Skill: `octos-org/voice` (Agent Skill, multi-file: 6 files)
- Install (CLI): `npx skillmds@latest add octos-org/voice`
- Raw SKILL.md: https://api.skillmd.com/api/skills/octos-org/voice/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- Author: octos-org (https://skillmd.com/u/octos-org)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/octos-org/voice

---


# Batch ASR / OminiX TTS / Model Management

Speech-to-text uses `ASR_API_URL` when configured (the Octos/OMiniX JSON +
base64 batch-transcription contract at `POST /v1/audio/transcriptions`, such as
the local Whisper or Nemotron adapter); otherwise it falls back to Qwen3 ASR
through local OminiX. Preset-voice text-to-speech with emotion control and model
lifecycle management remain backed by local OminiX (Apple Silicon).

An empty ASR result is a successful no-speech rejection, not an error.

## Boundary — when NOT to use this skill

- **Voice cloning / custom voice profiles** → use **mofa-fm**
  (`fm_tts`, `fm_voice_save`, `fm_voice_list`, `fm_voice_delete`). This skill
  is **preset-voice only**.
- **Emotion prompts in fallback mode** → not supported. When ominix-api is
  unreachable, `voice_synthesize` falls through to the macOS built-in `say`
  command, which auto-picks a system voice from the text language and ignores
  the `prompt` parameter.

## Tools

| Tool               | Purpose                                                    |
|--------------------|------------------------------------------------------------|
| `voice_transcribe` | ASR — WAV/OGG/MP3/FLAC/M4A → text                          |
| `voice_synthesize` | Preset-voice TTS with optional emotion + speed             |
| `list_models`      | List loaded + catalog models on the local ominix-api       |
| `download_model`   | Pull a catalog model to local disk                         |
| `load_model`       | Load a downloaded model into GPU memory                    |
| `unload_model`     | Free a loaded model from GPU memory                        |

## Quick recipes

### Transcribe a voice message

```json
{"audio_path": "voice.ogg", "language": "Chinese"}
```

### Synthesize plain speech

```json
{"text": "Hello world", "language": "english", "speaker": "ryan"}
```

### Synthesize with emotion

```json
{"text": "我太开心了！", "speaker": "vivian", "prompt": "用兴奋激动的语气说话，充满热情和活力"}
```

After `voice_synthesize` returns a file path, deliver the audio with
`send_file`.

## Further reading

- Emotion / style prompts (Chinese + English) → `docs/emotion-prompts.md`
- Server discovery, endpoints, preset speakers, full parameter cheat-sheet →
  `docs/api-reference.md`

## Anti-patterns

- Calling `voice_synthesize` with a `prompt` while ominix-api is down — the
  fallback (`say`) silently drops the emotion. Use `list_models` to confirm
  Qwen3-TTS is loaded before relying on emotion control.
- Passing a non-preset speaker name (e.g. a cloned voice id) — this skill
  only handles preset voices; route the call to **mofa-fm** instead.
- Skipping `download_model` + `load_model` after a fresh install — the
  catalog model is not loaded until you load it explicitly.

