Skip to content

アクセント欄やイントネーション欄のスライダーが不必要にアニメーションするのを防ぎたい #1591

@Hiroshiba

Description

@Hiroshiba

内容

アクティブなテキスト欄を変更した時や、アクセント句の結合を変えた時、イントネーションやアクセントのスライダーが不必要にアニメーションします。

↓例えばこんな感じで、アクセント句の結合を変更した箇所より右側のスライダーが上下するアニメーションが入っちゃっています。

_VOICEVOX.-.Ver.999.999.999.2023-09-28.01-56-11.mp4

↓それをこんな感じでガチャガチャしないようにしたいです。

_VOICEVOX.-.Ver.999.999.999.2023-09-28.01-55-49.mp4

Pros 良くなる点

クリエイターの気が散らなくなる

Cons 悪くなる点

実現方法

こうなってしまっている原因は簡単で、AccentPhraseコンポーネントを並べる時のkeyをインデックスにしているためだと思います。

<div
v-for="(accentPhrase, accentPhraseIndex) in accentPhrases"
:key="accentPhraseIndex"
:ref="addAccentPhraseElem"
class="mora-table"
:class="[
accentPhraseIndex === activePoint && 'mora-table-focus',
uiLocked || 'mora-table-hover',
]"
@click="setPlayAndStartPoint(accentPhraseIndex)"
>
<accent-phrase
:audio-key="activeAudioKey"
:accent-phrase="accentPhrase"
:index="accentPhraseIndex"
:is-last="
accentPhrases !== undefined &&
accentPhrases.length - 1 === accentPhraseIndex
"
:selected-detail="selectedDetail"
:shift-key-flag="shiftKeyFlag"
:alt-key-flag="altKeyFlag"
/>
</div>
</div>

テキスト欄を移動したりアクセント句の結合を変更したりした場合、同じ場所(インデックス)にあるものを変更だと捉えてアニメーションが発生する感じだと思います。
実際は隣に移動したり全然違うものになっていたりするので、そういうものはkeyが異なるようにしてあげれば勝ちだと思います。

解決策も単純で、AccentPhrase変数それぞれで個別IDを生成して割り振れば良いはずです。
ただ現状AccentPhraseはエンジンが返してきた値をそのまま使っているので、IDを持てるようにエディター用の型を作成し、エンジンのものと相互変換する必要がありそうです。

AudioQuery変数はこんな感じ↓でエンジン用のとエディター用の型を分けて相互変換しているので、そのコードが参考になるかもしれません

export type EditorAudioQuery = Omit<AudioQuery, "outputSamplingRate"> & {
outputSamplingRate: number | "engineDefault";
};

voicevox/src/store/audio.ts

Lines 1316 to 1319 in f4f42d0

const engineAudioQuery = convertAudioQueryFromEditorToEngine(
audioQuery,
state.engineManifests[engineId].defaultSamplingRate
);

その他

初心者歓迎タスクラベルがついていますが、実装的にはちょっと難しいと思います。
結構色々変更する必要があって大変かもですが、わりと色々な勉強になると思うのでよかったら是非!

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions