본문으로 건너뛰기
cccskills
Microsoft 공식무료GitHub에 공개

azure-speech-to-text-rest-py

Build Python transcription for audio files up to 60 seconds using Azure Speech to Text through HTTP requests, without the Speech SDK. Covers language selection, recognition results, authentication, and error handling.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

원문원문 설명 보기

Azure Speech to Text REST API for short audio (Python). Use for simple speech recognition of audio files up to 60 seconds without the Speech SDK. Triggers: "speech to text REST", "short audio transcription", "speech recognition REST API", "STT REST", "recognize speech REST". DO NOT USE FOR: Long audio (>60 seconds), real-time streaming, batch transcription, custom speech models, speech translation. Use Speech SDK or Batch Transcription API instead.

연동 도구Azure
설치 방법 보기

이럴 때 유용합니다

  • Transcribing short voice recordings
  • Adding transcription to Python scripts without the Speech SDK
  • Retrieving recognition confidence scores
  • Handling silence and recognition failures

포함된 파일(2)

  • SKILL.md11.8 KB
  • references/pronunciation-assessment.md7.6 KB

SKILL.md(원문)

설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.

Azure Speech to Text REST API for Short Audio

Simple REST API for speech-to-text transcription of short audio files (up to 60 seconds). No SDK required - just HTTP requests.

Prerequisites

  1. Azure subscription - Create one free
  2. Speech resource - Create in Azure Portal
  3. Get credentials - After deployment, go to resource > Keys and Endpoint

Environment Variables

# Required
AZURE_SPEECH_KEY=<your-speech-resource-key>
AZURE_SPEECH_REGION=<region>  # e.g., eastus, westus2, westeurope

# Alternative: Use endpoint directly
AZURE_SPEECH_ENDPOINT=https://<region>.stt.speech.microsoft.com

Installation

pip install requests

Authentication & Lifecycle

🔑 Two rules apply to every code sample below:

  1. Two auth modes are supported. Use a subscription key (Ocp-Apim-Subscription-Key header) for quick access, or a Microsoft Entra token (including one acquired with DefaultAzureCredential) via the Authorization request header (see "Option 2" below). Never hardcode credentials in source.
  2. Use context managers for files and HTTP resources so file handles and network connections are released deterministically:
    • Sync: with open(...) as f: and (when reusing connections) with requests.Session() as session:
    • Async: async with aiohttp.ClientSession() as session:

Snippets may abbreviate this setup, but production code should always follow both rules.

Quick Start

import os
import requests

def transcribe_audio(audio_file_path: str, language: str = "en-US") -> dict:
    """Transcribe short audio file (max 60 seconds) using REST API."""
    region = os.environ["AZURE_SPEECH_REGION"]
    api_key = os.environ["AZURE_SPEECH_KEY"]
    
    url = f"https://{region}.stt.speech.microsoft.com/speech/recognition/conversation/cognitiveservices/v1"
    
    headers = {
        "Ocp-Apim-Subscription-Key": api_key,
        "Content-Type": "audio/wav; codecs=audio/pcm; samplerate=16000",
        "Accept": "application/json"
    }
    
    params = {
        "language": language,
        "format": "detailed"  # or "simple"
    }
    
    with open(audio_file_path, "rb") as audio_file:
        response = requests.post(url, headers=headers, params=params, data=audio_file)
    
    response.raise_for_status()
    return response.json()

# Usage
result = transcribe_audio("audio.wav", "en-US")
print(result["DisplayText"])

Audio Requirements

FormatCodecSample RateNotes
WAVPCM16 kHz, monoRecommended
OGGOPUS16 kHz, monoSmaller file size

Limitations:

  • Maximum 60 seconds of audio
  • For pronunciation assessment: maximum 30 seconds
  • No partial/interim results (final only)

Content-Type Headers

# WAV PCM 16kHz
wav_headers = {
    "Content-Type": "audio/wav; codecs=audio/pcm; samplerate=16000"
}

# OGG OPUS
ogg_headers = {
    "Content-Type": "audio/ogg; codecs=opus"
}

Response Formats

Simple Format (default)

params = {"language": "en-US", "format": "simple"}
{
  "RecognitionStatus": "Success",
  "DisplayText": "Remind me to buy 5 pencils.",
  "Offset": "1236645672289",
  "Duration": "1236645672289"
}

Detailed Format

params = {"language": "en-US", "format": "detailed"}
{
  "RecognitionStatus": "Success",
  "Offset": "1236645672289",
  "Duration": "1236645672289",
  "NBest": [
    {
      "Confidence": 0.9052885,
      "Display": "What's the weather like?",
      "ITN": "what's the weather like",
      "Lexical": "what's the weather like",
      "MaskedITN": "what's the weather like"
    }
  ]
}

Chunked Transfer (Recommended)

For lower latency, stream audio in chunks:

import os
import requests

def transcribe_chunked(audio_file_path: str, language: str = "en-US") -> dict:
    """Stream audio in chunks for lower latency."""
    region = os.environ["AZURE_SPEECH_REGION"]
    api_key = os.environ["AZURE_SPEECH_KEY"]
    
    url = f"https://{region}.stt.speech.microsoft.com/speech/recognition/conversation/cognitiveservices/v1"
    
    headers = {
        "Ocp-Apim-Subscription-Key": api_key,
        "Content-Type": "audio/wav; codecs=audio/pcm; samplerate=16000",
        "Accept": "application/json",
        "Transfer-Encoding": "chunked",
        "Expect": "100-continue"
    }
    
    params = {"language": language, "format": "detailed"}
    
    def generate_chunks(file_path: str, chunk_size: int = 1024):
        with open(file_path, "rb") as f:
            while chunk := f.read(chunk_size):
                yield chunk
    
    response = requests.post(
        url, 
        headers=headers, 
        params=params, 
        data=generate_chunks(audio_file_path)
    )
    
    response.raise_for_status()
    return response.json()

Authentication Options

Option 1: Subscription Key (Simple)

headers = {
    "Ocp-Apim-Subscription-Key": os.environ["AZURE_SPEECH_KEY"]
}

Option 2: Bearer Token

import requests
import os

def get_access_token() -> str:
    """Get access token from the token endpoint."""
    region = os.environ["AZURE_SPEECH_REGION"]
    api_key = os.environ["AZURE_SPEECH_KEY"]
    
    token_url = f"https://{region}.api.cognitive.microsoft.com/sts/v1.0/issueToken"
    
    response = requests.post(
        token_url,
        headers={
            "Ocp-Apim-Subscription-Key": api_key,
            "Content-Type": "application/x-www-form-urlencoded",
            "Content-Length": "0"
        }
    )
    response.raise_for_status()
    return response.text

# Use token in requests (valid for 10 minutes)
token = get_access_token()
headers = {
    "Authorization": f"Bearer {token}",
    "Content-Type": "audio/wav; codecs=audio/pcm; samplerate=16000",
    "Accept": "application/json"
}

Query Parameters

ParameterRequiredValuesDescription
languageYesen-US, de-DE, etc.Language of speech
formatNosimple, detailedResult format (default: simple)
profanityNomasked, removed, rawProfanity handling (default: masked)

Recognition Status Values

StatusDescription
SuccessRecognition succeeded
NoMatchSpeech detected but no words matched
InitialSilenceTimeoutOnly silence detected
BabbleTimeoutOnly noise detected
ErrorInternal service error

Profanity Handling

# Mask profanity with asterisks (default)
params = {"language": "en-US", "profanity": "masked"}

# Remove profanity entirely
params = {"language": "en-US", "profanity": "removed"}

# Include profanity as-is
params = {"language": "en-US", "profanity": "raw"}

Error Handling

import requests

def transcribe_with_error_handling(audio_path: str, language: str = "en-US") -> dict | None:
    """Transcribe with proper error handling."""
    region = os.environ["AZURE_SPEECH_REGION"]
    api_key = os.environ["AZURE_SPEECH_KEY"]
    
    url = f"https://{region}.stt.speech.microsoft.com/speech/recognition/conversation/cognitiveservices/v1"
    
    try:
        with open(audio_path, "rb") as audio_file:
            response = requests.post(
                url,
                headers={
                    "Ocp-Apim-Subscription-Key": api_key,
                    "Content-Type": "audio/wav; codecs=audio/pcm; samplerate=16000",
                    "Accept": "application/json"
                },
                params={"language": language, "format": "detailed"},
                data=audio_file
            )
        
        if response.status_code == 200:
            result = response.json()
            if result.get("RecognitionStatus") == "Success":
                return result
            else:
                print(f"Recognition failed: {result.get('RecognitionStatus')}")
                return None
        elif response.status_code == 400:
            print(f"Bad request: Check language code or audio format")
        elif response.status_code == 401:
            print(f"Unauthorized: Check API key or token")
        elif response.status_code == 403:
            print(f"Forbidden: Missing authorization header")
        else:
            print(f"Error {response.status_code}: {response.text}")
        
        return None
        
    except requests.exceptions.RequestException as e:
        print(f"Request failed: {e}")
        return None

Async Version

import os
import aiohttp
import asyncio

async def transcribe_async(audio_file_path: str, language: str = "en-US") -> dict:
    """Async version using aiohttp."""
    region = os.environ["AZURE_SPEECH_REGION"]
    api_key = os.environ["AZURE_SPEECH_KEY"]
    
    url = f"https://{region}.stt.speech.microsoft.com/speech/recognition/conversation/cognitiveservices/v1"
    
    headers = {
        "Ocp-Apim-Subscription-Key": api_key,
        "Content-Type": "audio/wav; codecs=audio/pcm; samplerate=16000",
        "Accept": "application/json"
    }
    
    params = {"language": language, "format": "detailed"}
    
    async with aiohttp.ClientSession() as session:
        with open(audio_file_path, "rb") as f:
            audio_data = f.read()
        
        async with session.post(url, headers=headers, params=params, data=audio_data) as response:
            response.raise_for_status()
            return await response.json()

# Usage
result = asyncio.run(transcribe_async("audio.wav", "en-US"))
print(result["DisplayText"])

Supported Languages

Common language codes (see full list):

CodeLanguage
en-USEnglish (US)
en-GBEnglish (UK)
de-DEGerman
fr-FRFrench
es-ESSpanish (Spain)
es-MXSpanish (Mexico)
zh-CNChinese (Mandarin)
ja-JPJapanese
ko-KRKorean
pt-BRPortuguese (Brazil)

Best Practices

  1. Pick sync OR async and stay consistent. Do not mix azure.xxx sync clients with azure.xxx.aio async clients in the same call path. Choose one mode per module.
  2. Use context managers for files and HTTP resources. Use with open(...) as f: and (when reusing connections) with requests.Session() as session: for sync code, or async with aiohttp.ClientSession() as session: for async code.
  3. Use WAV PCM 16kHz mono for best compatibility
  4. Enable chunked transfer for lower latency
  5. Cache access tokens for 9 minutes (valid for 10)
  6. Specify the correct language for accurate recognition
  7. Use detailed format when you need confidence scores
  8. Handle all RecognitionStatus values in production code

When NOT to Use This API

Use the Speech SDK or Batch Transcription API instead when you need:

  • Audio longer than 60 seconds
  • Real-time streaming transcription
  • Partial/interim results
  • Speech translation
  • Custom speech models
  • Batch transcription of many files

Reference Files

FileContents
references/pronunciation-assessment.mdPronunciation assessment parameters and scoring

리뷰

아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.

댓글

로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.

아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.

보내면 바로 공개됩니다. 이메일 주소나 전화번호 같은 개인 정보는 쓰지 마세요. URL은 2개까지입니다.

0 / 1,000자

이 양식은 reCAPTCHA로 보호되며 Google 개인정보처리방침 및 서비스 약관이 적용됩니다.

같은 저장소의 스킬

agent-framework-azure-ai-py

Microsoft 공식무료

Create Python agents on Azure AI Foundry that retain conversation context and use multiple tools. The skill covers code execution, file and web search, external tool connections, streaming responses, and outputs organized into defined fields.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

  • Build an agent that retains conversation context
  • Combine code execution with file and web search
  • Connect external tools through MCP
microsoft/skills3.1천2026년 10월 23일 업데이트

airunway-aks-setup

Microsoft 공식무료

Set up AI Runway on an existing AKS cluster, from checking cluster health and GPU compatibility to installing model serving software, deploying a first AI model, and verifying that it runs.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

  • Setting up AI Runway on an existing AKS cluster
  • Checking GPU compatibility before deploying a model
  • Choosing and installing model serving software
microsoft/skills3.1천2026년 10월 23일 업데이트

aks-gpu-inference

Microsoft 공식무료

Diagnose Day-2 AKS GPU and KAITO incidents using profile-aware, read-only evidence. WHEN: 'Insufficient nvidia.com/gpu', GPU pod Pending, model-load OOM, DCGM/VRAM, KAITO Workspace not ready, or GPU autoscaling. DO NOT USE FOR: setup (airunway-aks-setup), non-GPU incidents (aks-troubleshooting), standalone VM quota (azure-quotas), or generic cost (cost-analysis or cost-optimization from the optional azure-cost plugin).

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

microsoft/skills3.1천2026년 10월 23일 업데이트

aks-known-issues

Microsoft 공식무료

Lookup documented AKS fixes only when the prompt includes an exact catalog signature and all of its qualifiers: VMCannotFitEphemeralOSDisk; NodePoolMcVersionIncompatible; 'NodeImageVersion is not accepted'; AKS SkuNotAvailable with size, location, and zone; ZonalAllocationFailed with insufficient zone capacity; OverconstrainedAllocationRequest with listed constraints; nested AKS vmssCSE/CSE VMExtensionError_OutboundConnFail, VMExtensionError_K8SAPIServerConnFail, or VMExtensionError_K8SAPIServerDNSLookupFail; or AllocationFailed with the full cataloged internal-error or insufficient-regional-capacity message. Never use for quota errors, code-only or bare wrappers, generic symptoms, incomplete signatures, or failures outside AKS; use aks-troubleshooting or azure-diagnostics.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

microsoft/skills3.1천2026년 10월 23일 업데이트

aks-network-capture

Microsoft 공식무료

Collect bounded packet captures from AKS nodes or pods alongside Azure network settings. Use the captured traffic as evidence when investigating where packets are lost, after initial checks that do not change the environment.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

  • Collect packet captures from an AKS node
  • Gather evidence of where packets are lost
  • Retrieve captures alongside Azure network settings
microsoft/skills3.1천2026년 10월 23일 업데이트

aks-troubleshooting

Microsoft 공식무료

Investigate live Azure Kubernetes Service incidents through read-only checks of logs, events, and resource state. Trace workload, node, networking, or upgrade failures and produce an incident report with supporting evidence, confidence, and proposed remediation.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

  • Investigating crashing or Pending pods
  • Tracing DNS, ingress, and connectivity failures
  • Diagnosing node-pool scaling and quota failures
microsoft/skills3.1천2026년 10월 23일 업데이트

microsoft의 스킬 모두 보기

이 스킬의 문제 신고