opção
LarLar Skill Ciência de dados e ML azure-speech-to-text-rest-py

azure-speech-to-text-rest-py

microsoft/skills microsoft/skills

Transcreva arquivos de áudio curtos (até 60 segundos) usando a API REST do Azure Speech-to-Text com Python, sem exigir o SDK de Fala.

...Expandir tudo
0
Tempo atualizado 15 de Setembro de 2026

API REST de Fala para Texto do Azure para Áudio Curto

API REST simples para transcrição de fala para texto de arquivos de áudio curtos (até 60 segundos). Não é necessário SDK - apenas solicitações HTTP.

Pré-requisitos

  1. Assinatura do Azure - Crie uma gratuitamente
  2. Recurso de Fala - Crie no Portal do Azure
  3. Obtenha as credenciais - Após a implantação, vá para o recurso > Chaves e Ponto de Extremidade

Variáveis de Ambiente

# Obrigatório
AZURE_SPEECH_KEY=<sua-chave-de-recurso-de-fala>
AZURE_SPEECH_REGION=<região>  # ex., eastus, westus2, westeurope

# Alternativa: Use o ponto de extremidade diretamente
AZURE_SPEECH_ENDPOINT=https://<região>.stt.speech.microsoft.com
</região></região></sua-chave-de-recurso-de-fala>

Instalação

pip install requests

Início Rápido

import os
import requests

def transcrever_audio(caminho_arquivo_audio: str, idioma: str = "pt-BR") -> dict:
    """Transcreve arquivo de áudio curto (máximo 60 segundos) usando a API REST."""
    regiao = os.environ["AZURE_SPEECH_REGION"]
    chave_api = os.environ["AZURE_SPEECH_KEY"]

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

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

    params = {
        "language": idioma,
        "format": "detailed"  # ou "simple"
    }

    with open(caminho_arquivo_audio, "rb") as arquivo_audio:
        response = requests.post(url, headers=headers, params=params, data=arquivo_audio)

    response.raise_for_status()
    return response.json()

# Uso
resultado = transcrever_audio("audio.wav", "pt-BR")
print(resultado["DisplayText"])

Requisitos de Áudio

FormatoCodecTaxa de AmostragemObservações
WAVPCM16 kHz, mono**Recomendado**
OGGOPUS16 kHz, monoTamanho de arquivo menor

Limitações:

  • Máximo de 60 segundos de áudio
  • Para avaliação de pronúncia: máximo de 30 segundos
  • Sem resultados parciais/interinos (apenas final)

Cabeçalhos Content-Type

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

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

Formatos de Resposta

Formato Simples (padrão)

params = {"language": "pt-BR", "format": "simple"}
{
  "RecognitionStatus": "Success",
  "DisplayText": "Lembre-me de comprar 5 lápis.",
  "Offset": "1236645672289",
  "Duration": "1236645672289"
}

Formato Detalhado

params = {"language": "pt-BR", "format": "detailed"}
{
  "RecognitionStatus": "Success",
  "Offset": "1236645672289",
  "Duration": "1236645672289",
  "NBest": [
    {
      "Confidence": 0.9052885,
      "Display": "Qual é a previsão do tempo?",
      "ITN": "qual é a previsão do tempo",
      "Lexical": "qual é a previsão do tempo",
      "MaskedITN": "qual é a previsão do tempo"
    }
  ]
}

Transferência em Blocos (Recomendado)

Para menor latência, transmita o áudio em blocos:

import os
import requests

def transcrever_em_blocos(caminho_arquivo_audio: str, idioma: str = "pt-BR") -> dict:
    """Transmite áudio em blocos para menor latência."""
    regiao = os.environ["AZURE_SPEECH_REGION"]
    chave_api = os.environ["AZURE_SPEECH_KEY"]

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

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

    params = {"language": idioma, "format": "detailed"}

    def gerar_blocos(caminho_arquivo: str, tamanho_bloco: int = 1024):
        with open(caminho_arquivo, "rb") as f:
            while chunk := f.read(tamanho_bloco):
                yield chunk

    response = requests.post(
        url, 
        headers=headers, 
        params=params, 
        data=gerar_blocos(caminho_arquivo_audio)
    )

    response.raise_for_status()
    return response.json()

Opções de Autenticação

Opção 1: Chave de Assinatura (Simples)

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

Opção 2: Token Bearer

import requests
import os

def obter_token_acesso() -> str:
    """Obtém token de acesso do ponto de extremidade de token."""
    regiao = os.environ["AZURE_SPEECH_REGION"]
    chave_api = os.environ["AZURE_SPEECH_KEY"]

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

    response = requests.post(
        url_token,
        headers={
            "Ocp-Apim-Subscription-Key": chave_api,
            "Content-Type": "application/x-www-form-urlencoded",
            "Content-Length": "0"
        }
    )
    response.raise_for_status()
    return response.text

# Use o token nas solicitações (válido por 10 minutos)
token = obter_token_acesso()
headers = {
    "Authorization": f"Bearer {token}",
    "Content-Type": "audio/wav; codecs=audio/pcm; samplerate=16000",
    "Accept": "application/json"
}

Parâmetros de Consulta

ParâmetroObrigatórioValoresDescrição
`language`**Sim**`pt-BR`, `de-DE`, etc.Idioma da fala
`format`Não`simple`, `detailed`Formato do resultado (padrão: simple)
`profanity`Não`masked`, `removed`, `raw`Tratamento de palavrões (padrão: masked)

Valores de Status de Reconhecimento

StatusDescrição
`Success`Reconhecimento bem-sucedido
`NoMatch`Fala detectada, mas nenhuma palavra correspondeu
`InitialSilenceTimeout`Apenas silêncio detectado
`BabbleTimeout`Apenas ruído detectado
`Error`Erro interno do serviço

Tratamento de Palavrões

# Máscara de palavrões com asteriscos (padrão)
params = {"language": "pt-BR", "profanity": "masked"}

# Remove palavrões completamente
params = {"language": "pt-BR", "profanity": "removed"}

# Inclui palavrões como estão
params = {"language": "pt-BR", "profanity": "raw"}

Tratamento de Erros

import requests

def transcrever_com_tratamento_erro(caminho_audio: str, idioma: str = "pt-BR") -> dict | None:
    """Transcreve com tratamento de erro adequado."""
    regiao = os.environ["AZURE_SPEECH_REGION"]
    chave_api = os.environ["AZURE_SPEECH_KEY"]

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

    try:
        with open(caminho_audio, "rb") as arquivo_audio:
            response = requests.post(
                url,
                headers={
                    "Ocp-Apim-Subscription-Key": chave_api,
                    "Content-Type": "audio/wav; codecs=audio/pcm; samplerate=16000",
                    "Accept": "application/json"
                },
                params={"language": idioma, "format": "detailed"},
                data=arquivo_audio
            )

        if response.status_code == 200:
            resultado = response.json()
            if resultado.get("RecognitionStatus") == "Success":
                return resultado
            else:
                print(f"Reconhecimento falhou: {resultado.get('RecognitionStatus')}")
                return None
        elif response.status_code == 400:
            print(f"Solicitação inválida: Verifique o código do idioma ou o formato do áudio")
        elif response.status_code == 401:
            print(f"Não autorizado: Verifique a chave da API ou o token")
        elif response.status_code == 403:
            print(f"Proibido: Cabeçalho de autorização ausente")
        else:
            print(f"Erro {response.status_code}: {response.text}")

        return None

    except requests.exceptions.RequestException as e:
        print(f"Solicitação falhou: {e}")
        return None

Versão Assíncrona

import os
import aiohttp
import asyncio

async def transcrever_async(caminho_arquivo_audio: str, idioma: str = "pt-BR") -> dict:
    """Versão assíncrona usando aiohttp."""
    regiao = os.environ["AZURE_SPEECH_REGION"]
    chave_api = os.environ["AZURE_SPEECH_KEY"]

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

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

    params = {"language": idioma, "format": "detailed"}

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

        async with session.post(url, headers=headers, params=params, data=dados_audio) as response:
            response.raise_for_status()
            return await response.json()

# Uso
resultado = asyncio.run(transcrever_async("audio.wav", "pt-BR"))
print(resultado["DisplayText"])

Idiomas Suportados

Códigos de idioma comuns (veja a lista completa):

CódigoIdioma
`pt-BR`Português (Brasil)
`pt-PT`Português (Portugal)
`en-US`Inglês (EUA)
`en-GB`Inglês (Reino Unido)
`de-DE`Alemão
`fr-FR`Francês
`es-ES`Espanhol (Espanha)
`es-MX`Espanhol (México)
`zh-CN`Chinês (Mandarim)
`ja-JP`Japonês
`ko-KR`Coreano

Melhores Práticas

  1. Escolha síncrono OU assíncrono e mantenha a consistência. Não misture clientes síncronos azure.xxx com clientes assíncronos azure.xxx.aio no mesmo caminho de chamada. Escolha um modo por módulo.
  2. Sempre use gerenciadores de contexto para clientes. Use with httpx.Client(...) as client: (síncrono) ou async with httpx.AsyncClient(...) as client: (assíncrono) para que as conexões sejam agrupadas e fechadas de forma determinística.
  3. Use WAV PCM 16kHz mono para melhor compatibilidade
  4. Ative a transferência em blocos para menor latência
  5. Armazene em cache os tokens de acesso por 9 minutos (válido por 10)
  6. Especifique o idioma correto para reconhecimento preciso
  7. Use o formato detalhado quando precisar de pontuações de confiança
  8. Trate todos os valores de RecognitionStatus no código de produção

Quando NÃO Usar Esta API

Use o SDK de Fala ou a API de Transcrição em Lote em vez disso quando você precisar:

  • Áudio com mais de 60 segundos
  • Transcrição em streaming em tempo real
  • Resultados parciais/interinos
  • Tradução de fala
  • Modelos de fala personalizados
  • Transcrição em lote de muitos arquivos

Arquivos de Referência

ArquivoConteúdo
references/pronunciation-assessment.mdParâmetros e pontuação de avaliação de pronúncia
Ver no 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 |

Todos os arquivos

0 arquivos

Instalar azure-speech-to-text-rest-py

Baixe e extraia os arquivos de habilidade para o diretório .claude/skills/.

Baixar ZIP

Clone o repositório e copie os arquivos da habilidade para o seu projeto.

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

Copiar Copiar
Configuração rápida: Copie a pasta de habilidades para .claude/skills/ O Claude detectará e usará automaticamente a habilidade
Repositório microsoft/skills

Habilidades relacionadas

web-search
Tempo atualizado 29 de Junho de 2026
webapp-testing
Tempo atualizado 29 de Junho de 2026
lark-base
Tempo atualizado 5 de Julho de 2026
agentmail
Tempo atualizado 29 de Junho de 2026
OR