Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

デフォルトプリセットの再登録が機能してない #1996

Closed
Hiroshiba opened this issue Apr 17, 2024 · 7 comments · Fixed by #2053
Closed

デフォルトプリセットの再登録が機能してない #1996

Hiroshiba opened this issue Apr 17, 2024 · 7 comments · Fixed by #2053

Comments

@Hiroshiba
Copy link
Member

不具合の内容

デフォルトプリセットにパラメータを再登録したあと、そのプリセットを適用しようとしても反映されてないっぽいことが分かりました。
https://x.com/lei10gohan/status/1780217148708970618

再現手順

  1. プリセット機能をオンにする
  2. デフォルトプリセットの状態でパラメータを変更する
  3. デフォルトプリセットにパラメーターを再登録する
  4. 一度プリセットを解除する
  5. デフォルトプリセットを割り当てる
  6. 登録したパラメーターじゃなく、初期パラメーターになってしまう

期待動作

登録したパラメーターが適用される

VOICEVOXのバージョン

0.18.1

その他

過去バージョンの0.15.2では問題なく動作していることがわかりました。
もしかしたらデグレってるかも・・・?

@Hiroshiba
Copy link
Member Author

今のmainブランチで検証した感じ、普通のプリセットの再登録はできてそうでした。
デフォルトプリセットだけできてない・・・?

@Hiroshiba Hiroshiba changed the title デフォルトプリセットの再登録が機能してない? デフォルトプリセットの再登録が機能してない Apr 17, 2024
@Hiroshiba
Copy link
Member Author

もしかしたらプリセットの再登録に問題があるのではなく、プリセットを適用する時にデフォルトの引っ張ってくるとこに問題があるとか…?

@k-chop
Copy link
Contributor

k-chop commented Apr 17, 2024

Image from Gyazo
とりあえず同じ名前でidの違う別のpresetが作成され、
参照時は変更してない方が参照されているというところまで突き止めました。
プリセットの保存はされているが、変更したプリセットが参照されないので変更されていないように見えるっぽいです。
(↓ここでresult.itemsをnameでfilterして出力しました)

SAVE_PRESET_CONFIG: {
async action(
context,
{
presetItems,
presetKeys,
}: { presetItems: Record<PresetKey, Preset>; presetKeys: PresetKey[] }
) {
const result = await window.backend.setSetting("presets", {
items: JSON.parse(JSON.stringify(presetItems)),
keys: JSON.parse(JSON.stringify(presetKeys)),
});
context.commit("SET_PRESET_ITEMS", {
// z.BRAND型のRecordはPartialになる仕様なのでasで型を変換
// TODO: 将来的にzodのバージョンを上げてasを消す https://github.com/colinhacks/zod/pull/2097
presetItems: result.items as Record<PresetKey, Preset>,
});
context.commit("SET_PRESET_KEYS", { presetKeys: result.keys });
},
},

console.log(
   Object.entries(result.items).filter(([key, item]) => item?.name === "デフォルト:四国めたん(ノーマル)")
);

これがユーザの環境で既に起きているとなると、修正後にどっちを取ったら良いか決定するの無理ですね...
presetKeysは追加順な気がするので後にある方を優先、で大丈夫かな...

すみませんがこれ以後調査や修正の時間をコンスタントに確保できるかどうかはちょっと何とも言えないので、
分かったことは誰でも引き継げるよう都度メモっていきます🙏
今週の土日は時間取れそうなので引き続き見ていきますね

@Hiroshiba
Copy link
Member Author

途中報告ありがとうございます、助かります!!

とりあえず同じ名前でidの違う別のpresetが作成され、

おおお・・・なんと・・・・・・・・・いったいなぜ・・・・・

presetKeysは追加順な気がするので後にある方を優先、で大丈夫かな...

既存で登録している人とかがどうなっているか次第かもですね・・・・・。
既存で登録してたけど、アップデートしてバグって無印の新しいプリセットが作られていた場合・・・。

またなにかわかったらぜひ 🙇 🙇 🙇

@madosuki
Copy link
Contributor

madosuki commented Apr 17, 2024

https://github.com/VOICEVOX/voicevox/blob/5cb3455554257040fb751d616e463deb187fd664/src/store/preset.ts#L201C2-L234C5 でプリントデバッグしてみたところ生成対象にソング機能用スタイルが入っているようでした.

@Hiroshiba
Copy link
Member Author

Hiroshiba commented Apr 17, 2024

あーなるほどです!!!!!!!!

スタイルの名称からデフォルトスタイル名を作ってるので、確実に衝突しますね・・・・・・。
んでデフォルトスタイルを取得するとき名前からfindにしているなら、片方しか得られなくてバグに気付けない・・・・。
なるほどーーーーーーー!!

たぶんGET_ALL_VOICESUSER_ORDERED_CHARACTER_INFOSのように引数指定できるようにしてtalkのみにするか、あるいはいっそGET_TALK_VOICESにするかしてトーク専用スタイルのみで処理してあげるのが良さそうなのかなと思いました!

あとはハミングスタイル(とソングスタイル)で作ってしまったデフォルトプリセットをどうするかですが・・・

  1. 設定ファイルのマイグレーション時に削除する
    • 一番良いけど、どれがハミング由来なのか知るにはもしかしたらエディタやエンジンの起動が必要・・・?
    • 起動を待つ必要があるなら不可能
    • もしデフォルトスタイルがトークのみしかない感じだったら、そっちのスタイルから無理やりトークプリセットのみにできるかもしれない。。。
  2. エディタ起動完了時に設定ファイル内の不要なデフォルトプリセットを削除する
    • App.vue辺りでエンジン起動後に専用の削除コードを走らせる
    • デフォルトプリセットを読み込む前に実行しないといけない
  3. デフォルトプリセットを読み込むときにトークのみから読み込むようにする
    • デフォルトプリセットを読み込むときにフィルタでトークのみにできるならこれが一番いいかもしれない

一番良いのは1の方法ですが、たぶん無理な気がしてます。
二番目に良い方法は2と3のあわせ技で、暫くの間だけ起動後削除コードを実装しておき、しばらくしたら外すのが良いかなと。(残してるとそれはそれでバグになりそうなので。。。)
三番目に良いのは3の方法のみ実装かなぁ。

とりあえず3の方法を実装、余裕があれば2も実装、そもそも1ができればこれが一番良い、って感じかなぁ。。。。

@Hiroshiba
Copy link
Member Author

このバグのこと完全に忘れてました。。。
もしよかったらプルリクエストお待ちしています!!!

Hiroshiba added a commit that referenced this issue May 6, 2024
* GET_ALL_VOICES getter change to getter function with a argument of styleType

* add migration process but version is temporary for dev

* add check length of defaultPresetsKeys

* fix crusth at unit test, check to can migrate from 0.13

* change target migration version

* rename

* 文脈コメントと型を追加

---------

Co-authored-by: Hiroshiba Kazuyuki <kazuyuki_hiroshiba@dwango.co.jp>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
3 participants