{ "description": "OpenVoice V2 ToneColorConverter を5つの CoreML モデルに分割。voice_conversion パスを再現する実行順序は以下の通り。", "pipeline": [ { "step": 1, "model": "ToneColorConverter_ReferenceEncoder.mlpackage", "role": "参照音声の mel-spectrogram → tone color embedding v(C)", "inputs": { "spec": "[1, T, n_mels] float32" }, "outputs": { "g": "[1, gin_channels, 1] float32" } }, { "step": 2, "model": "ToneColorConverter_PosteriorEncoder.mlpackage", "role": "ベース音声の STFT スペクトル → 潜在変数 z", "inputs": { "spec": "[1, n_fft, T] float32", "spec_lengths": "[1] int32", "g": "[1, gin_channels, 1] float32 (ソーススピーカーの g)" }, "outputs": { "z": "[1, inter_channels, T] float32", "y_mask": "[1, 1, T] float32" } }, { "step": 3, "model": "ToneColorConverter_Flow_Forward.mlpackage", "role": "z → z_p (ソーストーンカラー除去)", "inputs": { "z": "step2.z", "y_mask": "step2.y_mask", "g": "ソース g" }, "outputs": { "z_p": "[1, inter_channels, T] float32" } }, { "step": 4, "model": "ToneColorConverter_Flow_Reverse.mlpackage", "role": "z_p → z_hat (ターゲットトーンカラー注入)", "inputs": { "z_p": "step3.z_p", "y_mask": "step2.y_mask", "g_tgt": "ターゲット g" }, "outputs": { "z_hat": "[1, inter_channels, T] float32" } }, { "step": 5, "model": "ToneColorConverter_Decoder.mlpackage", "role": "z_hat → 波形 (HiFi-GAN)", "inputs": { "z_hat": "step4.z_hat", "y_mask": "step2.y_mask", "g": "ターゲット g" }, "outputs": { "audio": "[1, 1, T_audio] float32" } } ], "hyperparameters": { "sampling_rate": 22050, "filter_length": 1024, "hop_length": 256, "win_length": 1024, "n_fft": 513, "inter_channels": 192, "hidden_channels": 192, "gin_channels": 256, "upsample_rates": [ 8, 8, 2, 2 ] }, "notes": [ "MeloTTS (BaseSpeakerTTS) は可変長 tokenizer のため CoreML 化対象外。", "ベース音声は Python/MeloTTS で生成し、そのスペクトルを step2 に渡す。", "PosteriorEncoder は Core ML 用に後験平均 (tau=0 相当) のみ。PyTorch の randn サンプリングは含まない。", "tone color embedding は事前計算して .pth/.bin で保存しておくと効率的。", "iOS 推論時は AVAudioEngine で sampling_rate に合わせてリサンプリング要。" ] }