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

複数エンジン対応:Engine manifestによるUI無効化 #919

Merged
merged 23 commits into from
Sep 13, 2022
Merged
Show file tree
Hide file tree
Changes from 15 commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
6978224
(PR用の空白コミット)
sevenc-nanashi Sep 3, 2022
d832aca
Merge: main -> add/disable-by-engine-manifest
sevenc-nanashi Sep 3, 2022
73656a1
Add: engineManifestのstoreを追加
sevenc-nanashi Sep 3, 2022
e765cd3
Fix: prettierの警告を修正
sevenc-nanashi Sep 3, 2022
5a69304
Revert "Add: engineManifestのstoreを追加"
sevenc-nanashi Sep 3, 2022
4db4e7e
Add: 初期火事にマニフェストを読み込むように
sevenc-nanashi Sep 3, 2022
dca783c
Add: AudioInfoの有効化・無効化を実装
sevenc-nanashi Sep 3, 2022
7145435
Add: 無効化時に半透明になるように
sevenc-nanashi Sep 3, 2022
672943b
Change: styleの記法を変更
sevenc-nanashi Sep 3, 2022
93a19f6
Fix: Prettierの警告を修正
sevenc-nanashi Sep 3, 2022
2336d50
Delete: デバッグ用の残りを削除
sevenc-nanashi Sep 3, 2022
ebcad0d
Add: イントネーション/長さの無効化を実装
sevenc-nanashi Sep 3, 2022
9235dda
Update: Vuexのstoreを更新
sevenc-nanashi Sep 3, 2022
2dae2a4
Revert: 不必要な変更を取り消し
sevenc-nanashi Sep 3, 2022
ab326d6
Add: コメントを追加
sevenc-nanashi Sep 8, 2022
273fa24
Change: テキストの無効化表示にdisabledクラスを使うように
sevenc-nanashi Sep 8, 2022
10ebf71
Add: TODOコメントを追加
sevenc-nanashi Sep 8, 2022
4d441b0
Delete: engineManifestを削除
sevenc-nanashi Sep 8, 2022
369c95b
Change: FETCH_AND_SET_ENGINE_MANIFESTSに変更
sevenc-nanashi Sep 8, 2022
bae7721
Delete: engineManifestを作らずsupportedFeaturesを設定するように
sevenc-nanashi Sep 8, 2022
3b65904
Change: supportedFeaturesをSupportedFeatures | undefinedに
sevenc-nanashi Sep 12, 2022
81727e7
Update src/components/AudioDetail.vue
Hiroshiba Sep 13, 2022
c00b1f7
Update src/components/AudioDetail.vue
Hiroshiba Sep 13, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 38 additions & 3 deletions src/components/AudioDetail.vue
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,16 @@
<div class="detail-selector">
<q-tabs dense vertical class="text-display" v-model="selectedDetail">
<q-tab name="accent" label="アクセント" />
<q-tab name="pitch" label="イントネーション" />
<q-tab name="length" label="長さ" />
<q-tab
name="pitch"
label="イントネーション"
:disable="!supportedFeatures.adjustMoraPitch"
/>
<q-tab
name="length"
label="長さ"
:disable="!supportedFeatures.adjustPhonemeLength"
/>
</q-tabs>
</div>
<div class="play-button-wrapper">
Expand Down Expand Up @@ -260,7 +268,7 @@ import AudioAccent from "./AudioAccent.vue";
import AudioParameter from "./AudioParameter.vue";
import { HotkeyAction, HotkeyReturnType, MoraDataType } from "@/type/preload";
import { setHotkeyFunctions } from "@/store/setting";
import { Mora } from "@/openapi/models";
import { EngineManifest, Mora } from "@/openapi/models";

export default defineComponent({
components: { AudioAccent, AudioParameter, Tip },
Expand Down Expand Up @@ -349,6 +357,32 @@ export default defineComponent({
const query = computed(() => audioItem.value?.query);
const accentPhrases = computed(() => query.value?.accentPhrases);

const engineManifest = computed(() =>
audioItem.value?.engineId
? store.state.engineManifests[audioItem.value.engineId]
: ({} as EngineManifest)
);
const supportedFeatures = computed(
() =>
engineManifest.value.supportedFeatures ||
({} as EngineManifest["supportedFeatures"])
);

// エンジンが変わったとき、selectedDetailが対応していないものを選択している場合はaccentに戻す
watch(
supportedFeatures,
(newFeatures) => {
if (
(!newFeatures?.adjustMoraPitch && selectedDetail.value === "pitch") ||
(!newFeatures?.adjustPhonemeLength &&
selectedDetail.value === "length")
) {
selectedDetail.value = "accent";
}
},
{ immediate: true }
);

const activePointScrollMode = computed(
() => store.state.activePointScrollMode
);
Expand Down Expand Up @@ -767,6 +801,7 @@ export default defineComponent({
activePoint,
setPlayAndStartPoint,
uiLocked,
supportedFeatures,
audioItem,
query,
accentPhrases,
Expand Down
67 changes: 57 additions & 10 deletions src/components/AudioInfo.vue
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,11 @@
</div>

<div class="q-mx-md">
<span class="text-body1 q-mb-xs"
<span
class="text-body1 q-mb-xs"
:style="{
opacity: `${speedScaleSlider.qSliderProps.disable.value ? 0.5 : 1}`,
}"
>話速 {{ speedScaleSlider.state.currentValue.value?.toFixed(2) }}</span
>
<q-slider
Expand All @@ -187,7 +191,11 @@
/>
</div>
<div class="q-px-md">
<span class="text-body1 q-mb-xs"
<span
class="text-body1 q-mb-xs"
:style="{
opacity: `${pitchScaleSlider.qSliderProps.disable.value ? 0.5 : 1}`,
}"
>音高 {{ pitchScaleSlider.state.currentValue.value?.toFixed(2) }}</span
>
<q-slider
Expand All @@ -209,7 +217,13 @@
/>
</div>
<div class="q-px-md">
<span class="text-body1 q-mb-xs"
<span
class="text-body1 q-mb-xs"
:style="{
opacity: `${
intonationScaleSlider.qSliderProps.disable.value ? 0.5 : 1
}`,
}"
>抑揚
{{ intonationScaleSlider.state.currentValue.value?.toFixed(2) }}</span
>
Expand All @@ -232,7 +246,11 @@
/>
</div>
<div class="q-px-md">
<span class="text-body1 q-mb-xs"
<span
class="text-body1 q-mb-xs"
:style="{
opacity: `${volumeScaleSlider.qSliderProps.disable.value ? 0.5 : 1}`,
}"
>音量 {{ volumeScaleSlider.state.currentValue.value?.toFixed(2) }}</span
>
<q-slider
Expand All @@ -254,7 +272,13 @@
/>
</div>
<div class="q-px-md">
<span class="text-body1 q-mb-xs"
<span
class="text-body1 q-mb-xs"
:style="{
opacity: `${
prePhonemeLengthSlider.qSliderProps.disable.value ? 0.5 : 1
}`,
}"
>開始無音
{{ prePhonemeLengthSlider.state.currentValue.value?.toFixed(2) }}</span
>
Expand All @@ -277,7 +301,13 @@
/>
</div>
<div class="q-px-md">
<span class="text-body1 q-mb-xs"
<span
class="text-body1 q-mb-xs"
:style="{
opacity: `${
postPhonemeLengthSlider.qSliderProps.disable.value ? 0.5 : 1
}`,
}"
>終了無音
{{ postPhonemeLengthSlider.state.currentValue.value?.toFixed(2) }}</span
>
Expand Down Expand Up @@ -310,6 +340,7 @@ import { useStore } from "@/store";
import { Preset } from "@/type/preload";
import { previewSliderHelper } from "@/helpers/previewSliderHelper";
import PresetManageDialog from "./PresetManageDialog.vue";
import { EngineManifest } from "@/openapi";

export default defineComponent({
name: "AudioInfo",
Expand All @@ -333,6 +364,17 @@ export default defineComponent({
);
const query = computed(() => audioItem.value?.query);

const engineManifest = computed(() =>
audioItem.value.engineId
? store.state.engineManifests[audioItem.value.engineId]
: ({} as EngineManifest)
);
const supportedFeatures = computed(
() =>
engineManifest.value.supportedFeatures ||
({} as EngineManifest["supportedFeatures"])
);

const applyPreset = () => {
store.dispatch("COMMAND_APPLY_AUDIO_PRESET", {
audioKey: props.activeAudioKey,
Expand Down Expand Up @@ -383,7 +425,8 @@ export default defineComponent({

const speedScaleSlider = previewSliderHelper({
modelValue: () => query.value?.speedScale ?? null,
disable: () => uiLocked.value,
disable: () =>
uiLocked.value || supportedFeatures.value?.adjustSpeedScale === false,
onChange: setAudioSpeedScale,
max: () => 2,
min: () => 0.5,
Expand All @@ -393,7 +436,8 @@ export default defineComponent({
});
const pitchScaleSlider = previewSliderHelper({
modelValue: () => query.value?.pitchScale ?? null,
disable: () => uiLocked.value,
disable: () =>
uiLocked.value || supportedFeatures.value?.adjustPitchScale === false,
onChange: setAudioPitchScale,
max: () => 0.15,
min: () => -0.15,
Expand All @@ -402,7 +446,9 @@ export default defineComponent({
});
const intonationScaleSlider = previewSliderHelper({
modelValue: () => query.value?.intonationScale ?? null,
disable: () => uiLocked.value,
disable: () =>
uiLocked.value ||
supportedFeatures.value?.adjustIntonationScale === false,
onChange: setAudioIntonationScale,
max: () => 2,
min: () => 0,
Expand All @@ -412,7 +458,8 @@ export default defineComponent({
});
const volumeScaleSlider = previewSliderHelper({
modelValue: () => query.value?.volumeScale ?? null,
disable: () => uiLocked.value,
disable: () =>
uiLocked.value || supportedFeatures.value?.adjustVolumeScale === false,
onChange: setAudioVolumeScale,
max: () => 2,
min: () => 0,
Expand Down
1 change: 1 addition & 0 deletions src/store/setting.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ export const settingStoreState: SettingStoreState = {
toolbarSetting: [],
engineIds: [],
engineInfos: {},
engineManifests: {},
themeSetting: {
currentTheme: "Default",
availableThemes: [],
Expand Down
14 changes: 13 additions & 1 deletion src/store/type.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,12 @@ import {
StoreOptions,
} from "./vuex";
import { Patch } from "immer";
import { AccentPhrase, AudioQuery, UserDictWord } from "@/openapi";
import {
AccentPhrase,
AudioQuery,
EngineManifest,
UserDictWord,
} from "@/openapi";
import { createCommandMutationTree, PayloadRecipeTree } from "./command";
import {
CharacterInfo,
Expand Down Expand Up @@ -843,6 +848,7 @@ export type SettingStoreState = {
toolbarSetting: ToolbarSetting;
engineIds: string[];
engineInfos: Record<string, EngineInfo>;
engineManifests: Record<string, EngineManifest>;
themeSetting: ThemeSetting;
acceptRetrieveTelemetry: AcceptRetrieveTelemetryStatus;
experimentalSetting: ExperimentalSetting;
Expand Down Expand Up @@ -1042,6 +1048,12 @@ type UiStoreTypes = {

SET_ENGINE_INFOS: { mutation: { engineInfos: EngineInfo[] } };

SET_ENGINE_MANIFESTS: {
mutation: { engineManifests: Record<string, EngineManifest> };
};

LOAD_ENGINE_MANIFESTS: { action(): void };

SET_INHERIT_AUDIOINFO: {
mutation: { inheritAudioInfo: boolean };
action(payload: { inheritAudioInfo: boolean }): void;
Expand Down
26 changes: 26 additions & 0 deletions src/store/ui.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import {
VoiceVoxStoreOptions,
} from "./type";
import { ActivePointScrollMode, EngineInfo } from "@/type/preload";
import { EngineManifest } from "@/openapi";

export function createUILockAction<S, A extends ActionsBase, K extends keyof A>(
action: (
Expand Down Expand Up @@ -147,6 +148,12 @@ export const uiStore: VoiceVoxStoreOptions<UiGetters, UiActions, UiMutations> =
engineInfos.map((engineInfo) => [engineInfo.uuid, "STARTING"])
);
},
SET_ENGINE_MANIFESTS(
state,
{ engineManifests }: { engineManifests: Record<string, EngineManifest> }
) {
state.engineManifests = engineManifests;
},
SET_INHERIT_AUDIOINFO(
state,
{ inheritAudioInfo }: { inheritAudioInfo: boolean }
Expand Down Expand Up @@ -387,6 +394,25 @@ export const uiStore: VoiceVoxStoreOptions<UiGetters, UiActions, UiMutations> =
engineInfos: await window.electron.engineInfos(),
});
},
async LOAD_ENGINE_MANIFESTS({ state, commit }) {
commit("SET_ENGINE_MANIFESTS", {
engineManifests: Object.fromEntries(
await Promise.all(
state.engineIds.map(
async (engineId) =>
await this.dispatch("INSTANTIATE_ENGINE_CONNECTOR", {
engineId,
}).then(async (instance) => [
engineId,
await instance.invoke("engineManifestEngineManifestGet")(
{}
),
])
)
)
),
});
},
async SET_INHERIT_AUDIOINFO(
{ commit },
{ inheritAudioInfo }: { inheritAudioInfo: boolean }
Expand Down
1 change: 1 addition & 0 deletions src/views/Home.vue
Original file line number Diff line number Diff line change
Expand Up @@ -469,6 +469,7 @@ export default defineComponent({
const isCompletedInitialStartup = ref(false);
onMounted(async () => {
await store.dispatch("GET_ENGINE_INFOS");
await store.dispatch("LOAD_ENGINE_MANIFESTS");

await store.dispatch("START_WAITING_ENGINE_ALL");
await store.dispatch("LOAD_CHARACTER_ALL");
Expand Down
22 changes: 22 additions & 0 deletions tests/unit/store/Vuex.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,28 @@ describe("store/vuex.js test", () => {
host: "http://127.0.0.1",
},
},
engineManifests: {
"88022f86-c823-436e-85a3-500c629749c4": {
manifestVersion: "0.13.0",
name: "DUMMY VOICEVOX ENGINE",
uuid: "c7b58856-bd56-4aa1-afb7-b8415f824b06",
url: "https://github.com/VOICEVOX/voicevox_engine",
icon: "engine_manifest_assets/icon.png",
defaultSamplingRate: 24000,
termsOfService: "engine_manifest_assets/terms_of_service.md",
updateInfos: [],
dependencyLicenses: [],
supportedFeatures: {
adjustMoraPitch: true,
adjustPhonemeLength: true,
adjustSpeedScale: true,
adjustPitchScale: true,
adjustIntonationScale: true,
adjustVolumeScale: true,
interrogativeUpspeak: true,
},
},
},
experimentalSetting: {
enablePreset: false,
enableInterrogativeUpspeak: false,
Expand Down