オプション
家 Skill データサイエンスと機械学習 azure-speech-to-text-rest-py

azure-speech-to-text-rest-py

microsoft/skills microsoft/skills

Azure Speech-to-Text REST API を Python で使用して、最大 60 秒の短い音声ファイルをトランスクリプトします。Speech SDK を必要としません。

...すべて拡張します
0
更新された時間 2026年9月15日

Azure Speech to Text REST API for Short Audio

短い音声ファイル(最大60秒)の音声からテキストへの変換のためのシンプルなREST API。SDKは不要で、HTTPリクエストのみで使用できます。

Prerequisites

  1. Azureサブスクリプション - 無料のものを作成
  2. Speechリソース - Azureポータルで作成
  3. 認証情報の取得 - デプロイ後、リソース > キーとエンドポイントに移動

Environment Variables

# 必須
AZURE_SPEECH_KEY=<your-speech-resource-key>
AZURE_SPEECH_REGION=<region>  # 例: eastus, westus2, westeurope

# 代替: エンドポイントを直接使用
AZURE_SPEECH_ENDPOINT=https://<region>.stt.speech.microsoft.com
</region></region></your-speech-resource-key>

Installation

pip install requests

Quick Start

import os
import requests

def transcribe_audio(audio_file_path: str, language: str = "en-US") -> dict:
    """REST APIを使用して短い音声ファイル(最大60秒)を変換します。"""
    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"  # または "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()

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

Audio Requirements

フォーマットコーデックサンプリングレート備考
WAVPCM16 kHz、モノラル**推奨**
OGGOPUS16 kHz、モノラルファイルサイズが小さい

制限事項:

  • 音声の最大長は60秒
  • 発音評価の場合:最大30秒
  • 部分的/中間結果なし(最終結果のみ)

Content-Type Headers

# 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)

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)

低レイテンシを実現するために、音声をチャンク単位でストリーミングします:

import os
import requests

def transcribe_chunked(audio_file_path: str, language: str = "en-US") -> dict:
    """低レイテンシのためにチャンク単位で音声をストリーミングします。"""
    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:
    """トークンエンドポイントからアクセストークンを取得します。"""
    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

# リクエストでトークンを使用(10分間有効)
token = get_access_token()
headers = {
    "Authorization": f"Bearer {token}",
    "Content-Type": "audio/wav; codecs=audio/pcm; samplerate=16000",
    "Accept": "application/json"
}

Query Parameters

  • 結果のフォーマット(デフォルト: simple)
  • パラメータ必須説明
    `language`**はい**`en-US`, `de-DE` など音声の言語
    `format`いいえ`simple`, `detailed`
    `profanity`いいえ`masked`, `removed`, `raw`不適切な言葉の処理(デフォルト: masked)

    Recognition Status Values

    ステータス説明
    `Success`認識に成功
    `NoMatch`音声は検出されたが、単語が一致しなかった
    `InitialSilenceTimeout`無音のみ検出
    `BabbleTimeout`ノイズのみ検出
    `Error`内部サービスエラー

    Profanity Handling

    # 不適切な言葉をアスタリスクでマスク(デフォルト)
    params = {"language": "en-US", "profanity": "masked"}
    
    # 不適切な言葉を完全に削除
    params = {"language": "en-US", "profanity": "removed"}
    
    # 不適切な言葉をそのまま含める
    params = {"language": "en-US", "profanity": "raw"}
    

    Error Handling

    import requests
    
    def transcribe_with_error_handling(audio_path: str, language: str = "en-US") -> dict | None:
        """適切なエラー処理で変換します。"""
        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"認識に失敗しました: {result.get('RecognitionStatus')}")
                    return None
            elif response.status_code == 400:
                print(f"不正なリクエスト: 言語コードまたは音声フォーマットを確認してください")
            elif response.status_code == 401:
                print(f"認証エラー: APIキーまたはトークンを確認してください")
            elif response.status_code == 403:
                print(f"アクセス拒否: 認証ヘッダーが不足しています")
            else:
                print(f"エラー {response.status_code}: {response.text}")
    
            return None
    
        except requests.exceptions.RequestException as e:
            print(f"リクエストに失敗しました: {e}")
            return None
    

    Async Version

    import os
    import aiohttp
    import asyncio
    
    async def transcribe_async(audio_file_path: str, language: str = "en-US") -> dict:
        """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()
    
    # 使用例
    result = asyncio.run(transcribe_async("audio.wav", "en-US"))
    print(result["DisplayText"])
    

    Supported Languages

    一般的な言語コード(完全なリスト参照):

    コード言語
    `en-US`英語(米国)
    `en-GB`英語(英国)
    `de-DE`ドイツ語
    `fr-FR`フランス語
    `es-ES`スペイン語(スペイン)
    `es-MX`スペイン語(メキシコ)
    `zh-CN`中国語(標準語)
    `ja-JP`日本語
    `ko-KR`韓国語
    `pt-BR`ポルトガル語(ブラジル)

    Best Practices

    1. 同期または非同期のいずれかを選択し、一貫性を保つ。 同じ呼び出しパスで azure.xxx 同期クライアントと azure.xxx.aio 非同期クライアントを混在させないこと。モジュールごとに1つのモードを選択する。
    2. 常にクライアントにコンテキストマネージャーを使用する。 with httpx.Client(...) as client:(同期)または async with httpx.AsyncClient(...) as client:(非同期)を使用して、接続がプールされ、確定的に閉じられるようにする。
    3. 最高の互換性のためにWAV PCM 16kHzモノラルを使用する
    4. 低レイテンシのためにチャンク転送を有効にする
    5. 9分間アクセストークンをキャッシュする(有効期限は10分)
    6. 正確な認識のために正しい言語を指定する
    7. 信頼度スコアが必要な場合は詳細フォーマットを使用する
    8. 本番コードですべてのRecognitionStatus値を処理する

    When NOT to Use This API

    以下の必要がある場合は、Speech SDKまたはバッチ変換APIを使用すること:

    • 60秒を超える音声
    • リアルタイムストリーミング変換
    • 部分的/中間結果
    • 音声翻訳
    • カスタム音声モデル
    • 多数のファイルのバッチ変換

    Reference Files

    ファイル内容
    references/pronunciation-assessment.md発音評価のパラメータとスコアリング
    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 |
    

    すべてのファイル

    0件のファイル

    azure-speech-to-text-rest-pyをインストール

    スキルファイルをダウンロードして .claude/skills/ ディレクトリに展開してください。

    ZIPをダウンロード

    リポジトリをクローンし、スキルファイルをプロジェクトにコピーしてください。

    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

    コピー コピー
    クイックセットアップ: スキルフォルダを .claude/skills/ にコピーしてください。Claude はそのスキルを自動的に検出し、使用します。
    リポジトリ microsoft/skills

    関連スキル

    web-search
    更新された時間 2026年6月29日
    webapp-testing
    更新された時間 2026年6月29日
    lark-base
    更新された時間 2026年7月5日
    agentmail
    更新された時間 2026年6月29日
    OR