字幕翻訳のコストが想定の10倍近くかかっていた。
PiloTubeは日本語YouTube動画の字幕を英語・中国語・スペイン語など複数言語に自動翻訳する機能を持つ。動画1本あたり数百〜数千のSRTブロックを翻訳するため、APIコストは積み上がりやすい。
最初はOpenAI GPT-4oを使っていた。翻訳品質は高い。しかし月の請求が予算を大きく超えてきたとき、「他のエンジンに乗り換えられないか」を真剣に検討し始めた。
なぜGPT-4oを使っていたか
最初の理由はシンプルだった。「品質が高い」「日本語の扱いが得意」という評判と、開発初期に手元で試した感触が良かったからだ。
ただし選定時に見落としていたことがある。字幕翻訳の用途では、モデルの「賢さ」よりも「SRT形式の保持能力」と「コスト効率」の方が重要だということだ。
字幕翻訳は創造的な文章生成ではない。タイムコードを変えずにテキストだけを翻訳し、42文字制限(YouTube推奨)を守り、話し言葉のニュアンスを保持する——それができれば十分だ。GPT-4oのような高性能モデルは、この用途にはオーバースペックだった。
3エンジンを実測比較した
乗り換えを決める前に、3つのエンジンを同じ条件で比較検証した。
| エンジン | モデル | |---------|-------| | OpenAI | gpt-4.1-nano | | Anthropic | Claude Haiku 4.5 | | Google | Gemini 2.5 Flash-Lite |
検証には専用のPythonスクリプトを書いた。SRTブロック5件(短サンプル)と15件(中サンプル)の2種類で各エンジンを呼び出し、応答時間・トークン数・翻訳品質を自動評価する仕組みだ。
品質評価の軸は4つ:
- タイムコード保持 —
00:00:03,500 --> 00:00:07,200形式が1文字も変わっていないか - SRT番号保持 — ブロック番号の連番が維持されているか
- ブロック数一致 — 原文と同じ数のブロックが出力されているか
- 42文字制限 — 各テキスト行が42文字以内に収まっているか
実測結果
応答時間
| エンジン | 短サンプル | 中サンプル | |---------|-----------|-----------| | OpenAI gpt-4.1-nano | 約2.1秒 | 約4.3秒 | | Claude Haiku 4.5 | 約1.8秒 | 約3.9秒 | | Gemini 2.5 Flash-Lite | 約1.4秒 | 約2.8秒 |
Geminiが最速だった。Flash-Liteは軽量モデルだが応答速度の優位性は明確だ。
SRT形式保持
3エンジンとも、タイムコード・ブロック番号・ブロック数の保持は概ね良好だった。ただし傾向に差があった。
- OpenAI: 安定しているが、まれにタイムコードの末尾スペースが変わる
- Claude Haiku: 最も保守的で安定。SRT形式を崩すことがほぼない
- Gemini: 若干のマークダウン記法混入(バッククォートなど)が見られたが、プロンプト調整で解消した
コスト比較
入出力トークンの価格は各社の公表レートで試算した(2026年4月時点の概算)。
| エンジン | 相対コスト | |---------|-----------| | OpenAI gpt-4.1-nano | 1.0(基準) | | Claude Haiku 4.5 | 約0.8 | | Gemini 2.5 Flash-Lite | 約0.1 |
Gemini 2.5 Flash-Liteは基準の約10分の1というコスト水準だった。同じ品質を出せるなら、これ以上の答えはない。
移行時に直面した問題
問題1: マークダウン記法の混入
Geminiは出力にバッククォートやアスタリスクを混ぜてくることがある。SRT形式の翻訳では不要どころか有害だ。
対処: システムプロンプトに「マークダウン記法は一切使わない」を明示した。
ルール:
- マークダウン記法(バッククォート、アスタリスク等)は使わない
- 入力と同じSRT形式のみで出力する
この1行を追加するだけで問題は解消した。
問題2: 42文字制限の超過
Geminiは英訳の際に日本語より長い文を生成しやすい。キャンプ系のカジュアルな語尾(「じゃあ早速〜」「めっちゃ広い」など)を英語に訳すと、冗長な文になりがちだ。
対処: プロンプトで「YouTube字幕の専門翻訳者」という役割を明示し、「1行42文字以内」を制約として強調した。完全には解消しないが、超過件数は許容範囲内に収まった。
あなたはYouTube字幕の専門翻訳者です。
1行42文字以内に収める(YouTube推奨)
問題3: API構造の差異
OpenAIとGeminiではAPIのリクエスト・レスポンス構造が異なる。
# OpenAI
response["choices"][0]["message"]["content"]
# Gemini
response["candidates"][0]["content"]["parts"][0]["text"]
また、Geminiはシステムプロンプトとユーザープロンプトを分離できない(v1beta時点)。contentsのpartsにまとめて渡す形式になる。
body = {
"contents": [{
"parts": [{"text": f"{system_prompt}\n\n{user_prompt}"}]
}],
"generationConfig": {"temperature": 0.3},
}
抽象化レイヤーを設けずに直接書き換えたため、この変更自体は30分程度で完了した。
移行後の品質
実際の動画字幕(日本語キャンプ動画、約200ブロック)で検証した結果:
- タイムコード保持: 200/200ブロック (100%)
- 翻訳の自然さ: 視聴者からのフィードバックで品質低下の報告なし
- 42文字超過: 全体の約3%(GPT-4o時代は約5%だったので改善)
品質を落とさずにコストを約90%削減できた。
学んだこと
用途に合ったモデルを選ぶという当たり前のことを、後回しにしていた。
GPT-4oは「何でもできる高性能モデル」だ。しかしそれは裏返すと「用途特化モデルより高コスト」でもある。字幕翻訳のように制約が明確でルール遵守が重要なタスクでは、安価で高速な軽量モデルの方が合っていることがある。
検証を先にやれば良かった、とは思う。ただ、最初はトラフィックが少なくコストが問題にならなかった。問題が顕在化してから動いても遅くはない——それがスタートアップの現実的な判断だと思っている。
次の検討課題は、言語ごとのエンジン最適化だ。英語翻訳と中国語翻訳でベストなモデルが異なる可能性がある。データが溜まったら再検証する予定だ。