Skill: pors/openai-tts (version 1.0.0)

--- name: openai-tts description: Text-to-speech via OpenAI Audio Speech API. homepage: https://platform.openai.com/docs/guides/text-to-speech metadata: {"clawdbot":{"emoji":"🔊","requires":{"bins":["curl"],"env":["OPENAI_API_KEY"]},"primaryEnv":"OPENAI_API_KEY"}} --- # OpenAI TTS (curl) Generate speech from text via OpenAI's `/v1/audio/speech` endpoint. ## Quick start ```bash {baseDir}/scripts/speak.sh "Hello, world!" {baseDir}/scripts/speak.sh "Hello, world!" --out /tmp/hello.mp3 ``` Defaults: - Model: `tts-1` (fast) or `tts-1-hd` (quality) - Voice: `alloy` (neutral), also: `echo`, `fable`, `onyx`, `nova`, `shimmer` - Format: `mp3` ## Voices | Voice | Description | |-------|-------------| | alloy | Neutral, balanced | | echo | Male, warm | | fable | British, expressive | | onyx | Deep, authoritative | | nova | Female, friendly | | shimmer | Female, soft | ## Flags ```bash {baseDir}/scripts/speak.sh "Text" --voice nova --model tts-1-hd --out speech.mp3 {baseDir}/scripts/speak.sh "Text" --format opus --speed 1.2 ``` Options: - `--voice <name>`: alloy|echo|fable|onyx|nova|shimmer (default: alloy) - `--model <name>`: tts-1|tts-1-hd (default: tts-1) - `--format <fmt>`: mp3|opus|aac|flac|wav|pcm (default: mp3) - `--speed <n>`: 0.25-4.0 (default: 1.0) - `--out <path>`: output file (default: stdout or auto-named) ## API key Set `OPENAI_API_KEY`, or configure in `~/.clawdbot/clawdbot.json`: ```json5 { skills: { entries: { "openai-tts": { [REDACTED_SECRET]" } } } } ``` ## Pricing - tts-1: ~$0.015 per 1K characters - tts-1-hd: ~$0.030 per 1K characters Very affordable for short responses!

path: scripts/speak.sh
content: #!/usr/bin/env bash
set -euo pipefail

usage() {
  cat >&2 <<'EOF'
Usage:
  speak.sh <text> [--voice alloy] [--model tts-1] [--format mp3] [--speed 1.0] [--out /path/to/out.mp3]

Voices: alloy, echo, fable, onyx, nova, shimmer
Models: tts-1 (fast), tts-1-hd (quality)
Formats: mp3, opus, aac, flac, wav, pcm
Speed: 0.25 to 4.0
EOF
  exit 2
}

if [[ "${1:-}" == "" || "${1:-}" == "-h" || "${1:-}" == "--help" ]]; then
  usage
fi

text="${1:-}"
shift || true

voice="alloy"
model="tts-1"
format="mp3"
speed="1.0"
out=""

while [[ $# -gt 0 ]]; do
  case "$1" in
    --voice)
      voice="${2:-}"
      shift 2
      ;;
    --model)
      model="${2:-}"
      shift 2
      ;;
    --format)
      format="${2:-}"
      shift 2
      ;;
    --speed)
      speed="${2:-}"
      shift 2
      ;;
    --out)
      out="${2:-}"
      shift 2
      ;;
    *)
      echo "Unknown arg: $1" >&2
      usage
      ;;
  esac
done

if [[ "${OPENAI_API_KEY:-}" == "" ]]; then
  echo "Missing OPENAI_API_KEY" >&2
  exit 1
fi

# Build JSON payload
json=$(cat <<EOF
{
  "model": "${model}",
  "input": $(printf '%s' "$text" | jq -Rs .),
  "voice": "${voice}",
  "response_format": "${format}",
  "speed": ${speed}
}
EOF
)

if [[ "$out" == "" ]]; then
  # Output to stdout
  curl -sS https://api.openai.com/v1/audio/speech \
    -H "Authorization: Bearer $OPENAI_API_KEY" \
    -H "Content-Type: application/json" \
    -d "$json"
else
  # Output to file
  mkdir -p "$(dirname "$out")"
  curl -sS https://api.openai.com/v1/audio/speech \
    -H "Authorization: Bearer $OPENAI_API_KEY" \
    -H "Content-Type: application/json" \
    -d "$json" \
    -o "$out"
  echo "$out"
fi


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: clean (LOW)