([English](README.md)|[简体中文](README_zh.md)|日本語|[한국어](README_ko.md)) # FunASR OpenAI 互換 API サーバー FunASR OpenAI 互換 API は `/v1/audio/transcriptions` を提供します。OpenAI スタイルの SDK、エージェントフレームワーク、Dify、n8n、HTTP ノード、社内システムから、プライベートな音声認識サービスとして利用できます。 ## クイックスタート ```bash pip install funasr fastapi uvicorn python-multipart python server.py --model sensevoice --device cuda --port 8000 ``` モデルのロード後にサービスが起動します。ヘルスチェックは `GET /health` です。 コピーして使える連携例が必要な場合は、[クライアントレシピ](CLIENTS.md)、[JavaScript/TypeScript レシピ](JAVASCRIPT.md)、[Gradio ブラウザデモ](GRADIO.md)、[ワークフローレシピ](WORKFLOWS.md)、[Postman コレクション](POSTMAN.md)、[OpenAPI 仕様](OPENAPI.md)、[セキュリティとゲートウェイガイド](SECURITY.md)、[Kubernetes デプロイテンプレート](kubernetes/README.md)を参照してください。 ### エンドツーエンド smoke test 別のターミナルで実行します。 ```bash bash smoke_test.sh # curl/bash を使わないクロスプラットフォーム版: python smoke_test.py ``` 同等の手動コマンド: ```bash curl -L https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/test_audio/BAC009S0764W0121.wav -o sample.wav curl http://localhost:8000/health curl http://localhost:8000/v1/audio/transcriptions \ -F file=@sample.wav \ -F model=sensevoice \ -F response_format=verbose_json ``` ## Gradio ブラウザデモ ローカルブラウザで音声ファイルのアップロードやマイク入力を試したい場合は、先に API サーバーを起動し、オプションの Gradio フロントエンドを起動します。 ```bash pip install gradio python gradio_app.py --base-url http://localhost:8000 ``` このブラウザデモは smoke test と同じ OpenAI 互換 API エンドポイントを呼び出します。Docker、Kubernetes、本番利用の注意点は [Gradio ブラウザデモ](GRADIO.md)を参照してください。 ## OpenAI SDK で使う ```python from openai import OpenAI client = OpenAI(base_url="http://localhost:8000/v1", api_key="not-needed") result = client.audio.transcriptions.create( model="sensevoice", # "paraformer", "paraformer-en", "fun-asr-nano" も利用できます file=open("meeting.wav", "rb"), ) print(result.text) verbose = client.audio.transcriptions.create( model="sensevoice", file=open("meeting.wav", "rb"), response_format="verbose_json", ) print(verbose.segments) ``` ## curl で使う ```bash curl http://localhost:8000/v1/audio/transcriptions \ -F file=@audio.wav \ -F model=sensevoice curl http://localhost:8000/v1/audio/transcriptions \ -F file=@audio.wav \ -F model=sensevoice \ -F response_format=verbose_json ``` ## 利用できるモデル | Model | GPU 速度 | CPU 速度 | 言語 | 特徴 | |---|---|---|---|---| | `sensevoice` | 170x realtime | 17x realtime | zh/en/ja/ko/yue | 感情・イベントタグ | | `paraformer` | 120x realtime | 15x realtime | zh/en | 句読点復元 | | `paraformer-en` | 120x realtime | 15x realtime | en | 英語認識 | | `fun-asr-nano` | 17x realtime | 3.6x realtime | 31 languages | LLM-based、タイムスタンプ | ## API エンドポイント | Endpoint | Method | 説明 | |---|---|---| | `/v1/audio/transcriptions` | POST | OpenAI 互換の音声文字起こし | | `/v1/models` | GET | モデルエイリアスの一覧 | | `/health` | GET | ヘルスチェック、ロード済みモデル、利用可能モデル | | `/docs` | GET | FastAPI Swagger ドキュメント | コードを書かずに確認したい場合は、[Gradio ブラウザデモ](GRADIO.md)でローカルアップロードやマイク入力を試すか、[Postman コレクション](POSTMAN.md)をインポートしてください。API ゲートウェイ、開発者ポータル、社内クライアント生成には [OpenAPI 仕様](OPENAPI.md)を利用できます。 ## エージェントとローコードワークフロー **LangChain**、**LlamaIndex**、**AutoGen**、**CrewAI**、**Semantic Kernel**、**Dify**、**n8n**、OpenAI audio API または multipart HTTP を使える任意のシステムで利用できます。 - SDK、JavaScript/TypeScript、Agent tool の書き方は [クライアントレシピ](CLIENTS.md) と [JavaScript/TypeScript レシピ](JAVASCRIPT.md)を参照してください。 - Dify、n8n、HTTP ノード、webhook worker は [ワークフローレシピ](WORKFLOWS.md)を参照してください。 - GUI smoke test は [Postman コレクション](POSTMAN.md)を参照してください。 - schema-driven import には [OpenAPI 仕様](OPENAPI.md)を使えます。 ## Docker デプロイ デフォルトのイメージは CPU モードで起動し、再現しやすい smoke test として使えます。 ```bash cd examples/openai_api cp .env.example .env docker compose up --build ``` 同等の `docker run`: ```bash docker build -t funasr-api . docker run --rm -p 8000:8000 \ -e FUNASR_DEVICE=cpu \ -e FUNASR_MODEL=sensevoice \ funasr-api ``` GPU ホストでは NVIDIA Container Toolkit と CUDA 対応の PyTorch/FunASR イメージが必要です。CUDA 依存関係に合わせてイメージを調整した後、次のように起動できます。 ```bash docker run --rm --gpus all -p 8000:8000 \ -e FUNASR_DEVICE=cuda \ -e FUNASR_MODEL=sensevoice \ funasr-api ``` コンテナの検証: ```bash BASE_URL=http://localhost:8000 bash smoke_test.sh python smoke_test.py --base-url http://localhost:8000 ``` ## Kubernetes デプロイ チーム内で共有したりゲートウェイ経由で公開したりする前に、[セキュリティとゲートウェイガイド](SECURITY.md)を確認し、TLS、認証、アップロード制限、レート制限、ログ方針を整えてください。 永続化されたモデルキャッシュ、ヘルスプローブ、プライベート `ClusterIP` を持つ内部クラスタサービスが必要な場合は、[Kubernetes デプロイテンプレート](kubernetes/README.md)から始めてください。サンプルイメージをビルドして push し、manifests を適用した後、`kubectl port-forward` と `python smoke_test.py --base-url http://localhost:8000` で検証します。 CUDA 対応イメージと GPU スケジューリング設定が整うまでは、デフォルトの CPU モードを維持してください。 ## 設定 | 引数 | デフォルト | 説明 | |---|---|---| | `--host` | `0.0.0.0` | バインドアドレス | | `--port` | `8000` | ポート | | `--device` | `cuda` | `cuda`、`cpu`、`mps` | | `--model` | `sensevoice` | 起動時にプリロードするモデル | Docker 環境変数: | Env | デフォルト | 説明 | |---|---|---| | `FUNASR_PORT` | `8000` | `server.py` に渡すコンテナポート | | `FUNASR_DEVICE` | `cpu` | コンテナのデバイスモード。CUDA 対応依存関係を持つイメージでのみ `cuda` に設定してください | | `FUNASR_MODEL` | `sensevoice` | コンテナ起動時にロードするモデルエイリアス | ## トラブルシューティング | 症状 | 対処 | |---|---| | CUDA が利用できない | まず `--device cpu` で smoke test を通します。 | | 8000 ポートが使用中 | `--port 9000` に変更し、`BASE_URL=http://localhost:9000 bash smoke_test.sh` または `python smoke_test.py --base-url http://localhost:9000` を実行します。 | | モデルのダウンロードが遅い | 安定したネットワークで再試行するか、ModelScope/Hugging Face から事前にモデルをダウンロードします。 | | Dify/n8n コンテナから `localhost` に接続できない | ワークフロー実行環境から到達できるホスト名、Compose service name、または Kubernetes service name を使います。 | | 応答に `segments` がない | `response_format=verbose_json` を設定します。 |