Ph2 Train Integration — Claude Code指示書
概要
train_worker.py の try_real_train() に本番学習を実装する。
RVC本体のスクリプトをsubprocessで順番に呼び出す構成。
前提
- RVCのスクリプト群はKotohaプロジェクトルートの
train/フォルダに配置済み - 参照実装:
train/infer-web.py(preprocess_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.py の try_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}.pthをmodels/custom/にコピー -
RVC_ROOTをenv変数またはconfig.jsonで上書き可能