mcpField
A
azure-speech-to-text-rest-py

azure-speech-to-text-rest-py

github.com/sickn33クリエイティブ・メディア48.7k58 回インストール今日更新
リポジトリ

azure-speech-to-text-rest-py について

SDK を使わずに Azure Speech to Text REST API で短い音声を文字起こしする開発者向けのガイドです。最大 60 秒の音声、チャンク転送、シンプルまたは詳細な結果形式を扱います。

主な機能

  1. 01REST API による短い音声の文字起こし
  2. 02最大 60 秒の音声に対応
  3. 03WAV PCM と OGG OPUS に対応
  4. 04シンプルおよび詳細な結果形式
  5. 05チャンク転送と非同期リクエスト
  6. 06言語と不適切表現の処理方法を指定

活用シーン

  1. 01短い音声録音の文字起こし
  2. 02詳細結果から信頼度情報を取得
  3. 03遅延を抑えるため音声を分割して送信

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/sickn33/agentic-awesome-skills --skill azure-speech-to-text-rest-py

インストール後、Claude Code で/azure-speech-to-text-rest-pyを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

UPSTREAM-LICENSE.txt
UPSTREAM-NOTICE.md
references/
pronunciation-assessment.md

詳細

同梱されているアップストリームのサポートファイル

サポートファイルはスキルからの相対パスに含まれています。固定されたソース、ライセンス、ハッシュ、インポート時の変更については、UPSTREAM-NOTICE.md を参照してください。

Azure Speech to Text REST API(短い音声向け)

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

前提条件

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

環境変数

# 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

インストール

pip install requests

クイックスタート

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, timeout=(10, 90))
    
    response.raise_for_status()
    return response.json()

# Usage
result = transcribe_audio("audio.wav", "en-US")
if result.get("RecognitionStatus") == "Success" and result.get("NBest"):
    print(result["NBest"][0].get("Display", ""))
else:
    print("No successful detailed recognition result")

音声の要件

形式コーデックサンプルレート備考
WAVPCM16 kHz、モノラル推奨
OGGOPUS16 kHz、モノラルファイルサイズが小さくなります

制限事項:

  • 音声は最大 60 秒です
  • 発音評価の場合は最大 30 秒です
  • 部分結果/途中結果はなく、最終結果のみです

Content-Type ヘッダー

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

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

応答形式

シンプル形式(デフォルト)
params = {"language": "en-US", "format": "simple"}
{
  "RecognitionStatus": "Success",
  "DisplayText": "Remind me to buy 5 pencils.",
  "Offset": "1236645672289",
  "Duration": "1236645672289"
}
詳細形式
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"
    }
  ]
}

チャンク転送(推奨)

レイテンシを抑えるには、音声をチャンクに分けてストリーミングします。

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),
        timeout=(10, 90)
    )
    
    response.raise_for_status()
    return response.json()

認証方法

方法 1:サブスクリプションキー(シンプル)
headers = {
    "Ocp-Apim-Subscription-Key": os.environ["AZURE_SPEECH_KEY"]
}
方法 2:ベアラートークン
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"
        },
        timeout=(10, 30)
    )
    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"
}

クエリパラメーター

パラメーター必須値説明
languageはいen-US、de-DE など音声の言語
formatいいえsimple、detailed結果の形式(デフォルト:simple)
profanityいいえmasked、removed、raw侮辱的な表現の処理(デフォルト:masked)

認識ステータスの値

ステータス説明
Success認識に成功しました
NoMatch音声は検出されましたが、一致する単語がありませんでした
InitialSilenceTimeout無音のみが検出されました
BabbleTimeoutノイズのみが検出されました
Errorサービス内部エラー

侮辱的な表現の処理

# 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"}

エラー処理

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,
                timeout=(10, 90)
            )
        
        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("Forbidden: Check resource permissions, endpoint and service policy")
        else:
            print(f"Error {response.status_code}; response body withheld")
        
        return None
        
    except requests.exceptions.RequestException as e:
        print(f"Request failed: {e}")
        return None

非同期バージョン

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(timeout=aiohttp.ClientTimeout(total=90)) 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"))
if result.get("RecognitionStatus") == "Success" and result.get("NBest"):
    print(result["NBest"][0].get("Display", ""))
else:
    print("No successful detailed recognition result")

対応言語

主な言語コードについては、全一覧を参照してください。

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

ベストプラクティス

  1. 互換性を高めるには、WAV PCM 16kHz モノラルを使用します
  2. レイテンシを抑えるには、チャンク転送を有効にします
  3. アクセストークンは 9 分間キャッシュします(有効期間は 10 分です)
  4. 正確に認識させるには、正しい言語を指定します
  5. 信頼度スコアが必要な場合は、詳細形式を使用します
  6. 運用コードでは、すべての RecognitionStatus の値を処理します

この API を使用しない場合

次の用途には、代わりに Speech SDK または Batch Transcription API を使用してください。

  • 60 秒を超える音声
  • リアルタイムのストリーミング文字起こし
  • 部分結果/途中結果
  • 音声翻訳
  • カスタム音声モデル
  • 多数のファイルの一括文字起こし

参考ファイル

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

使用する場面

このスキルは、概要で説明されているワークフローやアクションを実行する際に適用できます。

制限事項

  • 上記で説明した範囲にタスクが明確に該当する場合にのみ、このスキルを使用してください。
  • 出力を、環境固有の検証、テスト、専門家によるレビューの代わりとして扱わないでください。
  • 必要な入力、権限、安全上の境界、または成功基準が不足している場合は、処理を中断して確認してください。

例では、音声と参照テキストを Azure に送信します。データ転送と保持の正確な範囲を確認し、デフォルトでは合成音声を使用してください。認証情報を添付する前に、設定されたリージョンまたはリソースのエンドポイントが、実際に承認された Azure リソースと一致することを解決・検証してください。信頼できない入力から任意のホスト名を受け入れてはいけません。長さ、形式、サイズをローカルで確認し、リクエスト数に上限を設け、キーや文字起こし結果をログに残さないでください。詳細な認識結果には NBest[].Display を使用し、インデックス参照の前に Success と結果が空でないことを確認してください。発音や韻律のスコアはモデルによる推定値であり、臨床的または客観的な話者品質の評価ではありません。ロケールと API の対応状況は異なります。公式の短時間音声 APIを参照してください。

コメント