azure-speech-to-text — Claude Code skill: what it does, how to install
Transcribes local audio files into text with word-level timestamps and speaker diarization using Azure AI Speech. Speeds up subtitle creation and audio processing in OpenMontage pipelines.
npx skills add calesthio/OpenMontage --skill azure-speech-to-text -a claude-codeWhat azure-speech-to-text does
This skill hooks Azure Fast Transcription REST API into OpenMontage through the azure_stt tool. It uploads local audio files synchronously using a multipart POST request via requests. You do not need the native Azure Speech SDK or Azure Blob storage. The tool extracts text segments with word timestamps and labels speakers directly from the audio.
The output schema matches the local faster-whisper transcriber tool. That allows dropping azure_stt into subtitle_gen and downstream pipeline stages without data conversion. You can lock the spoken language to a code like en-US or pass candidate_locales for detection, and configure profanity_filter when needed.
Running this requires internet access and the AZURE_SPEECH_KEY plus AZURE_SPEECH_REGION environment variables. A single request caps out around 2 hours of audio or a few hundred megabytes. Without valid credentials, the tool fails immediately, making the local faster-whisper fallback mandatory for offline environments.
What it helps with
- transcribe local audio files using the Azure Fast Transcription REST API
- generate word-level timestamps for automated subtitle creation
- separate speakers in multi-speaker audio without HuggingFace tokens
- identify spoken languages automatically from a shortlist of locales
Example prompts for the agent
- Transcribe audio/interview.mp3 using azure_stt with diarization for 2 speakers
- Run azure_stt on projects/video/narration.mp3 using English locale en-US
- Generate word timestamps for voice.wav via azure_stt and save results to artifacts
How to install azure-speech-to-text
1Skills CLI (Vercel)
npx skills add calesthio/OpenMontage --skill azure-speech-to-text -a claude-code2Manually: put the files in place
~/.claude/skills/azure-speech-to-text/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/azure-speech-to-text/
1Skills CLI (Vercel)
npx skills add calesthio/OpenMontage --skill azure-speech-to-text -a codex2Manually: put the files in place
.agents/skills/azure-speech-to-text/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add calesthio/OpenMontage --skill azure-speech-to-text -a cursor2Manually: put the files in place
.cursor/skills/azure-speech-to-text/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install calesthio/OpenMontage azure-speech-to-text2Manually: put the files in place
.github/skills/azure-speech-to-text/SKILL.md1Skills CLI (Vercel)
npx skills add calesthio/OpenMontage --skill azure-speech-to-text -a gemini-cli2Platform CLI
gemini skills install https://github.com/calesthio/OpenMontage --path .claude/skills/azure-speech-to-textManually: put the files in place
.devin/skills/azure-speech-to-text/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add calesthio/OpenMontage --skill azure-speech-to-text -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
From the same set28
The whole set →Similar
Questions about azure-speech-to-text
How do I install azure-speech-to-text in Claude Code?
Run npx skills add calesthio/OpenMontage --skill azure-speech-to-text -a claude-code. The skill definition will be added to ~/.claude/skills/azure-speech-to-text/SKILL.md.
What does azure-speech-to-text do?
It sends local audio files to the Azure Fast Transcription REST API and outputs text with word timestamps, language tags, and speaker labels. It acts as an optional cloud alternative to the local faster-whisper transcriber in OpenMontage.
What credentials are required to use azure-speech-to-text?
Set the AZURE_SPEECH_KEY and AZURE_SPEECH_REGION (or AZURE_SPEECH_ENDPOINT) environment variables. If these credentials are missing, OpenMontage falls back to the local faster-whisper tool.
Source text
SKILL.md · MIT
---
name: azure-speech-to-text
description: Transcribe audio to text using Azure AI Speech (Fast Transcription REST API). Use when converting audio/video to text, generating subtitles, or processing spoken content in OpenMontage. Optional cloud STT provider — preferred when AZURE_SPEECH_KEY is configured; the local faster-whisper `transcriber` is the default offline path.
license: MIT
compatibility: Requires internet access and an Azure AI Speech resource (AZURE_SPEECH_KEY + AZURE_SPEECH_REGION).
metadata: {"openclaw": {"requires": {"env": ["AZURE_SPEECH_KEY", "AZURE_SPEECH_REGION"]}, "primaryEnv": "AZURE_SPEECH_KEY"}}
---
# Azure AI Speech — Speech-to-Text
Transcribe audio to text with **Azure Fast Transcription** — synchronous,
word-level timestamps, speaker diarization, and multi-language identification.
In OpenMontage this is exposed through the `azure_stt` tool (`capability=analysis`,
`provider=azure`). It is an **optional cloud STT provider** — when
`AZURE_SPEECH_KEY` is configured, prefer it for cloud transcription. The local
`transcriber` tool (faster-whisper) remains the **default offline path** and the
fallback when Azure is unavailable.
> Docs: [Fast Transcription](https://learn.microsoft.com/azure/ai-services/speech-service/fast-transcription-create) · [Speech service overview](https://learn.microsoft.com/azure/ai-services/speech-service/spx-overview)
## Why Fast Transcription (not Batch)
Azure exposes three STT surfaces. OpenMontage uses **Fast Transcription** because
the pipeline transcribes **local audio files**:
| Surface | Input | Latency | Needs |
|---------|-------|---------|-------|
| **Fast Transcription** (used here) | local file, multipart POST | synchronous, sub-real-time | key + region |
| Batch Transcription | audio at a URL (Blob + SAS) | async job + polling | Blob storage plumbing |
| Speech SDK (`spx`) | mic / stream / file | streaming | native `azure-cognitiveservices-speech` package |
Fast Transcription needs no Blob storage, no SAS URLs, and no native SDK — just
`requests` and the two env vars.
## Setup
Create a **Speech** resource in the [Azure portal](https://portal.azure.com);
copy the key and region from its **Keys and Endpoint** page.
```bash
export AZURE_SPEECH_KEY=your_speech_resource_key
export AZURE_SPEECH_REGION=eastus # your resource's region
# export AZURE_SPEECH_ENDPOINT=https://... # optional: overrides region
```
`azure_stt` reports `AVAILABLE` once `AZURE_SPEECH_KEY` plus either
`AZURE_SPEECH_REGION` or `AZURE_SPEECH_ENDPOINT` are set.
## Using it in a pipeline
Prefer `azure_stt` over `transcriber` unless the run must be offline. Its output
matches the `transcriber` schema exactly, so it is a drop-in for `subtitle_gen`
and any stage that consumes a transcript.
```python
from tools.tool_registry import registry
registry.discover()
stt = registry._tools["azure_stt"]
result = stt.execute({
"input_path": "projects/my-video/assets/audio/narration.mp3",
# "language": "en", # ISO 639-1 or BCP-47 ("en-US"); omit for auto-ID
# "diarize": True, # speaker labels, no HuggingFace token needed
# "max_speakers": 4,
"output_dir": "projects/my-video/artifacts",
})
if result.success:
segs = result.data["segments"] # [{id,start,end,text,words:[...]}]
words = result.data["word_timestamps"] # flat [{word,start,end,probability}]
```
If `azure_stt` is unavailable (no key) or errors, fall back to `transcriber`
(local whisper) — its `execute` signature and output are identical.
## Parameters that matter
- **`language`** — pass an ISO code (`"en"`) or a full locale (`"en-US"`). Pin it
when you know the language; it is faster and more accurate than auto-ID.
- **`candidate_locales`** — when `language` is omitted, Azure runs language
identification across this shortlist. Narrow it to the languages you actually
expect; a huge list slows detection and invites misclassification.
- **`diarize` / `max_speakers`** — enable for multi-speaker audio (interviews,
podcasts). Set `max_speakers` to the real upper bound.
- **`profanity_filter`** — `None` | `Masked` (default) | `Removed` | `Tags`.
## Response shape (mapped to the transcriber schema)
The raw Azure response (`phrases[]` with `offsetMilliseconds` / `words[]`) is
converted to seconds and the OpenMontage transcript schema:
```json
{
"segments": [
{"id": 0, "start": 0.0, "end": 2.4, "text": "Hello world",
"speaker": 1,
"words": [{"word": "Hello", "start": 0.0, "end": 0.5, "probability": 0.98}]}
],
"word_timestamps": [{"word": "Hello", "start": 0.0, "end": 0.5, "probability": 0.98}],
"language": "en-US",
"duration_seconds": 2.4,
"provider": "azure"
}
```
Note: Fast Transcription has no *per-word* confidence, so each word carries the
**phrase** confidence in `probability`.
## Limits & tips
- Single file up to ~2 hours / a few hundred MB per request. For longer or bulk
jobs, use Azure Batch Transcription instead.
- Send clean audio (16 kHz+ mono is plenty). Transcode video to audio first if
you only need speech — smaller upload, same result.
- Verify timing: word timestamps drive subtitle cues in `subtitle_gen`. Spot-check
the first and last cues against the source audio.
© calesthio · MIT · calesthio/OpenMontage