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に処理履歴・スコアを記録 - 全タブ共通のデータセットセレクター表示
- ファイル一覧にステータス・スコア表示
- 未処理ファイルをまとめて処理するバッチ機能
- タブ移動後も設定値・選択状態が保持される