WhisperのAPIコストを格段に下げる方法
WhisperのAPIコストを格段に下げる方法 — Cloudflare Workers AI活用ガイド
Whisperはローカル環境で実行すれば費用はかかりませんが、GPUなどのハードウェアが必要なため、処理速度や運用コストの面で課題があります。そこで今回は、OpenAIの公式APIを利用した場合の $0.006 / minute (rounded to the nearest second) というコストに対し、Cloudflare Workers AIを利用することで $0.0005 per audio minute (1日あたり約4時間分の無料枠あり) という低コストで運用する方法をご紹介します。さらに、プロジェクトのコード構造とその解説も行い、実際にどのように実装されているかを詳しく見ていきます。
背景 — API利用コストの比較
この違いにより、特に大規模な音声処理を行うシーンでは、Cloudflare Workers AIを活用するメリットが大きくなります。
プロジェクト概要
今回紹介するプロジェクト openai-workers-ai は、Cloudflare Workers AI上でWhisperモデルを利用した音声トランスクリプションAPIを提供するものです。
主な特徴は以下の通りです。
- OpenAI互換API: OpenAIのエンドポイントに合わせた設計で、既存の公式クライアントを利用可能
- Honoフレームワーク採用: 軽量なWebフレームワークであるHonoを用いて、シンプルかつ高速なAPI実装を実現
-
Swagger UIによるドキュメント:
/docsエンドポイントから自動生成されたAPIドキュメントを確認可能 -
複数のWhisperモデルに対応:
@cf/openai/whisper@cf/openai/whisper-tiny-en@cf/openai/whisper-large-v3-turbo
コードの解説
本プロジェクトは、シンプルながらも堅牢なAPI実装を実現するために、TypeScript、Hono、そしてZodを利用しています。以下、主要なファイルの解説を行います。
src/index.ts — アプリケーションのエントリーポイント
このファイルでは、APIの全体的な設定やルーティングが定義されています。
-
ライブラリのインポート:
hono/logger、@hono/zod-openapi、@hono/swagger-uiなどのライブラリを用いて、ログ出力、OpenAPI仕様の自動生成、Swagger UIの提供を行っています。 -
OpenAPIHonoのインスタンス生成:
const app = new OpenAPIHono<{ Bindings: CloudflareBindings }>();この行で、Cloudflare Workersの環境変数(ここでは
AIバインディング)を利用可能にしつつ、OpenAPI対応のHonoアプリケーションを作成しています。 -
ミドルウェアの適用:
app.use(logger());ログミドルウェアを適用することで、各リクエストの詳細をログとして記録します。
-
OpenAPIドキュメントとSwagger UIの設定:
app.doc("openapi.json", { ... }); app.get("/docs", swaggerUI({ url: "/openapi.json" }));/openapi.jsonでAPI仕様のJSONを出力し、/docsでSwagger UIを通してドキュメントを閲覧できるようにしています。 -
ルーティング:
app.get("/", (c) => { return c.text("Hello Hono!"); }); app.route("/v1/audio", v1Audio);ルートエンドポイントで簡単な挨拶を返し、音声関連の処理は
/v1/audioにルーティングしています。v1Audioは別ファイルで定義され、音声トランスクリプションのエンドポイントが実装されています。
src/v1/audio.ts — 音声トランスクリプションエンドポイント
このファイルでは、音声ファイルのトランスクリプションを行うためのエンドポイントが実装されています。ポイントは以下の通りです。
-
リクエストバリデーション:
Zodを使用して、multipart/form-dataで送信されるリクエストのバリデーションを行っています。schema: z.object({ file: z.custom<File>(), model: z.union([ z.literal("@cf/openai/whisper"), z.literal("@cf/openai/whisper-tiny-en"), z.literal("@cf/openai/whisper-large-v3-turbo"), ]), // その他のオプションパラメータ... })これにより、受信データが正しい形式であるかを厳密にチェックし、開発者が安心して利用できるAPIを実現しています。
-
モデルごとの処理分岐:
リクエストで指定されたmodelに応じて、Cloudflare Workers AIのrunメソッドを呼び出しています。const response = await c.env.AI.run(model, { audio: [...new Uint8Array(arrayBuffer)] });ここでは、音声ファイルをバイト配列に変換してAIランタイムへ渡すことで、指定されたWhisperモデルによるトランスクリプションを実施しています。
-
レスポンス形式の対応:
現在、json形式のみ実装されており、その他の形式(text、srt、verbose_json、vtt)は「Not implemented」としてエラーを返す設計です。これは、今後の拡張に向けた柔軟な実装となっています。例:
switch (response_format) { case "json": return c.json({ text: response.text }); default: throw new HTTPException(500, { message: "Not implemented" }); } -
コード全体の構造:
ファイル全体がOpenAPI仕様に基づいてドキュメント化されており、createRouteを利用することで、APIのエンドポイント、リクエストパラメータ、レスポンス形式を自動的に生成しています。これにより、API利用者はSwagger UIなどを通じて仕様を簡単に確認することができます。
使い方
-
リポジトリをクローン
git clone https://github.com/Lqm1/openai-workers-ai.git cd openai-workers-ai npm install -
ローカルでの動作確認
npm run devローカルサーバーが起動し、APIエンドポイントやSwagger UIで仕様を確認できます。
-
Cloudflare Workersへのデプロイ
npm run deployまたは、README上部の「Deploy to Cloudflare Workers」ボタンから直接デプロイが可能です。
-
公式クライアントの利用
デプロイが完了したら、OpenAI公式クライアントの
base_urlをデプロイしたWorkersのURLに置き換えるだけで、従来のAPIと同じ感覚で利用できます。
実装のポイントと今後の展望
今回のプロジェクトは、以下の点に重点を置いて開発されています。
- Cloudflare Workersとの連携: サーバーレスのメリットを活かし、低遅延かつスケーラブルなAPIを実現
- 型安全性とバリデーション: TypeScriptとZodを用いることで、堅牢な実装を心がけています
- OpenAPI対応: OpenAPI仕様に基づいたドキュメントを自動生成し、開発者が利用しやすい設計に
なお、一部のレスポンス形式(text、srt、verbose_json、vttなど)は現時点では未実装となっています。今後のアップデートや改善の際に、さらなる機能拡充を予定しており、アイデアやコードの改善、バグ修正などの貢献を大歓迎です。
おわりに
WhisperのAPI利用におけるコスト削減は、特に大規模な音声処理やコスト意識の高いプロジェクトにとって大きなメリットがあります。
Cloudflare Workers AIを活用することで、低コストかつスケーラブルな環境でWhisperのトランスクリプションを実現できる点に注目していただければ幸いです。
今回の解説で、コードの設計思想や実装方法についてもご理解いただけたかと思います。ぜひ、openai-workers-ai をチェックし、あなたのプロジェクトに活かしてください。
また、未実装部分や改善案など、どんな小さなアイデアでも構いませんので、積極的な Contributing をお待ちしています!
Discussion