suzuna / state suzuna ph3x v3

Suzuna — STATE Ph3.x-v3 データセット管理ブラッシュアップ

概要

Ph3.x-v2で実装した録音品質UIに対して、 データの所在・進捗の透明性・タブ間の状態保持を改善する。

「何を録音して、何を処理して、何が学習に使えるか」が 常にユーザーに見えている状態を目指す。


課題

① タブ移動で作業進捗がリセットされる

  • 録音中に別タブへ移動すると録音が中断・消える
  • スライダー等の設定値がデフォルトに戻る
  • 作業の途中状態が保持されない

② データの所在が不透明

  • 録音したWAVがどこに保存されているか不明
  • 変換・前処理の履歴が残らない
  • 何が処理済みで何が未処理か判別できない

解決方針

① グローバルステートで状態を永続化

Zustandを導入してタブ間で状態を共有する。

src/store/
├─ audioStore.ts       # 録音・インポート状態
├─ processStore.ts     # 前処理設定・処理状態
└─ datasetStore.ts     # データセット一覧・選択状態

保持する状態:

  • 現在選択中のデータセット名
  • 録音済みファイル一覧
  • 各ファイルの処理ステータス
  • スライダー等の設定値(ローカルストレージに永続化)

② データ保存先の明示化

datasets/
├─ {dataset_name}/
│   ├─ raw/              # 録音・インポート直後の生ファイル
│   │   ├─ 001.wav
│   │   ├─ 002.wav
│   │   └─ ...
│   ├─ processed/        # 前処理適用済みファイル
│   │   ├─ 001.wav
│   │   └─ ...
│   └─ dataset.json      # メタデータ・処理履歴
└─ ...

dataset.json の構造

{
  "name": "suzuna_v1",
  "created_at": "2026-05-08T00:00:00",
  "files": [
    {
      "id": "001",
      "filename": "001.wav",
      "raw_path": "datasets/suzuna_v1/raw/001.wav",
      "processed_path": "datasets/suzuna_v1/processed/001.wav",
      "status": "processed",
      "score": 87,
      "grade": "A",
      "duration_ms": 3200,
      "recorded_at": "2026-05-08T23:14:00",
      "processed_at": "2026-05-08T23:15:00"
    }
  ],
  "stats": {
    "total": 42,
    "raw_only": 5,
    "processed": 37,
    "total_duration_ms": 124000
  }
}

③ データセット管理UI

データセットセレクター(全タブ共通ヘッダー)

┌─ データセット ─────────────────────────────────┐
│  [suzuna_v1  ▼]  [+ 新規作成]                   │
│  録音済み: 42件  処理済み: 37件  未処理: 5件     │
│  合計時間: 2分4秒                               │
└─────────────────────────────────────────────────┘

全タブの上部に常時表示。タブ移動しても選択中のデータセットが維持される。


音声前処理タブのファイル一覧

┌─ ファイル一覧 ──────────────────────────────────┐
│  [すべて ▼]  [未処理のみ] [処理済みのみ]         │
│                                                  │
│  ✅ 001.wav  3.2s  スコア87(A)  [▶][🗑]         │
│  ✅ 002.wav  2.8s  スコア91(S)  [▶][🗑]         │
│  ⚠️ 003.wav  4.1s  未処理       [▶][⚡処理][🗑] │
│  ✅ 004.wav  3.0s  スコア74(B)  [▶][🗑]         │
│                                                  │
│  [⚡ 未処理をまとめて処理]                       │
└─────────────────────────────────────────────────┘

ステータスバッジ:

  • ✅ 処理済み + スコア表示
  • ⚠️ 未処理(生ファイルのみ)
  • ❌ スコア低(C/D)→ 再録音を促す

追加APIエンドポイント

GET /dataset/list
  response: { datasets: [{ name, stats }] }

POST /dataset/create
  body: { name: string }

GET /dataset/{name}/files
  response: { files: DatasetFile[] }

DELETE /dataset/{name}/files/{id}

POST /dataset/{name}/process-all
  body: { config: ProcessConfig }
  response: { job_id: string }

GET /dataset/{name}/stats
  response: DatasetStats

変更ファイル

ファイル種別内容
src/store/datasetStore.ts新規Zustandグローバルステート
src/components/DatasetSelector.tsx新規全タブ共通ヘッダー
src/pages/AudioQualityPage.tsx変更ファイル一覧・ステータス表示追加
python/routers/dataset.py変更dataset.json管理・stats API追加
python/routers/audio_process.py変更処理結果をdataset.jsonに記録

完了条件

  • Zustand導入、タブ間で状態保持
  • datasets/{name}/raw/ に録音・インポートファイルを自動保存
  • datasets/{name}/processed/ に処理済みファイルを自動保存
  • dataset.json に処理履歴・スコアを記録
  • 全タブ共通のデータセットセレクター表示
  • ファイル一覧にステータス・スコア表示
  • 未処理ファイルをまとめて処理するバッチ機能
  • タブ移動後も設定値・選択状態が保持される