suzuna / ph2 train integration

Ph2 Train Integration — Claude Code指示書

概要

train_worker.pytry_real_train() に本番学習を実装する。 RVC本体のスクリプトをsubprocessで順番に呼び出す構成。


前提

  • RVCのスクリプト群はKotohaプロジェクトルートの train/ フォルダに配置済み
  • 参照実装: train/infer-web.pypreprocess_dataset() / extract_f0_feature() / click_train()
  • ライセンス: MIT確認済み

ディレクトリ構成(想定)

kotoha/
├─ train/                         # RVC本体をここに配置
│   ├─ infer/
│   │   └─ modules/
│   │       └─ train/
│   │           ├─ preprocess.py
│   │           ├─ train.py
│   │           └─ extract/
│   │               ├─ extract_f0_rmvpe.py
│   │               └─ extract_feature_print.py
│   ├─ configs/
│   ├─ pretrained_v2/             # 事前学習済みモデル
│   └─ ...
├─ python/
│   └─ core/
│       └─ train_worker.py        # ここを実装する
└─ ...

実装内容

python/core/train_worker.pytry_real_train() を以下の3ステップで実装

Step 1: 前処理(preprocess)

cmd = (
    '"{python}" "{rvc_root}/infer/modules/train/preprocess.py" '
    '"{dataset_dir}" {sr} {n_cpu} "{exp_dir}" {cut_preprocess} {preprocess_per}'
).format(
    python=sys.executable,
    rvc_root=RVC_ROOT,          # train/ の絶対パス
    dataset_dir=dataset_dir,    # WAVが入ってるフォルダ
    sr="40k",                   # サンプリングレート固定
    n_cpu=os.cpu_count() or 4,
    exp_dir=exp_dir,            # logs/{model_name}/
    cut_preprocess=True,
    preprocess_per=3.0,
)

Step 2: F0特徴量抽出(extract)

cmd = (
    '"{python}" "{rvc_root}/infer/modules/train/extract/extract_f0_rmvpe.py" '
    '{n_part} {i_part} {i_gpu} "{exp_dir}" {is_half}'
).format(
    python=sys.executable,
    rvc_root=RVC_ROOT,
    n_part=1,
    i_part=0,
    i_gpu=0,                    # GPU index
    exp_dir=exp_dir,
    is_half=True,
)

Step 3: 本番学習(train)

cmd = (
    '"{python}" "{rvc_root}/infer/modules/train/train.py" '
    '-e "{model_name}" -sr {sr} -f0 1 -bs {batch_size} '
    '-g {gpu} -te {total_epoch} -se {save_epoch} '
    '-pg "{pretrained_G}" -pd "{pretrained_D}" '
    '-l 1 -c 0 -sw 0 -v v2'
).format(
    python=sys.executable,
    rvc_root=RVC_ROOT,
    model_name=model_name,
    sr="40k",
    batch_size=batch_size,      # デフォルト4、RTX3070なら8でも可
    gpu=0,
    total_epoch=total_epoch,
    save_epoch=max(10, total_epoch // 10),
    pretrained_G=f"{RVC_ROOT}/pretrained_v2/f0G40k.pth",
    pretrained_D=f"{RVC_ROOT}/pretrained_v2/f0D40k.pth",
)

進捗ポーリング

学習ログは train/logs/{model_name}/train.log に出力される。 既存の1.5秒ポーリングでこのファイルを読み、epochとlossを抽出してステータス更新する。

# ログから進捗を読み取るパターン例
# "[epoch 10/100] loss: 0.342" のような行を想定
import re
pattern = re.compile(r'\[epoch\s+(\d+)/(\d+)\].*loss[:\s]+([\d.]+)', re.IGNORECASE)

設定

RVC_ROOT はハードコードせず、以下の優先順で解決する:

RVC_ROOT = (
    os.environ.get("KOTOHA_RVC_ROOT")           # 環境変数
    or config.get("rvc_root")                    # config.json
    or os.path.join(BASE_DIR, "train")           # デフォルト: プロジェクトルート/train/
)

完了条件

  • try_real_train() が3ステップを順番にsubprocess実行
  • 各ステップの開始・完了をジョブステータスに反映
  • train/logs/{model_name}/train.log からepoch/lossを読み取り進捗表示
  • 完了後 train/logs/{model_name}/{model_name}.pthmodels/custom/ にコピー
  • RVC_ROOT をenv変数またはconfig.jsonで上書き可能