Transcribe an audio file (wav/mp3/mp4/m4a) into text via a local
LocalKin Service Audio Server (default :8000 / SenseVoice). Pair
with `record action=start mic=true` to turn a recorded mic track
into text. Set STT_ENDPOINT env var to point at a different server.
Installation
Installer avec Codex ou Claude Copiez ce prompt, collez-le dans Codex, Claude ou un autre assistant, puis laissez-le vérifier la page du skill et l'installer pour vous.
Transcribe an audio file (wav/mp3/mp4/m4a) into text via a local
LocalKin Service Audio Server (default :8000 / SenseVoice). Pair
with `record action=start mic=true` to turn a recorded mic track
into text. Set STT_ENDPOINT env var to point at a different server.
command
["sh","-c","P=\"$1\"\nL=\"$2\"\n[ -z \"$P\" ] && { echo \"stt: path required\" >&2; exit 1; }\n# Expand leading ~ — Go's filepath doesn't, shells do.\ncase \"$P\" in \"~/\"*) P=\"$HOME/${P#~/}\";; \"~\") P=\"$HOME\";; esac\n[ ! -f \"$P\" ] && { echo \"stt: file not found: $P\" >&2; exit 1; }\n# Kernel strips unsubstituted {{vars}} to \"\" — empty L means\n# caller didn't pass language, just skip the form field.\nif [ -n \"$L\" ]; then\n RESP=$(curl -sS -X POST \"${STT_ENDPOINT:-http://localhost:8000}/transcribe\" \\\n -F \"file=@$P\" -F \"language=$L\" -w '\\n%{http_code}')\nelse\n RESP=$(curl -sS -X POST \"${STT_ENDPOINT:-http://localhost:8000}/transcribe\" \\\n -F \"file=@$P\" -w '\\n%{http_code}')\nfi\nHTTP=$(printf '%s' \"$RESP\" | tail -n1)\nBODY=$(printf '%s' \"$RESP\" | sed '$d')\nif [ \"$HTTP\" != \"200\" ]; then\n echo \"stt: server returned HTTP $HTTP\" >&2\n echo \"$BODY\" >&2\n exit 1\nfi\n# LocalKin Service Audio shape: {\"text\":\"...\",\"language\":\"...\",\"confidence\":...}.\n# If the server returns something else, fall back to raw.\nTEXT=$(printf '%s' \"$BODY\" | jq -r '.text // empty' 2>/dev/null)\nif [ -z \"$TEXT\" ]; then\n printf '%s\\n' \"$BODY\"\nelse\n printf 'text: %s\\n' \"$TEXT\"\n LANG=$(printf '%s' \"$BODY\" | jq -r '.language // empty' 2>/dev/null)\n [ -n \"$LANG\" ] && printf 'language: %s\\n' \"$LANG\"\n CONF=$(printf '%s' \"$BODY\" | jq -r '.confidence // empty' 2>/dev/null)\n [ -n \"$CONF\" ] && printf 'confidence: %s\\n' \"$CONF\"\nfi\n","_"]
args
["{{path}}","{{language}}"]
schema
{"path":{"type":"string","description":"Path to an audio file (wav/mp3/mp4/m4a). Leading \"~\" is expanded. Required.","required":true},"language":{"type":"string","description":"Optional language hint (auto, zh, en, ja, ko, yue, ...). Server default if omitted.","required":false}}
timeout
300
stt — speech transcription via LocalKin Service Audio (SenseVoice)
Wraps the LocalKin Service Audio API at :8000/transcribe. Multipart
upload with one file field, returns {"text", "language", "confidence"}.
Why this is a SKILL.md and not a native skill
It's a single multipart curl + jq extraction. Pure HTTP wrapper, no
state, no OS API binding — perfect external skill territory.
Pairing with record
record action=start audio=false mic=true → returns recording_id
... user speaks ...
record action=stop id=<recording_id> → returns path: ~/.../rec-XXXX.mp4
stt path=~/.../rec-XXXX.mp4 → returns the spoken text
The mp4 from record has its mic audio in a track that SenseVoice
reads directly — no ffmpeg extraction needed.