
News Observation Lab for Future
ローカルで動作する地域言語字幕ツール「Saaz」の開発とハックトーバーフェスト挑戦

概要
地域言語ビデオ向けに字幕を自動生成するツール「Saaz」を構築しました。クリップをアップロードすると、指定されたヒンディー語の字幕と英語への翻訳が取得でき、ブラウザ上で編集後に .srt または .vtt としてエクスポートできます。
主な機能と目的
本ツールは、クライアント Raashi が未公開映像にキャプションを付与する際に、外部ホスティングサービスへ映像を送信せずに済むよう設計されています。すべての処理はユーザーのマシン上で完結し、オフラインでも動作を確認できる npm runprove:offline コマンドを提供しています。
技術的特徴
パイプラインは probe → decode → Whisper ASR → Silero VAD → align → segment → glossary → OPUS‑MT → Fit の順に実行され、4 つの主要コンポーネントは onnxruntime‑node 上の transformers.js 経由で統合されています。量子化レベル q8 により CPU の RAM に収まり、GPU 不要で動作します。
フロントエンドは TypeScript、React、shadcn/ui、Tailwind v4、Vite を採用し、ジョブ管理に SQLite、単体テストに Vitess を利用しています。Docker イメージからデプロイし、ビルド時に重みを埋め込むことで外部 API(例:Hugging Face)への依存を排除しています。
モデル選定と課題
Whisper‑base はヒンディー語音声に対しアラビア文字スクリプトを出力し、CER は 1.00 でした。一方 Whisper‑small のスコアは 0.165 で比較的良好です。Whisper‑large‑v3‑turbo は q8 量子化時に空文字を返すため除外しました。
Qwen2.5‑0.5B と 1.5B はキャプションタスクで JSON 出力が失敗し、SmolLM2‑360M が有効な JSON を返し 2.5 倍速く動作しました。モデルが小さいほど精度が向上する傾向が見られました。
Whisper のエクスポートには単語タイムスタンプが欠如しており、3 秒ごとの均一ブロックに崩壊していました。これを Silero VAD で補正し、正確な区間分割を実現しています。
Open MT の語彙ギャップにより「मालाई」が誤訳される問題があり、ユーザー定義の用語集で事前に置換する仕組みを導入しました。
フィットステージと出力方針
字幕の文字数制限に合わせて 逐語的、リフロー、延長、分割、拒否 の 5 段階で調整し、最終的にクライアントがサインオフできる形で出力します。ツールは「どこを人が手直しすべきか」を明示し、全自動出力よりも価値の高いフィードバックを提供します。
制限と今後の展望
地域言語向け Whisper の認識精度は限定的で、単語タイミングは比例配置で近似しています。また CPU 推論はリアルタイムの約 4 倍速度となり、ラップトップに映像を保存することのトレードオフがあります。今後はモデル改良とタイミング精度の向上を目指します。
オープンイノベーションの意義
閉鎖的な API では本プロジェクトは実現不可能でした。オープンソースの重量モデルを活用することで、データが常にローカルに残り、ネットワーク未接続環境でも処理が保証されます。また、モデルの差し替えやライセンス確認が容易で、透明性と信頼性が確保されています。
受賞部門
本取り組みは Hacktoberfest Weekend Challenge の賞品部門にエントリーされています。
元記事: https://dev.to/virtualord/hacktoberfest-weekend-challenge-build-for-a-friend-411m