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

ADD: AudioItemにSpeakerIdを追加 #1092

Merged
merged 24 commits into from
Feb 6, 2023
Merged

Conversation

sabonerune
Copy link
Contributor

内容

AudioItemにSpeakerID(SpeakerUUID)を追加します。

その他

複数エンジンが実装されるとマイグレーションが複雑になる可能性があるためとりあえず追加だけしました。

src/components/DictionaryManageDialog.vue Outdated Show resolved Hide resolved
src/store/project.ts Outdated Show resolved Hide resolved
@sabonerune sabonerune marked this pull request as ready for review January 5, 2023 09:30
@sabonerune sabonerune requested a review from a team as a code owner January 5, 2023 09:30
@sabonerune sabonerune requested review from Hiroshiba and removed request for a team January 5, 2023 09:30
Copy link
Member

@Hiroshiba Hiroshiba left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PRありがとうございます!!
とりあえず実装しておくの、良いのかなと思いました!

レビュー前に、ちょっとモチベと相談なのですが、いくつか気になったことが・・・!

  • プロジェクトファイルのSpeakerID追加マイグレーションに関して、MYCOEIROINKが大変そう
    • エンジンから変換リストを作ろうとし、無理だったらフォールバックでビルトイン変換リストを使う、とか・・・?
  • COMMAND_CHANGE_STYLE_IDなど、Voiceを渡してるけど名前がSTYLE_IDになってる
    • 別にそのままでもまあ問題ないと言えば問題ない
    • もしよければ、くらいです
  • COMMAND_PUT_TEXTSなど、engine/speaker/style IDをそれぞれ渡してるのもありそう
    • これも全く問題ないのですが、もしよければ統一しとくと便利かも、くらいです
  • AudioItemにVoiceを持たせる・・・?
    • 将来仮にVoiceVersionをもたせるときに楽そう
    • なんか変なとこに影響範囲ありそうなので、まあこれももしよければくらい

@Hiroshiba
Copy link
Member

あと設計レベルで @aoirint さんや @Segu-g さんにお伺いしたいことが!
engine/speaker/style IDをVoice構造体とすることになにか問題とか思いついたりとかありますか・・・・・?

@sabonerune
Copy link
Contributor Author

  • プロジェクトファイルのSpeakerID追加マイグレーションに関して、MYCOEIROINKが大変そう

大変そうなので複数エンジン実装までに入れられないかなと急いでPR作った感じですね。
間に合いそうでなければ一旦PR取り下げた方がいいかもしれません。
エンジンからSpeakerIDを取れるように待機してからマイグレーションするようにするとか?

@Hiroshiba
Copy link
Member

複数エンジンリリースは月末で、その1週間くらい前まではバグフィックスとか含めると思います。そこまでにできると嬉しいなって感じですね…!

待機、良さそうに感じました。
実際のコード追っかけてみたのですが、たぶんbackground.tsにあるdid-finish-load内でエンジン準備完了前にプロジェクトファイルが読まれてるんだと思います。
ここの処理を全部エンジン起動後のとこ、例えばVIEX_INIT(VUEX_READYだったかも)に移せば、待機する感じの処理になりそうな予感がします。

スマホからなので色々情報不足ですが、参考になれば!!

@Segu-g
Copy link
Member

Segu-g commented Jan 15, 2023

engine/speaker/style IDをVoice構造体とすることになにか問題とか思いついたりとかありますか・・・・・?

基本的に情報を足りなくて困る事はあっても、多くて困ることは可読性が悪くなるくらいだと思うので大丈夫でしょう。

ただ、ロジックの変更まで含めると時間も掛かりそうなので取り敢えずロジックはそのままに追加でもいいと思います。

@Hiroshiba
Copy link
Member

Hiroshiba commented Jan 15, 2023

@Segu-g さんコメントありがとうございます!!

ロジックはそのままに追加

こちらのコメントで課題点がはっきりしました!

  • このままマージするとMYCOEIROINKで過去のプロジェクトファイルが読めなくなる
    • ビルトイン以外のキャラがいる場合にマイグレーション処理が書けないため
  • 解決手段は2つ
    • 1つは諦める
      • 開発者に連絡すればOK
    • もう1つは追加実装する
      • まずvvprojを読むタイミングをVUEX_INIT内にする
      • あとはエンジンに話者情報を問い合わせて突合する
      • ロジックもきれいになるので嬉しい。

まあ、個人的には一旦諦めてとりあえず実装でも良いかなと思います!

その場合でも、Voiceを引数にしたり、engine/speaker/styleのペアだったり、関数名がSTYLE_IDだけど渡すのは前者どちらかだったりと、結構複雑度が増してしまっている印象があります。
たぶん、プロジェクトファイル部分の変更以外を全部戻してからAudioItemにspeaker_idを足し、エラーが起きる2~3箇所だけ修正するのが最小PRになって一番早いかなと思いました!

正直どうすべきかとても迷っています 😇
想定より面倒だとわかって辛かったり、限られた時間だとプレッシャーだったりしたら仰って頂ければ 🙇‍♂️

@sabonerune
Copy link
Contributor Author

sabonerune commented Jan 15, 2023

COEIROINKのエディタのマイグレーションのことを完全に失念していました。
(そういった変換リストで済まないものがVOICEVOXに導入される前にやってしまおうという発想で急いで作りました)

そうなると急いで複数エンジンに間に合わせる必要性は薄くなるのでエンジンに話者情報を問い合わせてマイグレーションするようにした方がいいかもしれません。

あとプロジェクトファイル以外の変更点ですがStyleIDを操作するときに同時にSpeakerIdも操作するように処理を付け加えただけですね。
これをしないとSpeakerIDとStyleIdの組み合わせが乖離してしまうので必要なものだと思います。

@@ -417,6 +418,7 @@ export const audioStore = createPartialStore<AudioStoreTypes>({
payload: {
text?: string;
engineId?: string;
speakerId?: string;
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

GENERATE_AUDIO_ITEMは引数がOptionalなのでそのままにしている。

Copy link
Member

@Hiroshiba Hiroshiba Jan 16, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

これご興味あればという感じなのですが、audio_itemもengine/speaker/styleではなくvoiceにするのどうでしょう…?

こうするとたぶんAudioCell辺りも↑の三変数管理する必要なくなったりと、結構コードがすらっとしそうだな〜と…!
マイグレーション周りもちょいいじらないとダメそうですが。。

でももう十分良い感じなので、もしよければ…!!

@Hiroshiba
Copy link
Member

そうなると急いで複数エンジンに間に合わせる必要性は薄くなるので

あ、確かに!!
のんびりやっちゃって良いかもですね。

StyleIDを操作するときに同時にSpeakerIdも操作するように処理を付け加えた

あーーーなるほどです!
普通にstyle指定するとこほぼ全部が影響範囲ですね、盲点でした!!

@sabonerune
Copy link
Contributor Author

* まずvvprojを読むタイミングをVUEX_INIT内にする

VUEX_INIT完了後に発火されるON_VUEX_READY時点ではUSER_ORDERED_CHARACTER_INFOSは取れませんでした。VUEX_INITは設定ファイルの読み込みまででON_VUEX_READYがウインドウを表示してエンジンの起動が始まるという感じかもしれません。

await store.dispatch("LOAD_USER_CHARACTER_ORDER");
await store.dispatch("LOAD_DEFAULT_STYLE_IDS");
// 辞書を同期
await store.dispatch("SYNC_ALL_USER_DICT");

この辺りでbackground.tsにエンジンの起動が完了したことを通知する必要があるかもしれません。

@Hiroshiba
Copy link
Member

あーーーーーーー そのとおりでした、VUEX作りが完了したタイミングだからダメですね。。 🙇‍♂️

この辺りでbackground.tsにエンジンの起動が完了したことを通知する必要

仰るとおりだと思います。VUEX_INITなどと同じく、ON_ENGINE_READYとかENGINE_INITとかですよね。

あるいはデータの流れをよりわかりやすくするなら、セーフモード引数と同様にvvprojのパスをbackground.tsからvuex側渡し、エンジン起動後にEditorHomeでそのパスがあればloadする、というのもありだと思います。
(個人的にはこっちのが近代的かもと思いました!)

@Hiroshiba
Copy link
Member

Hiroshiba commented Jan 16, 2023

どちらにせよちょっとややこしく、このPR内でやるのは範囲外かもですね。。。
(あとそもそもプロジェクトファイルはエンジン起動後に読み込まれることを想定している箇所があるのを思い出しました。)

プロジェクトファイルのマイグレーションの流れを正確にする意図でまず必ず起動後にvvprojが読まれるようにしたあと、今のPRを進めるのがまあきれいかもです。
最初に思ってたよりまた範囲が広がってしまったので、もしモチベ的にイマイチでしたら言っていただければ・・・ 🙇

(修正範囲がそこまで大きくなさそうであれば、このPRで一緒に修正でもまあ大丈夫です!)

@sabonerune
Copy link
Contributor Author

もう少し進めてみようとおもいます。

@sabonerune
Copy link
Contributor Author

試しにエンジン起動後にプロジェクトを読み込むように変更してみました。

@sabonerune sabonerune marked this pull request as draft January 24, 2023 15:23
Copy link
Member

@Hiroshiba Hiroshiba left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

おー!!面白いですね!!!
SET_PROJECT_FILEPATHがきれいに機能している印象です。

プロジェクトファイルを読み込む部分だけプルリクにする、というのはどうでしょう。
このプルリクのタイトルと内容が若干乖離していることと、なによりこれだけで有用なので提案してみた次第です。

@sabonerune
Copy link
Contributor Author

プロジェクトファイルの読み込み部分のみのプルリクエストを作成します。

Copy link
Contributor Author

@sabonerune sabonerune left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

一通り完了。
#1147 がマージされることが前提。

src/store/project.ts Outdated Show resolved Hide resolved
src/store/project.ts Show resolved Hide resolved
@sabonerune sabonerune marked this pull request as ready for review February 3, 2023 10:46
Comment on lines 374 to 378
const speakerIdComputed = computed(() => {
if (!store.getters.USER_ORDERED_CHARACTER_INFOS)
throw new Error("assert USER_ORDERED_CHARACTER_INFOS");
return store.getters.USER_ORDERED_CHARACTER_INFOS[0].metas.speakerUuid;
});
Copy link
Member

@Hiroshiba Hiroshiba Feb 3, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ここvoiceComputedにできそうだなと思いました!
まあ修正範囲広くなっちゃうのでこのままでも良さそう。FIXME書いても良いかも?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

voiceComputedにしました。

src/store/audio.ts Outdated Show resolved Hide resolved
src/store/audio.ts Outdated Show resolved Hide resolved
Comment on lines -504 to +496
const engineId = payload.engineId ?? state.engineIds[0];

// FIXME: engineIdも含めて探査する
const styleId =
payload.styleId ??
state.defaultStyleIds[
state.defaultStyleIds.findIndex(
(x) =>
x.speakerUuid === userOrderedCharacterInfos[0].metas.speakerUuid // FIXME: defaultStyleIds内にspeakerUuidがない場合がある
)
].defaultStyleId;
const defaultStyleId = state.defaultStyleIds[0];
const voice = payload.voice ?? {
engineId: defaultStyleId.engineId,
speakerId: defaultStyleId.speakerUuid,
styleId: defaultStyleId.defaultStyleId,
};
Copy link
Member

@Hiroshiba Hiroshiba Feb 3, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

レビューメモです。
ここ問題ないか処理を追いかけてみてたのですが、
・voiceがない場合の処理以外は大丈夫
・voiceがない場合は起動後のaudioCell作成だけ
・デフォルトスタイルIDの0番はエンジン起動後に必ず作られる
・最初のaudioCell作成はエンジン起動・デフォルトスタイル作成後
なので大丈夫そうでした!

src/store/audio.ts Outdated Show resolved Hide resolved
src/store/project.ts Outdated Show resolved Hide resolved
Copy link
Member

@Hiroshiba Hiroshiba left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!!!!

差分を極力少なくしてくださっているのを感じました、とても見やすかったです!!!

audioItemの~~id系はundefinableじゃなくせたんですね!!気づきませんでした。
そこプラスVoice統合でかなりコードが扱いやすくなったように感じました、改良ありがとうございます!!

Copy link
Member

@Hiroshiba Hiroshiba left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Segu-g さん すみません!
もしお時間あったら「AudioItemにSpeakerIdを追加する」点に関して問題点がありそうかご意見だけもらっても良いですか・・・? 👀
(コードレビューは無しで大丈夫です!忙しかったら難しいとおっしゃって頂ければ!!)

@sabonerune
Copy link
Contributor Author

指摘点を直しました

@Segu-g
Copy link
Member

Segu-g commented Feb 6, 2023

@Segu-g さん すみません! もしお時間あったら「AudioItemにSpeakerIdを追加する」点に関して問題点がありそうかご意見だけもらっても良いですか・・・? 👀 (コードレビューは無しで大丈夫です!忙しかったら難しいとおっしゃって頂ければ!!)

卒論書いてる最中なので流し読みした程度ですが、話者に関する情報が纏められてかなり読みやすくなったと思います!取りあえずSpeakerIdを追加しておくのはCharactersから情報を取ってき易くなるのでやり得だと思いました!

ただ自分は詳しくないので何とも言えないのですが、キャラを追加するタイプのエンジン(マイコエとか?)やバージョン違いが実装された場合、(engineId, styleId) ではなく (engineId, version, speakerId, styleUUID) のペアで比較する必要など出てくると思うのでその辺りの仕様定義や変更もしていく必要があるのかなと思います。

@Hiroshiba
Copy link
Member

たしかにバージョン情報を足したくなる気がします。
そこはキーがないVoice objectに足す形になるので、マイグレーション面はかなり簡単になりそうです。

あ、engineは既に足されてる感じです!
ざっと考えた感じ将来的な変更にも強そうに感じました。お忙しいところレビューありがとうございます!!!

@Hiroshiba
Copy link
Member

問題ないと思うのでマージしたいと思います!!

@Hiroshiba Hiroshiba merged commit a22046c into VOICEVOX:main Feb 6, 2023
@Segu-g
Copy link
Member

Segu-g commented Feb 6, 2023

あ、engineは既に足されてる感じです!

変更しなければいけない可能性があるのは styleIdspeakerId + styleUUID にする変更なのかなと思っています。
styleIdnumber なのでキャラのインストールがライブラリ形式になると衝突しないように静的な値に固定されず動的に割り振られることもあるのかなと(この辺りのドキュメント読み切れてないので間違ってたらすみません)
その場合 今の仕様がどうだったか覚えていませんが、styleId は衝突しないことしか保証されないのでvoiceの比較に speakerId (UUID) と styleUUID? (UUID) を使う必要が出ます

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants