-
Notifications
You must be signed in to change notification settings - Fork 309
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
ENH: モーフィングUIの実装 #1030
ENH: モーフィングUIの実装 #1030
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
PRありがとうございます!!
こちらもいくつかコメントしたのですが、修正確認するにはおそらくモーフィングUI自体が必要だと思うので、モーフィングUIのPRにこちらも含めていただいても大丈夫です!!
d5a6d91
to
a35afc6
Compare
ce49463
to
9a15da6
Compare
@@ -24,9 +24,9 @@ | |||
transition-show="none" | |||
transition-hide="none" | |||
> | |||
<q-list> | |||
<q-list style="min-width: max-content"> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
右方向に十分スペースがなかったときスタイル名が改行されてしまう問題への対処
src/store/audio.ts
Outdated
VALID_MOPHING_INFO: { | ||
getter: (state, getters) => (audioItem: AudioItem) => { | ||
if ( | ||
!state.experimentalSetting.enableMorphing || | ||
audioItem.morphingInfo == undefined || | ||
audioItem.engineId == undefined | ||
) | ||
return false; | ||
return ( | ||
getters.SELECTABLE_MOPHING_TARGET_ENGINES.includes( | ||
audioItem.engineId | ||
) && audioItem.engineId === audioItem.morphingInfo.targetEngineId | ||
); | ||
}, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
AudioItem
がモーフィングを実行するか判定する関数。
命名が思い浮かばず。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
validは形容詞らしいので、まあVALID_MOPHING_INFO
かなと思いました。(自信ないです。。)
最初はモーフィングが不可能なスタイルが設定された場合すぐに強制的に解除するように考えていましたが、 |
src/store/audio.ts
Outdated
@@ -51,6 +52,7 @@ async function generateUniqueIdAndQuery( | |||
audioQuery, | |||
audioItem.engineId, | |||
audioItem.styleId, | |||
audioItem.morphingInfo, // FIXME: モーフィング非対応エンジンの場合morphingInfoが異なっていても同じ音声が出力されるが異なるIDが生成されてしまう |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
getters.VALID_MOPHING_INFO(audioItem) ? audioItem.morphingInfo : undefined,
で解決できそうだがgetters
をどこから持ってくればいいのか分からず。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
まあ非対応エンジンでは音声を生成できずキャッシュが作れない関係でUniqueId
を利用する機会無いので、FIXしなくても良いかもと思いました!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
非対応エンジンでも今のところ無視して通常の合成をしてしまうので無駄が出てしまいますね。
あと、実験的機能の設定でモーフィングが無効になっている場合でmorphingInfo
が設定されている場合(プロジェクトファイルを読み込んだ等)モーフィングをせずに出力するようにしているのですがその後設定を変えるとキャッシュからモーフィングされていない音声が再生されてしまうことにきづきました。
モーフィングをしてしまえばこの部分の対処は楽ですがそうなるとモーフィングをかけていることに気づけるUIがないことが問題になりますね…
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
すみませんこちらお答えできていませんでした!
ちょっと追いきれてないのですが、まだここ問題になっていそうでしょうか・・・? 👀
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
モーフィング非対応エンジンの方は問題ないですが、無効時の問題は解決していません。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
あ、意図を把握しました!
モーフィングOFFにした場合、UIが消えるだけで、モーフィング済み結果を再生する形で良いかなと思います。
仰る通り気づくUIがないのは問題ですが、ぶっちゃけハマる人はかなりレアケースだと思いました。0人かもしれない。
まあでも問題を把握するのは大事なので、どこかにFIXMEコメントを書くか、issueを作るかが良いかなと思いました!
エラー出そうと思うとかなり大変だと思う+まあまあなコーナケースなので、一旦その方針で問題ないと思います! |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
良いですね!!!
とても大変だったと思います、ありがとうございます!!
名称変更をいっぱい提案していますが、別にどれも致命的ではないのでそのままでも問題ないと思います。
気にいったものだけ取り込んで頂ければ・・・!
<div class="text-body2 text-no-wrap ellipsis overflow-hidden"> | ||
{{ | ||
morphingTargetCharacterInfo | ||
? morphingTargetCharacterInfo.metas.speakerName | ||
: "未設定" | ||
}} | ||
</div> | ||
<div | ||
v-if=" | ||
morphingTargetCharacterInfo && | ||
morphingTargetCharacterInfo.metas.styles.length >= 2 | ||
" | ||
class="text-body2 text-no-wrap ellipsis overflow-hidden" | ||
> | ||
({{ | ||
morphingTargetStyleInfo | ||
? morphingTargetStyleInfo.styleName | ||
: undefined | ||
}}) | ||
</div> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
スタイル選択ボタンの表記と合わせて横並びにすると馴染み深いかもと思いました!
<div class="text-body2 text-no-wrap ellipsis overflow-hidden"> | |
{{ | |
morphingTargetCharacterInfo | |
? morphingTargetCharacterInfo.metas.speakerName | |
: "未設定" | |
}} | |
</div> | |
<div | |
v-if=" | |
morphingTargetCharacterInfo && | |
morphingTargetCharacterInfo.metas.styles.length >= 2 | |
" | |
class="text-body2 text-no-wrap ellipsis overflow-hidden" | |
> | |
({{ | |
morphingTargetStyleInfo | |
? morphingTargetStyleInfo.styleName | |
: undefined | |
}}) | |
</div> | |
<div class="text-body2 text-no-wrap ellipsis overflow-hidden"> | |
{{ | |
morphingTargetCharacterInfo | |
? morphingTargetCharacterInfo.metas.speakerName + | |
(morphingTargetStyleInfo && | |
morphingTargetCharacterInfo.metas.styles.length >= 2 | |
? ` (${morphingTargetStyleInfo.styleName})` | |
: "") | |
: "未設定" | |
}} | |
</div> |
まあAudioInfoを最小幅にすると消えちゃうのですが・・・。
(デザインは全体的に見て最終調整するので、そのままにしていただいても大丈夫です!)
src/store/audio.ts
Outdated
@@ -51,6 +52,7 @@ async function generateUniqueIdAndQuery( | |||
audioQuery, | |||
audioItem.engineId, | |||
audioItem.styleId, | |||
audioItem.morphingInfo, // FIXME: モーフィング非対応エンジンの場合morphingInfoが異なっていても同じ音声が出力されるが異なるIDが生成されてしまう |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
まあ非対応エンジンでは音声を生成できずキャッシュが作れない関係でUniqueId
を利用する機会無いので、FIXしなくても良いかもと思いました!
src/store/audio.ts
Outdated
VALID_MOPHING_INFO: { | ||
getter: (state, getters) => (audioItem: AudioItem) => { | ||
if ( | ||
!state.experimentalSetting.enableMorphing || | ||
audioItem.morphingInfo == undefined || | ||
audioItem.engineId == undefined | ||
) | ||
return false; | ||
return ( | ||
getters.SELECTABLE_MOPHING_TARGET_ENGINES.includes( | ||
audioItem.engineId | ||
) && audioItem.engineId === audioItem.morphingInfo.targetEngineId | ||
); | ||
}, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
validは形容詞らしいので、まあVALID_MOPHING_INFO
かなと思いました。(自信ないです。。)
Co-authored-by: Hiroshiba <[email protected]>
Co-authored-by: Hiroshiba <[email protected]>
src/store/audio.ts
Outdated
if ( | ||
!state.experimentalSetting.enableMorphing || |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
VALID_MOPHING_INFO
の判定からモーフィングの設定を外しました。
src/store/audio.ts
Outdated
|
||
return dispatch("INSTANTIATE_ENGINE_CONNECTOR", { | ||
engineId, | ||
}) | ||
.then((instance) => { | ||
if ( | ||
audioItem.morphingInfo != undefined && | ||
state.experimentalSetting.enableMorphing && |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
モーフィングの設定は音声合成時に確認します
一通り直しました。 モーフィングができないときの処理と表示について考える必要がありそうです。 |
src/components/Dialog.ts
Outdated
@@ -83,7 +87,7 @@ export async function generateAndSaveAllAudioWithDialog({ | |||
|
|||
const successArray: Array<string | undefined> = []; | |||
const writeErrorArray: Array<WriteErrorTypeForSaveAllResultDialog> = []; | |||
const engineErrorArray: Array<string | undefined> = []; | |||
const engineErrorArray: Array<WriteErrorTypeForSaveAllResultDialog> = []; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
暫定的に既存の型をそのまま流用。
エラーダイアログを出す方針が確定したらWriteError
とEngineError
両方で使える型名に変更するか新しく型を定義する。
<q-item-section> | ||
<q-item-label>{{ value.path }}</q-item-label> | ||
<q-item-label v-if="value.message" | ||
>詳細:{{ value.message }}</q-item-label |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
すみません。
何故かcrlfの変換をかけてしまいました。
エンジンエラーの詳細を追加しました。
</template> | ||
|
||
<script lang="ts"> | ||
import { WriteErrorTypeForSaveAllResultDialog } from "@/store/type"; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
型付けのためのインポート追加
props: { | ||
successArray: { | ||
type: Array as PropType<string | undefined[]>, | ||
required: true, | ||
}, | ||
writeErrorArray: { | ||
type: Array as PropType<WriteErrorTypeForSaveAllResultDialog[]>, | ||
required: true, | ||
}, | ||
engineErrorArray: { | ||
type: Array as PropType<WriteErrorTypeForSaveAllResultDialog[]>, | ||
required: true, | ||
}, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
propsを型付け
src/store/type.ts
Outdated
export type GenerateAudioResultObject = | ||
| { | ||
result: "SUCCESS"; | ||
blob: Blob; | ||
} | ||
| { | ||
result: "VALID_MOPHING_ERROR" | "EDITOR_ERROR" | "ENGINE_ERROR"; | ||
errorMessage?: string; | ||
}; | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
GENERATE_AND_SAVE_AUDIO
にならってGenerateAudioResultObject
型を追加してエラーの内容とメッセージを追加。
エラーの種別は必要なかったかもしれない?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
AND_SAVE
ではないGENERATE_AUDIO
系は一旦throwのままでも良いかもと思いました!
現状なにか値を返すことがなく、型とメッセージで完結してるので・・・!
(new Error("hoge")
で指定した文字列はe.message
で取得できるはず)
どこかでエラーハンドリングし忘れてthrowできてない可能性を極力なくしたいためです。
(なのですが、そもそもエラーハンドリングをどうすべきかまだ結論が出せてなくて、将来は気持ちが変わってるかもです・・・ 🙇♂️ )
暫定的にエラーダイアログにモーフィングの設定が間違っていることが表示されるようにへんこうしてみました。 |
完了したら合図頂ければ・・・! |
すいません、コメントしたつもりになって送信できていませんでした。 |
とりあえずFIXMEコメント付けました。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM!!!!!!!!!!
お疲れ様でした!!!!
VOICEVOXエディタはなかなか複雑な構造をしているのですが、問題を的確に把握し、ガッツを持って取り組んでくださってとても嬉しかったです!!!
よければまたプルリクや提案issue頂けると嬉しいです、ありがとうございました!!
あ、zod化にともなってコンフリクトが起こっているようです 🙇♂️ エンジン側でモーフィングを実装してくださった @mes51 さん、せっかくなのでもしよければ実際にUIを触ってみたときのレビュー頂けませんか 👀 |
見させていただきまして、概ね問題無さそうでした。 Desktop.2023.01.14.-.20.46.59.02_1.mp4この問題に関しては、おそらくポップアップで出てくるUI共通の問題だと思う( |
お試しありがとうございます!! とりあえずいったんは表示される方向を下にするとかで解決可能なのかなと思いました! |
マージできました。 |
メニューの方向を下に固定することが思ったより難しそうです。 QMenuの |
なるほどです!!anchorを強制する方法、確かになさそうですね。。。 うーん、仕方ない気がします!諦めましょう…! |
あ、コンフリクト解消でプリセット保存回りの形情報が抜けたかもです! type/preload.tsにある これ型不一致エラーどこにも出てないっぽいですね。。難しい。。 |
強引に、q-menuの要素に |
@sevenc-nanashi |
zod周りも問題なさそうだったのでマージしたいと思います!! かなり長い期間の調整、広範囲の影響にも関わらず取り組んでいただき本当にありがとうございました!!! 改めて @mes51 さん、 @sabonerune さん、ありがとうございました!!! |
内容
モーフィングを適用するためのUIを追加します。
関連 Issue