指示プロンプト(!gh pr diffを実行したあと)
以上が今のブランチとmainブランチとのdiffです。
この実装は変更が2000行ほどあります。100~500行ほどの変更に分けていきたいのですが、どう分けるのが良さそうでしょうか。
コードを熟読してください。READMEも読んでこのプロジェクトの目的も把握しつつ適切な粒度を教えて下さい。
ultrathink
↓結果
プロジェクトの目的とコードを熟読し、依存関係を分析しました。VOICEVOXは音声合成コアライブラリで、このPRではソング(歌唱)機能を追加する大型実装です。
📊 変更の全体像
- 合計: 約2000行の変更(+1999, -87)
- ファイル数: 22ファイル
- 最大の変更: synthesizer.rs (+513行)
🎯 推奨する分割案(7コミット、各100〜500行)
依存関係とビルド可能性を考慮し、以下の順序で分割することを推奨します:
コミット1: 基盤コレクション型の追加(約220行)
- collections.rs (184行新規) - NonEmptyVec/NonEmptySliceなど
- ndarray.rs (34行新規) - イテレータユーティリティ
- Cargo.toml (+3行)
- Cargo.lock (+83行、うちsmol_str等の依存関係) 目的: 後続のソング機能で使用する基盤型を先に導入 ビルド: 独立してビルド可能 行数: 約304行(Cargo.lock含む)
コミット2: 音素APIの公開化とSerde対応(約380行)
- engine/acoustic_feature_extractor.rs (+330, -21)
- engine/mora_list.rs (+4, -2)
- error.rs (+20, -1) 目的: Phoneme、Silなどの型を公開APIにし、Serde対応を追加。エラー型も拡張 ビルド: 可能(公開APIの拡張のみ) 行数: 約378行
コミット3: 共通ユーティリティの修正(約145行)
- engine/sampling_rate.rs (+50, -9)
- engine/audio_file.rs (+50, -7)
- engine/talk/audio_query/validated.rs (+14, -12)
- engine.rs (+8, -2) 目的: SamplingRateの公開化、PCM処理の抽象化(HasPcmOptionsトレイト導入) ビルド: 可能(既存機能のリファクタリング) 行数: 約150行
コミット4: ソングクエリ型の定義(約230行)
- engine/song.rs (3行新規、モジュール宣言)
- engine/song/queries.rs (228行新規) 目的: Note、Score、FrameAudioQuery、OptionalLyricなどのデータ型定義 ビルド: 可能(まだ使用されていないが、型定義のみ) 行数: 約231行
コミット5: ソングバリデーションの実装(約200行)
- engine/song/validate.rs (197行新規) 目的: Note/Scoreのバリデーションロジック、ValidatedNoteなどの内部型 ビルド: 可能(コミット4の型を使用) 行数: 約197行
コミット6: ソング特徴量抽出の実装(約235行)
- engine/song/interpret.rs (234行新規) 目的: 音符列から特徴量への変換ロジック(ConsonantLengthsFeatureなど) ビルド: 可能(コミット5のバリデーション済み型を使用) 行数: 約234行
コミット7: synthesizer統合とAPI公開(約560行)
- synthesizer.rs (+513, -10)
- lib.rs (+27, -3)
- blocking.rs (+2, -1)
- nonblocking.rs (+3, -1)
- CHANGELOG.md (+8, -16)
- .github/workflows/test.yml (+1行) 目的: ソング機能をsynthesizerに統合し、公開APIとして公開。ドキュメント更新 ビルド: 可能(全ての前提が揃う) 行数: 約585行
※ コミット7が少し大きい(585行)場合の分割案:
- 7a: synthesizer.rs のみ(523行)
- 7b: 公開API + ドキュメント(62行)