# Gemma4 Playground

ローカルにある Gemma4 モデルを試す Windows 向けツールです。Streamlit UI では通常チャット、音声・動画文字起こし、画像認識、動画説明を切り替えて使えます。CLI は文字起こし用です。

## 前提

- モデル配置先: `H:\LLM_Models\safetensor\gemma4\E4B-it`
- 推奨 Python: `3.12`
- `torch` と `transformers` は Python `3.14` では動かない可能性が高いため、`setup.ps1` は `py -3.12` を使います。
- `mp3` や動画の読み込みに失敗する場合は `ffmpeg` をインストールしてください。
- 動画文字起こしで `ffmpeg` が PATH に無い場合は、UI の `ffmpeg path` か CLI の `--ffmpeg-path` に `ffmpeg.exe` のフルパスを入れてください。
- CUDA メモリ断片化を減らすため、アプリ起動時に `PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True` を既定設定しています。
- 文字起こし機能は `processor.apply_chat_template(...)` を使う instruction-tuned 系の Gemma4 を前提にしています。

## セットアップ

```powershell
powershell -ExecutionPolicy Bypass -File D:\Workspace\Python\LLM_GEMMA4_TEST\setup.ps1
```

## CLI 実行

```powershell
D:\Workspace\Python\LLM_GEMMA4_TEST\.venv\Scripts\python.exe D:\Workspace\Python\LLM_GEMMA4_TEST\src\gemma_transcribe.py C:\path\to\sample.mp3 --output D:\Workspace\Python\LLM_GEMMA4_TEST\transcript.txt
```

## Streamlit UI

```powershell
D:\Workspace\Python\LLM_GEMMA4_TEST\.venv\Scripts\streamlit.exe run D:\Workspace\Python\LLM_GEMMA4_TEST\src\streamlit_app.py
```

ブラウザで画面が開き、`Chat`、`Transcription`、`Image`、`Video` を切り替えて使えます。
モデルは `H:\LLM_Models\safetensor\gemma4` 配下から一覧で選択できます。
`Transcription` 側では音声ファイルだけでなく `mp4` などの動画ファイルも受け付けます。
`Mode` を `song` にすると、歌声を歌詞として文字起こしする向けのプロンプトに切り替わります。
`Image` 側では画像説明や画像内テキストの読み取りを試せます。
`Video` 側では動画内容の説明や動画内テキストの読み取りを試せます。動画は 60 秒ごとに分割し、各区間から代表フレームを抽出して説明し、最後に全体説明へ統合します。

## よく使うオプション

```powershell
D:\Workspace\Python\LLM_GEMMA4_TEST\.venv\Scripts\python.exe D:\Workspace\Python\LLM_GEMMA4_TEST\src\gemma_transcribe.py C:\path\to\sample.mp3 `
  --language ja `
  --mode song `
  --chunk-seconds 30 `
  --max-new-tokens 256 `
  --output D:\Workspace\Python\LLM_GEMMA4_TEST\transcript.txt
```

## 補足

- 長い音声や動画は 30 秒ごとに分割して順番に文字起こしします。
- 動画は内部で `ffmpeg` を使って音声を抽出してから処理します。
- 文字起こしの実装フローは、指定された note 記事と Gemma4 README の audio 例に寄せています。
- 出力は「文字起こし本文のみ」を狙うプロンプトにしていますが、モデルによっては多少説明文が混ざることがあります。
- GPU がある環境では `device_map auto` で自動配置されます。
- 1 枚に収まらないときは `max_memory` に `{"cuda:0":"10GiB","cuda:1":"10GiB","cpu":"32GiB"}` のような JSON を入れると、2 枚へ分散しやすくなります。
- Streamlit 側は同じモデル設定ならインスタンスを再利用し、不要になったモデルは解放します。
