azure-speech-to-text-rest-py
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 tudoAPI 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
- Assinatura do Azure - Crie uma gratuitamente
- Recurso de Fala - Crie no Portal do Azure
- 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
| Formato | Codec | Taxa de Amostragem | Observações |
|---|---|---|---|
| WAV | PCM | 16 kHz, mono | **Recomendado** |
| OGG | OPUS | 16 kHz, mono | Tamanho 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âmetro | Obrigatório | Valores | Descriçã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
| Status | Descriçã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ódigo | Idioma |
|---|---|
| `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
- Escolha síncrono OU assíncrono e mantenha a consistência. Não misture clientes síncronos
azure.xxxcom clientes assíncronosazure.xxx.aiono mesmo caminho de chamada. Escolha um modo por módulo. - Sempre use gerenciadores de contexto para clientes. Use
with httpx.Client(...) as client:(síncrono) ouasync with httpx.AsyncClient(...) as client:(assíncrono) para que as conexões sejam agrupadas e fechadas de forma determinística. - Use WAV PCM 16kHz mono para melhor compatibilidade
- Ative a transferência em blocos para menor latência
- Armazene em cache os tokens de acesso por 9 minutos (válido por 10)
- Especifique o idioma correto para reconhecimento preciso
- Use o formato detalhado quando precisar de pontuações de confiança
- 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
| Arquivo | Conteúdo |
|---|---|
| references/pronunciation-assessment.md | Parâmetros e pontuação de avaliação de pronúncia |
---
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 arquivosInstalar azure-speech-to-text-rest-py
Baixe e extraia os arquivos de habilidade para o diretório .claude/skills/.
Baixar ZIPClone 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





Lar
