Skip to content

Releases: Rimcat-JA/blockvideo

v0.2.2 — v0.2.1 の不具合修正

Choose a tag to compare

@Rimcat-JA Rimcat-JA released this 11 Oct 17:25

v0.2.1 で入った不具合を直した修正版です。機能の追加はありません。v0.2.1 をお使いの方は更新をおすすめします。

修正内容

  • .env の既定値が範囲外だと設定を保存できなくなる問題: v0.2.1 から、新規プロジェクトは .env の VOICEVOX_* / NARRATION_SENTENCE_PAUSE_SECONDS を既定値として使いますが、値の範囲を確かめていませんでした。範囲外の値(例: 話速 9.0)があると、そのプロジェクトでは以後の設定の保存・復元がすべて失敗していました。範囲外の値は使わずに標準の値に戻し、ログに警告を出すようにしました。
  • 画面から作ったプロジェクトに .env の既定値が効かない問題: クイック生成と詳細作成の画面が、話者 1・話速 1.0・文間 1.5 を常に送っていました。触っていない項目は送らないようにし、サーバーの既定値が使われるようにしました。クイック生成では声の高さ・抑揚・音量の .env 値も使います。
  • プロジェクト一覧が止まらずに更新され続ける問題: 一度も生成していないプロジェクトがあると、一覧が 2 秒ごとに更新され続けていました。生成中のプロジェクトがあるときだけ更新します。
  • 設定エディタの「未保存の変更」が消えない問題: 色の選択が小文字、保存される値が大文字で食い違い、保存しても警告が残っていました。
  • ジョブの失敗理由の一部が伏せ字になる問題: API キーを伏せる処理が、"sk-" を含む普通の語や長いパスまで伏せていました。

既知の問題

v0.2.1 のリリースノートに挙げた既知の問題(外部処理の結果が確かめられないとプロジェクトがロックされる、連結した動画で音声が少しずつ遅れる、字幕の位置・背景が焼き込みに反映されない、予備の図描画で内容が欠ける)は引き続き残っています。原因を整理し、影響範囲を確かめてから修正します。

v0.2.1 — 不具合修正

Choose a tag to compare

@Rimcat-JA Rimcat-JA released this 11 Oct 14:01

v0.2.0 の不具合修正版です。コード全体を点検して見つかった不具合のうち、ほかの部分に影響せず単独で直せるものを修正しました。機能の追加はありません。

安全性

  • API キーが別のホストに送られる問題を修正: プロジェクトに LLM・画像の接続先 URL だけを指定し、キーを空欄にすると、サーバーの .env のキーがその URL に送られていました。キーは同じ持ち主の接続先にだけ送るようにしました。
  • IMAGE_BASE_URL が使われていなかった問題を修正: 画像用のキーが常に api.openai.com に送られていました。
  • 作成に失敗したプロジェクトのキーが残る問題を修正: 次に作られたプロジェクトが同じ番号を受け取ると、前のキーを引き継いでいました。
  • docker-compose の API と開発用画面は 127.0.0.1 だけに公開するようにしました(認証のない API を LAN に公開しない)。

動画の生成

  • 字幕の色に red などの色名を指定すると描画が失敗し、black などは黙って白になっていました。#RRGGBB か色名(白・黒・赤・黄色など)で指定でき、それ以外は保存時に拒否します。
  • 保存先のパスにアポストロフィ(')があると、すべての書き出しが失敗していました。
  • SUBTITLE_BAND_HEIGHT や出力サイズが奇数だと、字幕つきのブロックがすべてエンコードに失敗していました(偶数に切り下げます)。
  • ナレーション中の \N \n \h が字幕で改行・空白に化けていました。
  • 字幕サイズ 16〜22px が 24px で組まれていた問題、大きな字幕が画面の左右からはみ出す問題を修正しました(既定の 48px の見た目は変わりません)。
  • スライドの切り替え位置が前後して、長さが 0 以下のスライドができることがありました。
  • 再生成後もブロックの画像・音声のプレビューが古いままでした。
  • ジョブが失敗したとき、原因が例外の名前しか残っていませんでした。利用者向けのエラー(LLM の設定不足、VOICEVOX に接続できない など)は理由を表示します。

VOICEVOX

  • 話者一覧で全話者の ID が 0 になり、詳細作成画面でどの話者を選んでも同じ声になっていました。
  • .env の VOICEVOX_URL などが新規プロジェクトに反映されず、docker-compose では音声の合成が必ず失敗していました。
  • VOICEVOX 以外の URL を指定したときに話者一覧が 500 になっていました(503 で理由を返します)。
  • 恒久的なエラー(4xx)を何度も再試行していました。

言葉で操作する

  • 改行を含む依頼が必ず拒否されていました。
  • モデルが空の読み方リストを提案すると、保存済みの読み方が確認なしで全部消えていました。
  • 「アクセントは0」が値として認識されていませんでした。
  • YOLO モードの長い計画で、処理が「解釈中」のまま止まることがありました。
  • 描画のみの再実行が、古い素材のまま始まって汎用エラーになっていました(再生成が必要なことを伝えます)。
  • 非常に大きな数値で 500 エラーになっていました。

画面

  • 「プロジェクト一覧」「← 一覧へ戻る」がクイック生成画面に戻っていました。
  • プロジェクト一覧が自動で更新されず、完了しても「生成中」のままでした。
  • 設定の数値欄を空にすると 0 が保存され(音量 0 で無音になる)、マイナスも入力できませんでした。
  • 完成動画を戻したときや、終わったジョブを止めたときの表示、何も実行しなかった YOLO の報告、計画の字幕増減の表示を修正しました。
  • 進捗・状態を日本語で表示し、エラーを生の JSON や英語で出さないようにしました。

セットアップ

  • docker compose up で backend が起動しなかった問題(Dockerfile の末尾のゴミ文字)、日本語フォントがなく文字化けする問題、フロントからバックエンドに届かない問題、DB がボリュームの外に置かれる問題を修正しました。
  • コミットされていた vite.config.js が vite.config.ts の設定を上書きしていました。
  • make demo と make ffmpeg-check を修正しました。
  • README の設定の範囲・出力の場所・API・制限の記述を実際の動作に合わせました。

既知の問題(次の版で対応予定)

  • 外部処理(LLM・画像生成)の結果が確かめられない状態になると、そのプロジェクトは再生成も削除もできなくなります。
  • ブロックを連結した動画で、ブロック数が多いほど音声がスライドと字幕から少しずつ遅れます。
  • 字幕の位置(上・中央)と「半透明背景」は焼き込み字幕に反映されません。
  • 予備の図描画(台本に ```slide がないとき)で、ノードや矢印が欠けることがあります。

これらは仕組みに関わるため、影響範囲を確かめてから修正します。

v0.2.0 — 言葉で操作する

Choose a tag to compare

@Rimcat-JA Rimcat-JA released this 06 Oct 05:15
a80f710

日本語の依頼で動画プロジェクトを操作できるようになりました。「字幕を64pxにして作り直して」と入力すると、手元の小さなローカルモデルが依頼を解釈し、設定の保存から動画の生成までを行います。引き続き、クラウドも認証も課金もなく、すべて自分のマシンで完結します。

このリリースの中身

言葉で操作する

プロジェクト詳細画面の上部「言葉で操作する」に依頼を入力します。

依頼の例 動き
字幕を64pxにして 設定を保存(動画は生成しない)
字幕を少し大きく、話速1.2倍で作り直して 設定をまとめて保存し、動画生成は確認してから開始
ジョブ7を止めて 指定したジョブをキャンセル
第2版の設定に戻して/動画3に戻して 設定の版/完成動画を戻す(履歴は消えない)
第2版に戻してから動画を作り直して 2〜4 手順をまとめて 1 回の確認で実行
ジョブ7は止めないで 否定だけの依頼は何もせず取り下げる
  • 足りない値や番号は聞き返します。依頼に書いた値と食い違う内容は実行しません。
  • 依頼の解釈は LM Studio で動かすローカルモデルが行い、実行はアプリに登録済みの処理だけが行います。モデルがコードを書いたり、任意の操作をしたりすることはありません。
  • 保存した変更前後の値、動画への反映状況、確認が必要な操作の内容をカードで表示します。

確認なしで最後まで実行(YOLO モード)

入力欄の切り替えをオンにすると(既定はオフ)、確認や質問をせず、書かれていない値は推測して、設定の保存から動画の生成まで続けて実行します。推測した箇所と自動で確認した操作は、結果に報告されます。明示した否定(「〜しないで」)や依頼に書いた値は、YOLO モードでも守られます。

操作は書き足すだけで増やせる

操作の知識は backend/app/operations/ のカタログ(JSON)にまとめてあります。依頼ごとに検索(RAG)で候補を数件に絞ってからモデルに選ばせるので、操作が増えても小さなモデルで扱えます。新しい操作は、カタログへの追記と処理 1 つの登録で追加できます(今回の「完成動画を戻す」もこの方法で追加しました)。

履歴と巻き戻し

  • 設定は保存するたびに版として記録され、任意の版に戻せます(戻した結果も新しい版になります)。
  • 生成に成功した動画はすべて履歴に残り、以前の動画を現在の動画に戻せます。
  • 生成のキャンセル・再試行、ブロック単位の画像・音声の再生成ができます。同じ要求の再送で二重に実行されることはありません。

見やすさと読み上げ

  • 図の強調: ナレーションが説明している語句をスライド上で強調します。
  • 字幕の切り替え: 話している文ごとに切り替えます(まとめる設定も選べます)。
  • 読み上げの間: 説明の内容に合わせて文間を変えます(固定の秒数も選べます)。
  • 読み方の登録: 「API」→「エーピーアイ」のように、専門用語の読み方を登録できます。字幕の表記は変わりません。

台本生成プロンプト

台本を書かせる AI にそのまま貼り付けて使うプロンプトを 2 種類用意しました。

  • docs/script-prompt.md: 汎用版。台本の形式とアスキーアートの描き方を守らせます。
  • docs/script-prompt-passive.md: 講義資料や教科書を「再生して見ているだけで分かる」動画にするための版。説明の粒度・順番・繰り返し・間の取り方まで指定します。

必要なもの

v0.1.0 に加えて、言葉で操作する機能を使う場合は LM Studio と、読み込んだローカルモデルが必要です(backend/.env の LANGUAGE_MODEL にモデル名を設定)。検索(RAG)を使う場合は索引を作り、LANGUAGE_RETRIEVAL_INDEX に指定します。未設定のときは全操作をモデルに渡す方式で動きます。

はじめかた

git clone https://github.com/Rimcat-JA/blockvideo.git
cd blockvideo
make install
cp backend/.env.example backend/.env   # キーとモデル名を記入
make backend
make frontend                          # http://127.0.0.1:5173/

使い方の詳細は README を参照してください。

既知の制限

  • 言葉で操作する機能は、ローカルモデルの性能に左右されます。言い回しによっては聞き返しが増えたり、意図と違う提案になったりします。確認画面の内容を見てから実行してください。
  • YOLO モードは推測した値で実行します。結果の報告を確認し、意図と違う場合は設定や動画の履歴から戻してください。
  • 接続できるモデルは、手元の LM Studio のローカルサーバーだけです。
  • ワーカーは単一プロセスです。再起動すると実行中のジョブは失われます(中間成果物は再利用されます)。

v0.1.0 — 初回公開

Choose a tag to compare

@Rimcat-JA Rimcat-JA released this 28 Jul 11:47

日本語の台本を貼り付けると、スライド・ナレーション・字幕入りの MP4 を出力するローカル Web アプリです。クラウドも認証も課金もなく、すべて自分のマシンで完結します。

このリリースの中身

スライドは台本が指定する

図を LLM に設計させると、台本に無い識別子を発明します。実測で 77 ブロックの動画に 115 個の捏造ラベル(hdr、k2、local* など)が入りました。

台本側が ```slide ブロックで中身を直接書き、それをそのまま描画します。捏造は構造的に起きません。LLM の呼び出しも減ります。台本にスライド指定が無いブロックだけ、従来どおりモデルが設計します。

アスキーアートが崩れない

罫線と日本語を混ぜると、フォント任せの描画では必ず桁がずれます(日本語は英字の 2 倍幅)。端末と同じ固定文字グリッドに 1 文字ずつ配置し、字形を持つフォントを文字ごとに選ぶことで解決しています。

字幕とスライドが音声とずれない

VOICEVOX の /audio_query はモーラ単位の長さを合成前に返し、実音声との誤差は 0.12% です。これを使って文ごとの時刻を測ります。

文字数で按分 実測タイミング
字幕切替が実際の無音に収まる 39% 94%
無音からの平均ずれ 338 ms 56 ms
スライド切替が文の区切りと一致 12/68 65/68

数値は 28 ブロックの実プロジェクトを、レンダリング済み音声の無音区間(ffmpeg silencedetect)と照合した実測値です。

文末の息継ぎ

「。」ごとに指定秒数の間を置きます(既定 1.5 秒)。読み上げ速度とは独立していて、速度を変えても間の長さは秒数どおり保たれます。

カスタム設定

息継ぎ・読み上げ速度・ブロック間の余韻・1 ブロックの最大スライド枚数・字幕サイズ・話者を UI から変更できます。プロジェクトごとに保存されます。

必要なもの

Python 3.13+ / uv、Node.js 20+ / pnpm、ffmpeg、VOICEVOX Engine、OpenAI 互換 API キー(台本の分割のみ。無くても Fake モードで動作します)。

はじめかた

git clone https://github.com/Rimcat-JA/blockvideo.git
cd blockvideo
make install
cp backend/.env.example backend/.env   # キーを記入
make backend
make frontend                          # http://127.0.0.1:5173/

台本の書き方は README、LLM に台本を書かせる場合は docs/script-prompt.md を参照してください。

既知の制限

  • ワーカーは単一プロセスです。再起動すると実行中のジョブは失われます(中間成果物は再利用されます)
  • スライド枚数の上限を上げるときは画像段階の再実行が必要です(rerender だけでは増えません)
  • pre_margin_seconds は先頭ではなく末尾に加算されます
  • 掲載した数値は開発環境(Windows 11 / VOICEVOX 0.25.2)での実測であり、他環境での再現は保証していません

テスト: バックエンド 229 件、フロントエンド 19 件。