option
MaisonMaison Skill Science des données et ML azure-speech-to-text-rest-py

azure-speech-to-text-rest-py

microsoft/skills microsoft/skills

Transcrivez de courts fichiers audio (jusqu'à 60 secondes) à l'aide de l'API REST Speech-to-Text d'Azure avec Python, sans avoir besoin du SDK Speech.

...Développer tout
0
Heure mise à jour 15 septembre 2026

API REST Azure Speech to Text pour audio court

API REST simple pour la transcription audio-parole de fichiers audio courts (jusqu'à 60 secondes). Aucun SDK requis - il suffit d'utiliser des requêtes HTTP.

Prérequis

  1. Abonnement Azure - Créez-en un gratuitement
  2. Ressource Speech - Créez-la dans le portail Azure
  3. Obtenir les identifiants - Après le déploiement, accédez à la ressource > Clés et point de terminaison

Variables d'environnement

# Obligatoire
AZURE_SPEECH_KEY=<votre-clé-de-ressource-speech>
AZURE_SPEECH_REGION=<région>  # ex. : eastus, westus2, westeurope

# Alternative : Utilisez directement le point de terminaison
AZURE_SPEECH_ENDPOINT=https://<région>.stt.speech.microsoft.com
</région></région></votre-clé-de-ressource-speech>

Installation

pip install requests

Démarrage rapide

import os
import requests

def transcrire_audio(chemin_fichier_audio: str, langue: str = "en-US") -> dict:
    """Transcrire un fichier audio court (max 60 secondes) à l'aide de l'API REST."""
    region = os.environ["AZURE_SPEECH_REGION"]
    cle_api = os.environ["AZURE_SPEECH_KEY"]

    url = f"https://{region}.stt.speech.microsoft.com/speech/recognition/conversation/cognitiveservices/v1"

    en_tetes = {
        "Ocp-Apim-Subscription-Key": cle_api,
        "Content-Type": "audio/wav; codecs=audio/pcm; samplerate=16000",
        "Accept": "application/json"
    }

    parametres = {
        "language": langue,
        "format": "detailed"  # ou "simple"
    }

    with open(chemin_fichier_audio, "rb") as fichier_audio:
        reponse = requests.post(url, en_tetes=en_tetes, parametres=parametres, data=fichier_audio)

    reponse.raise_for_status()
    return reponse.json()

# Utilisation
resultat = transcrire_audio("audio.wav", "en-US")
print(resultat["DisplayText"])

Exigences audio

FormatCodecTaux d'échantillonnageNotes
WAVPCM16 kHz, mono**Recommandé**
OGGOPUS16 kHz, monoTaille de fichier réduite

Limitations :

  • Audio maximum de 60 secondes
  • Pour l'évaluation de la prononciation : maximum 30 secondes
  • Aucun résultat partiel/intermédiaire (uniquement le résultat final)

En-têtes Content-Type

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

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

Formats de réponse

Format simple (par défaut)

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

Format détaillé

parametres = {"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"
    }
  ]
}

Transfert par chunks (Recommandé)

Pour une latence plus faible, diffusez l'audio par chunks :

import os
import requests

def transcrire_chunked(chemin_fichier_audio: str, langue: str = "en-US") -> dict:
    """Diffuser l'audio par chunks pour une latence réduite."""
    region = os.environ["AZURE_SPEECH_REGION"]
    cle_api = os.environ["AZURE_SPEECH_KEY"]

    url = f"https://{region}.stt.speech.microsoft.com/speech/recognition/conversation/cognitiveservices/v1"

    en_tetes = {
        "Ocp-Apim-Subscription-Key": cle_api,
        "Content-Type": "audio/wav; codecs=audio/pcm; samplerate=16000",
        "Accept": "application/json",
        "Transfer-Encoding": "chunked",
        "Expect": "100-continue"
    }

    parametres = {"language": langue, "format": "detailed"}

    def generer_chunks(chemin_fichier: str, taille_chunk: int = 1024):
        with open(chemin_fichier, "rb") as f:
            while chunk := f.read(taille_chunk):
                yield chunk

    reponse = requests.post(
        url, 
        en_tetes=en_tetes, 
        parametres=parametres, 
        data=generer_chunks(chemin_fichier_audio)
    )

    reponse.raise_for_status()
    return reponse.json()

Options d'authentification

Option 1 : Clé d'abonnement (Simple)

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

Option 2 : Jeton Bearer

import requests
import os

def obtenir_jeton_acces() -> str:
    """Obtenir un jeton d'accès depuis le point de terminaison des jetons."""
    region = os.environ["AZURE_SPEECH_REGION"]
    cle_api = os.environ["AZURE_SPEECH_KEY"]

    url_jeton = f"https://{region}.api.cognitive.microsoft.com/sts/v1.0/issueToken"

    reponse = requests.post(
        url_jeton,
        en_tetes={
            "Ocp-Apim-Subscription-Key": cle_api,
            "Content-Type": "application/x-www-form-urlencoded",
            "Content-Length": "0"
        }
    )
    reponse.raise_for_status()
    return reponse.text

# Utiliser le jeton dans les requêtes (valide pendant 10 minutes)
jeton = obtenir_jeton_acces()
en_tetes = {
    "Authorization": f"Bearer {jeton}",
    "Content-Type": "audio/wav; codecs=audio/pcm; samplerate=16000",
    "Accept": "application/json"
}

Paramètres de requête

ParamètreObligatoireValeursDescription
`language`**Oui**`en-US`, `de-DE`, etc.Langue de la parole
`format`Non`simple`, `detailed`Format du résultat (par défaut : simple)
`profanity`Non`masked`, `removed`, `raw`Gestion des vulgarités (par défaut : masquée)

Valeurs de statut de reconnaissance

StatutDescription
`Success`Reconnaissance réussie
`NoMatch`Parole détectée mais aucun mot ne correspond
`InitialSilenceTimeout`Seule du silence détecté
`BabbleTimeout`Seule du bruit détecté
`Error`Erreur interne du service

Gestion des vulgarités

# Masquer les vulgarités avec des astérisques (par défaut)
parametres = {"language": "en-US", "profanity": "masked"}

# Supprimer entièrement les vulgarités
parametres = {"language": "en-US", "profanity": "removed"}

# Inclure les vulgarités telles quelles
parametres = {"language": "en-US", "profanity": "raw"}

Gestion des erreurs

import requests

def transcrire_avec_gestion_erreurs(chemin_audio: str, langue: str = "en-US") -> dict | None:
    """Transcrire avec une gestion appropriée des erreurs."""
    region = os.environ["AZURE_SPEECH_REGION"]
    cle_api = os.environ["AZURE_SPEECH_KEY"]

    url = f"https://{region}.stt.speech.microsoft.com/speech/recognition/conversation/cognitiveservices/v1"

    try:
        with open(chemin_audio, "rb") as fichier_audio:
            reponse = requests.post(
                url,
                en_tetes={
                    "Ocp-Apim-Subscription-Key": cle_api,
                    "Content-Type": "audio/wav; codecs=audio/pcm; samplerate=16000",
                    "Accept": "application/json"
                },
                parametres={"language": langue, "format": "detailed"},
                data=fichier_audio
            )

        if reponse.status_code == 200:
            resultat = reponse.json()
            if resultat.get("RecognitionStatus") == "Success":
                return resultat
            else:
                print(f"Échec de la reconnaissance : {resultat.get('RecognitionStatus')}")
                return None
        elif reponse.status_code == 400:
            print(f"Mauvaise requête : Vérifiez le code de langue ou le format audio")
        elif reponse.status_code == 401:
            print(f"Non autorisé : Vérifiez la clé API ou le jeton")
        elif reponse.status_code == 403:
            print(f"Interdit : En-tête d'autorisation manquant")
        else:
            print(f"Erreur {reponse.status_code} : {reponse.text}")

        return None

    except requests.exceptions.RequestException as e:
        print(f"La requête a échoué : {e}")
        return None

Version asynchrone

import os
import aiohttp
import asyncio

async def transcrire_async(chemin_fichier_audio: str, langue: str = "en-US") -> dict:
    """Version asynchrone utilisant aiohttp."""
    region = os.environ["AZURE_SPEECH_REGION"]
    cle_api = os.environ["AZURE_SPEECH_KEY"]

    url = f"https://{region}.stt.speech.microsoft.com/speech/recognition/conversation/cognitiveservices/v1"

    en_tetes = {
        "Ocp-Apim-Subscription-Key": cle_api,
        "Content-Type": "audio/wav; codecs=audio/pcm; samplerate=16000",
        "Accept": "application/json"
    }

    parametres = {"language": langue, "format": "detailed"}

    async with aiohttp.ClientSession() as session:
        with open(chemin_fichier_audio, "rb") as f:
            donnees_audio = f.read()

        async with session.post(url, en_tetes=en_tetes, parametres=parametres, data=donnees_audio) as reponse:
            reponse.raise_for_status()
            return await reponse.json()

# Utilisation
resultat = asyncio.run(transcrire_async("audio.wav", "en-US"))
print(resultat["DisplayText"])

Langues prises en charge

Codes de langue courants (voir la liste complète) :

CodeLangue
`en-US`Anglais (États-Unis)
`en-GB`Anglais (Royaume-Uni)
`de-DE`Allemand
`fr-FR`Français
`es-ES`Espagnol (Espagne)
`es-MX`Espagnol (Mexique)
`zh-CN`Chinois (Mandarin)
`ja-JP`Japonais
`ko-KR`Coréen
`pt-BR`Portugais (Brésil)

Meilleures pratiques

  1. Choisissez sync OU async et restez cohérent. Ne mélangez pas les clients synchrones azure.xxx avec les clients asynchrones azure.xxx.aio dans le même chemin d'appel. Choisissez un seul mode par module.
  2. Utilisez toujours des gestionnaires de contexte pour les clients. Utilisez with httpx.Client(...) as client: (sync) ou async with httpx.AsyncClient(...) as client: (async) afin que les connexions soient mises en pool et fermées de manière déterministe.
  3. Utilisez WAV PCM 16kHz mono pour une meilleure compatibilité
  4. Activez le transfert par chunks pour une latence réduite
  5. Mettez en cache les jetons d'accès pendant 9 minutes (valides pendant 10)
  6. Spécifiez la langue correcte pour une reconnaissance précise
  7. Utilisez le format détaillé lorsque vous avez besoin de scores de confiance
  8. Gérez toutes les valeurs RecognitionStatus dans le code de production

Quand NE PAS utiliser cette API

Utilisez le SDK Speech ou l'API de transcription par lots à la place lorsque vous avez besoin de :

  • Audio supérieur à 60 secondes
  • Transcription en streaming en temps réel
  • Résultats partiels/intermédiaires
  • Traduction de la parole
  • Modèles de parole personnalisés
  • Transcription par lots de nombreux fichiers

Fichiers de référence

FichierContenu
references/pronunciation-assessment.mdParamètres et notation de l'évaluation de la prononciation
Voir sur GitHub
---
name: azure-speech-to-text-rest-py
description: Transcribe short audio files (up to 60 seconds) using Azure Speech-to-Text REST API with Python, without requiring the Speech SDK.
license: MIT
---

# 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](https://azure.microsoft.com/free/)
2. **Speech resource** - Create in [Azure Portal](https://portal.azure.com/#create/Microsoft.CognitiveServicesSpeechServices)
3. **Get credentials** - After deployment, go to resource > Keys and Endpoint

## Environment Variables

```bash
# 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

```bash
pip install requests
```

## Quick Start

```python
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

| Format | Codec | Sample Rate | Notes |
|--------|-------|-------------|-------|
| WAV | PCM | 16 kHz, mono | **Recommended** |
| OGG | OPUS | 16 kHz, mono | Smaller file size |

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

## Content-Type Headers

```python
# WAV PCM 16kHz
"Content-Type": "audio/wav; codecs=audio/pcm; samplerate=16000"

# OGG OPUS
"Content-Type": "audio/ogg; codecs=opus"
```

## Response Formats

### Simple Format (default)

```python
params = {"language": "en-US", "format": "simple"}
```

```json
{
  "RecognitionStatus": "Success",
  "DisplayText": "Remind me to buy 5 pencils.",
  "Offset": "1236645672289",
  "Duration": "1236645672289"
}
```

### Detailed Format

```python
params = {"language": "en-US", "format": "detailed"}
```

```json
{
  "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:

```python
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)

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

### Option 2: Bearer Token

```python
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

| Parameter | Required | Values | Description |
|-----------|----------|--------|-------------|
| `language` | **Yes** | `en-US`, `de-DE`, etc. | Language of speech |
| `format` | No | `simple`, `detailed` | Result format (default: simple) |
| `profanity` | No | `masked`, `removed`, `raw` | Profanity handling (default: masked) |

## Recognition Status Values

| Status | Description |
|--------|-------------|
| `Success` | Recognition succeeded |
| `NoMatch` | Speech detected but no words matched |
| `InitialSilenceTimeout` | Only silence detected |
| `BabbleTimeout` | Only noise detected |
| `Error` | Internal service error |

## Profanity Handling

```python
# 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

```python
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

```python
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](https://learn.microsoft.com/azure/ai-services/speech-service/language-support)):

| Code | Language |
|------|----------|
| `en-US` | English (US) |
| `en-GB` | English (UK) |
| `de-DE` | German |
| `fr-FR` | French |
| `es-ES` | Spanish (Spain) |
| `es-MX` | Spanish (Mexico) |
| `zh-CN` | Chinese (Mandarin) |
| `ja-JP` | Japanese |
| `ko-KR` | Korean |
| `pt-BR` | Portuguese (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. **Always use context managers for clients.** Use `with httpx.Client(...) as client:` (sync) or `async with httpx.AsyncClient(...) as client:` (async) so connections are pooled and closed deterministically.
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

| File | Contents |
|------|----------|
| [references/pronunciation-assessment.md](references/pronunciation-assessment.md) | Pronunciation assessment parameters and scoring |

Tous les fichiers

0 fichiers

Installer azure-speech-to-text-rest-py

Téléchargez et extrayez les fichiers de compétences dans votre répertoire .claude/skills/.

Télécharger le ZIP

Clonez le dépôt et copiez les fichiers de compétence dans votre projet.

git clone https://github.com/microsoft/skills/tree/main/.github/plugins/azure-sdk-python/skills/azure-speech-to-text-rest-py # Copy SKILL.md to your .claude/skills/ directory

Copier Copier
Configuration rapide: Copiez le dossier de la compétence dans .claude/skills/ Claude détectera et utilisera automatiquement la compétence

Compétences similaires

web-search
Heure mise à jour 29 juin 2026
webapp-testing
Heure mise à jour 29 juin 2026
lark-base
Heure mise à jour 5 juillet 2026
agentmail
Heure mise à jour 29 juin 2026
OR