From 90edfb00edbd0bd7f0d897100c628bc0c9ce924a Mon Sep 17 00:00:00 2001 From: X-20A <155217226+X-20A@users.noreply.github.com> Date: Tue, 12 Nov 2024 19:07:54 +0900 Subject: [PATCH 01/11] =?UTF-8?q?=E6=96=B0=E8=A6=8F=E3=83=96=E3=83=A9?= =?UTF-8?q?=E3=83=B3=E3=83=81[update=20snapshots]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Talk/AudioInfo.vue | 18 ++++++++++++ src/domain/project/index.ts | 1 + src/domain/project/schema.ts | 1 + src/openapi/models/Preset.ts | 1 + src/store/audio.ts | 47 ++++++++++++++++++++++++++++++- src/store/preset.ts | 1 + src/store/type.ts | 9 ++++++ src/store/utility.ts | 10 +++++++ src/type/preload.ts | 2 ++ 9 files changed, 89 insertions(+), 1 deletion(-) diff --git a/src/components/Talk/AudioInfo.vue b/src/components/Talk/AudioInfo.vue index 4bc03b77a6..2f88550845 100644 --- a/src/components/Talk/AudioInfo.vue +++ b/src/components/Talk/AudioInfo.vue @@ -470,6 +470,24 @@ const parameterConfigs = computed(() => [ }), key: "postPhonemeLength", }, + { + label: "文内無音倍率", + sliderProps: { + modelValue: () => query.value?.pauseLengthScale ?? null, + disable: () => uiLocked.value, + max: SLIDER_PARAMETERS.PAUSE_LENGTH_SCALE.max, + min: SLIDER_PARAMETERS.PAUSE_LENGTH_SCALE.min, + step: SLIDER_PARAMETERS.PAUSE_LENGTH_SCALE.step, + scrollStep: SLIDER_PARAMETERS.PAUSE_LENGTH_SCALE.scrollStep, + scrollMinStep: SLIDER_PARAMETERS.PAUSE_LENGTH_SCALE.scrollMinStep, + }, + onChange: (pauseLengthScale: number) => + store.actions.COMMAND_MULTI_SET_AUDIO_PAUSE_LENGTH_SCALE({ + audioKeys: selectedAudioKeys.value, + pauseLengthScale, + }), + key: "pauseLengthScale", + }, ]); /** パラメーター制御用 */ diff --git a/src/domain/project/index.ts b/src/domain/project/index.ts index 3f541af269..1deb9974a7 100644 --- a/src/domain/project/index.ts +++ b/src/domain/project/index.ts @@ -127,6 +127,7 @@ export const migrateProjectFileObject = async ( projectData.audioItems[audioItemsKey].query.volumeScale = 1; projectData.audioItems[audioItemsKey].query.prePhonemeLength = 0.1; projectData.audioItems[audioItemsKey].query.postPhonemeLength = 0.1; + projectData.audioItems[audioItemsKey].query.pauseLengthScale = 1; projectData.audioItems[audioItemsKey].query.outputSamplingRate = DEFAULT_SAMPLING_RATE; } diff --git a/src/domain/project/schema.ts b/src/domain/project/schema.ts index c23a6812f1..8a38cea26f 100644 --- a/src/domain/project/schema.ts +++ b/src/domain/project/schema.ts @@ -35,6 +35,7 @@ const audioQuerySchema = z.object({ volumeScale: z.number(), prePhonemeLength: z.number(), postPhonemeLength: z.number(), + pauseLengthScale: z.number(), outputSamplingRate: z.union([z.number(), z.literal("engineDefault")]), outputStereo: z.boolean(), kana: z.string().optional(), diff --git a/src/openapi/models/Preset.ts b/src/openapi/models/Preset.ts index 78af2e078d..a39799563d 100644 --- a/src/openapi/models/Preset.ts +++ b/src/openapi/models/Preset.ts @@ -108,6 +108,7 @@ export function instanceOfPreset(value: object): boolean { isInstance = isInstance && "volumeScale" in value; isInstance = isInstance && "prePhonemeLength" in value; isInstance = isInstance && "postPhonemeLength" in value; + isInstance = isInstance && "pauseLengthScale" in value; return isInstance; } diff --git a/src/store/audio.ts b/src/store/audio.ts index 0444f5b95a..9ef03bd106 100644 --- a/src/store/audio.ts +++ b/src/store/audio.ts @@ -739,6 +739,8 @@ export const audioStore = createPartialStore({ baseAudioItem.query.prePhonemeLength; newAudioItem.query.postPhonemeLength = baseAudioItem.query.postPhonemeLength; + newAudioItem.query.pauseLengthScale = + baseAudioItem.query.pauseLengthScale; newAudioItem.query.outputSamplingRate = baseAudioItem.query.outputSamplingRate; newAudioItem.query.outputStereo = baseAudioItem.query.outputStereo; @@ -919,6 +921,23 @@ export const audioStore = createPartialStore({ }, }, + SET_AUDIO_PAUSE_LENGTH_SCALE: { + mutation( + state, + { + audioKey, + pauseLengthScale, + }: { + audioKey: AudioKey; + pauseLengthScale: number; + }, + ) { + const query = state.audioItems[audioKey].query; + if (query == undefined) throw new Error("query == undefined"); + query.pauseLengthScale = pauseLengthScale; + }, + }, + SET_MORPHING_INFO: { mutation( state, @@ -1271,7 +1290,10 @@ export const audioStore = createPartialStore({ length += m.consonantLength != undefined ? m.consonantLength : 0; length += m.vowelLength; }); - length += phrase.pauseMora ? phrase.pauseMora.vowelLength : 0; + if (phrase.pauseMora != null && query.pauseLengthScale != undefined) { + const pauseLength = phrase.pauseMora.vowelLength; + length += pauseLength * query.pauseLengthScale; + } // post phoneme lengthは最後のアクセント句の一部として扱う if (i === accentPhrases.length - 1) { length += query.postPhonemeLength; @@ -2751,6 +2773,29 @@ export const audioCommandStore = transformCommandStore( }, }, + COMMAND_MULTI_SET_AUDIO_PAUSE_LENGTH_SCALE: { + mutation( + draft, + payload: { + audioKeys: AudioKey[]; + pauseLengthScale: number; + }, + ) { + for (const audioKey of payload.audioKeys) { + audioStore.mutations.SET_AUDIO_PAUSE_LENGTH_SCALE(draft, { + audioKey, + pauseLengthScale: payload.pauseLengthScale, + }); + } + }, + action( + { commit }, + payload: { audioKeys: AudioKey[]; pauseLengthScale: number }, + ) { + commit("COMMAND_MULTI_SET_AUDIO_PAUSE_LENGTH_SCALE", payload); + }, + }, + COMMAND_MULTI_SET_MORPHING_INFO: { mutation( draft, diff --git a/src/store/preset.ts b/src/store/preset.ts index c554fec1f3..dfd635dc4e 100644 --- a/src/store/preset.ts +++ b/src/store/preset.ts @@ -224,6 +224,7 @@ export const presetStore = createPartialStore({ volumeScale: 1.0, prePhonemeLength: 0.1, postPhonemeLength: 0.1, + pauseLengthScale: 1, }; const newPresetKey = await actions.ADD_PRESET({ presetData }); diff --git a/src/store/type.ts b/src/store/type.ts index 53468402c6..af8e2986cd 100644 --- a/src/store/type.ts +++ b/src/store/type.ts @@ -298,6 +298,10 @@ export type AudioStoreTypes = { mutation: { audioKey: AudioKey; postPhonemeLength: number }; }; + SET_AUDIO_PAUSE_LENGTH_SCALE: { + mutation: { audioKey: AudioKey; pauseLengthScale: number }; + }; + LOAD_MORPHABLE_TARGETS: { action(payload: { engineId: EngineId; baseStyleId: StyleId }): void; }; @@ -637,6 +641,11 @@ export type AudioCommandStoreTypes = { action(payload: { audioKeys: AudioKey[]; postPhonemeLength: number }): void; }; + COMMAND_MULTI_SET_AUDIO_PAUSE_LENGTH_SCALE: { + mutation: { audioKeys: AudioKey[]; pauseLengthScale: number }; + action(payload: { audioKeys: AudioKey[]; pauseLengthScale: number }): void; + }; + COMMAND_MULTI_SET_MORPHING_INFO: { mutation: { audioKeys: AudioKey[]; diff --git a/src/store/utility.ts b/src/store/utility.ts index c27bbe290f..1bbe75be38 100644 --- a/src/store/utility.ts +++ b/src/store/utility.ts @@ -105,6 +105,16 @@ export const SLIDER_PARAMETERS = { scrollStep: () => 0.1, scrollMinStep: () => 0.01, }, + /** + * 文内無音(倍率)パラメータの定義 + */ + PAUSE_LENGTH_SCALE: { + max: () => 2, + min: () => 0, + step: () => 0.01, + scrollStep: () => 0.1, + scrollMinStep: () => 0.01, + }, /** * モーフィングレートパラメータの定義 */ diff --git a/src/type/preload.ts b/src/type/preload.ts index 3fceecc791..55872ef44e 100644 --- a/src/type/preload.ts +++ b/src/type/preload.ts @@ -416,6 +416,7 @@ export type Preset = { volumeScale: number; prePhonemeLength: number; postPhonemeLength: number; + pauseLengthScale: number; morphingInfo?: MorphingInfo; }; @@ -645,6 +646,7 @@ export const configSchema = z volumeScale: z.number(), prePhonemeLength: z.number(), postPhonemeLength: z.number(), + pauseLengthScale: z.number(), morphingInfo: z .object({ rate: z.number(), From 8dcc83b14d60804ca5a262eaa837eb48f65482c1 Mon Sep 17 00:00:00 2001 From: X-20A <155217226+X-20A@users.noreply.github.com> Date: Tue, 12 Nov 2024 19:55:13 +0900 Subject: [PATCH 02/11] =?UTF-8?q?=E5=9E=8B=E4=BF=AE=E6=AD=A3[update=20snap?= =?UTF-8?q?shots]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/openapi/models/AudioQuery.ts | 3 ++- src/openapi/models/Preset.ts | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/openapi/models/AudioQuery.ts b/src/openapi/models/AudioQuery.ts index 8eeecebf6a..ad59b95877 100644 --- a/src/openapi/models/AudioQuery.ts +++ b/src/openapi/models/AudioQuery.ts @@ -79,7 +79,7 @@ export interface AudioQuery { * @type {number} * @memberof AudioQuery */ - pauseLengthScale?: number; + pauseLengthScale: number; /** * 音声データの出力サンプリングレート * @type {number} @@ -112,6 +112,7 @@ export function instanceOfAudioQuery(value: object): boolean { isInstance = isInstance && "volumeScale" in value; isInstance = isInstance && "prePhonemeLength" in value; isInstance = isInstance && "postPhonemeLength" in value; + isInstance = isInstance && "pauseLengthScale" in value; isInstance = isInstance && "outputSamplingRate" in value; isInstance = isInstance && "outputStereo" in value; diff --git a/src/openapi/models/Preset.ts b/src/openapi/models/Preset.ts index a39799563d..5f4cfe6371 100644 --- a/src/openapi/models/Preset.ts +++ b/src/openapi/models/Preset.ts @@ -90,7 +90,7 @@ export interface Preset { * @type {number} * @memberof Preset */ - pauseLengthScale?: number; + pauseLengthScale: number; } /** From 7694492bddb57aaedaa004aa954b7b11b4e9e0f1 Mon Sep 17 00:00:00 2001 From: Hiroshiba Date: Wed, 13 Nov 2024 08:48:09 +0900 Subject: [PATCH 03/11] =?UTF-8?q?Add:=20Config=E3=83=9E=E3=82=A4=E3=82=B0?= =?UTF-8?q?=E3=83=AC=E3=83=BC=E3=82=B7=E3=83=A7=E3=83=B3=E3=81=AB=E3=83=97?= =?UTF-8?q?=E3=83=AA=E3=82=BB=E3=83=83=E3=83=88=E3=81=AB=E6=96=87=E5=86=85?= =?UTF-8?q?=E7=84=A1=E9=9F=B3=E5=80=8D=E7=8E=87=E3=82=92=E8=BF=BD=E5=8A=A0?= =?UTF-8?q?=E3=81=97=E3=80=81=E3=83=97=E3=83=AD=E3=82=B8=E3=82=A7=E3=82=AF?= =?UTF-8?q?=E3=83=88=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB=E3=81=AE=E3=83=9E?= =?UTF-8?q?=E3=82=A4=E3=82=B0=E3=83=AC=E3=83=BC=E3=82=B7=E3=83=A7=E3=83=B3?= =?UTF-8?q?=E3=82=92=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/common/ConfigManager.ts | 11 +++++++++++ src/domain/project/index.ts | 9 ++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/backend/common/ConfigManager.ts b/src/backend/common/ConfigManager.ts index 20a00ee282..22f5db1d28 100644 --- a/src/backend/common/ConfigManager.ts +++ b/src/backend/common/ConfigManager.ts @@ -265,6 +265,17 @@ const migrations: [string, (store: Record) => unknown][] = [ return config; }, ], + [ + ">=0.22", + (config) => { + // プリセットに文内無音倍率を追加 + const presets = config.presets as ConfigType["presets"]; + for (const preset of Object.values(presets.items)) { + if (preset == undefined) throw new Error("preset == undefined"); + preset.pauseLengthScale = 1; + } + }, + ], ]; export type Metadata = { diff --git a/src/domain/project/index.ts b/src/domain/project/index.ts index 1deb9974a7..593d81f42c 100644 --- a/src/domain/project/index.ts +++ b/src/domain/project/index.ts @@ -127,7 +127,6 @@ export const migrateProjectFileObject = async ( projectData.audioItems[audioItemsKey].query.volumeScale = 1; projectData.audioItems[audioItemsKey].query.prePhonemeLength = 0.1; projectData.audioItems[audioItemsKey].query.postPhonemeLength = 0.1; - projectData.audioItems[audioItemsKey].query.pauseLengthScale = 1; projectData.audioItems[audioItemsKey].query.outputSamplingRate = DEFAULT_SAMPLING_RATE; } @@ -303,6 +302,14 @@ export const migrateProjectFileObject = async ( projectData.song.trackOrder = Object.keys(newTracks); } + if (semver.satisfies(projectAppVersion, "<0.22.0", semverSatisfiesOptions)) { + // 文内無音倍率の追加 + for (const audioItemsKey in projectData.talk.audioItems) { + projectData.talk.audioItems[audioItemsKey].query.pauseLengthScale = 1; + console.log(projectData.talk.audioItems[audioItemsKey].query); + } + } + // Validation check // トークはvalidateTalkProjectで検証する // ソングはSET_SCOREの中の`isValidScore`関数で検証される From 4eee2f057ec95bf64857011287990d58a3cb4595 Mon Sep 17 00:00:00 2001 From: Hiroshiba Date: Thu, 14 Nov 2024 10:47:35 +0900 Subject: [PATCH 04/11] =?UTF-8?q?openapi=E6=88=BB=E3=81=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/openapi/models/AudioQuery.ts | 3 +-- src/openapi/models/Preset.ts | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/openapi/models/AudioQuery.ts b/src/openapi/models/AudioQuery.ts index ad59b95877..8eeecebf6a 100644 --- a/src/openapi/models/AudioQuery.ts +++ b/src/openapi/models/AudioQuery.ts @@ -79,7 +79,7 @@ export interface AudioQuery { * @type {number} * @memberof AudioQuery */ - pauseLengthScale: number; + pauseLengthScale?: number; /** * 音声データの出力サンプリングレート * @type {number} @@ -112,7 +112,6 @@ export function instanceOfAudioQuery(value: object): boolean { isInstance = isInstance && "volumeScale" in value; isInstance = isInstance && "prePhonemeLength" in value; isInstance = isInstance && "postPhonemeLength" in value; - isInstance = isInstance && "pauseLengthScale" in value; isInstance = isInstance && "outputSamplingRate" in value; isInstance = isInstance && "outputStereo" in value; diff --git a/src/openapi/models/Preset.ts b/src/openapi/models/Preset.ts index 5f4cfe6371..78af2e078d 100644 --- a/src/openapi/models/Preset.ts +++ b/src/openapi/models/Preset.ts @@ -90,7 +90,7 @@ export interface Preset { * @type {number} * @memberof Preset */ - pauseLengthScale: number; + pauseLengthScale?: number; } /** @@ -108,7 +108,6 @@ export function instanceOfPreset(value: object): boolean { isInstance = isInstance && "volumeScale" in value; isInstance = isInstance && "prePhonemeLength" in value; isInstance = isInstance && "postPhonemeLength" in value; - isInstance = isInstance && "pauseLengthScale" in value; return isInstance; } From ad845ae7fcf85253801ad06145c36cf89e1549ca Mon Sep 17 00:00:00 2001 From: Hiroshiba Date: Thu, 14 Nov 2024 11:56:47 +0900 Subject: [PATCH 05/11] =?UTF-8?q?EditorAudioQuery=E5=9E=8B=E3=81=AE?= =?UTF-8?q?=E5=B0=8E=E5=85=A5=E3=81=A8AudioQuery=E3=81=AE=E5=A4=89?= =?UTF-8?q?=E6=8F=9B=E9=96=A2=E6=95=B0=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/store/audio.ts | 29 ++++++++++++++++++----------- src/store/proxy.ts | 11 +++++++++++ src/store/type.ts | 16 ++++++++++------ 3 files changed, 39 insertions(+), 17 deletions(-) diff --git a/src/store/audio.ts b/src/store/audio.ts index 9ef03bd106..22e87b40cf 100644 --- a/src/store/audio.ts +++ b/src/store/audio.ts @@ -11,6 +11,7 @@ import { AudioCommandStoreTypes, transformCommandStore, FetchAudioResult, + EditorAudioQuery, } from "./type"; import { buildAudioFileNameFromRawData, @@ -34,6 +35,7 @@ import { isMorphable, } from "./audioGenerate"; import { ContinuousPlayer } from "./audioContinuousPlayer"; +import { convertAudioQueryFromEngineToEditor } from "./proxy"; import { convertHiraToKana, convertLongVowel, @@ -968,13 +970,16 @@ export const audioStore = createPartialStore({ SET_AUDIO_QUERY: { mutation( state, - { audioKey, audioQuery }: { audioKey: AudioKey; audioQuery: AudioQuery }, + { + audioKey, + audioQuery, + }: { audioKey: AudioKey; audioQuery: EditorAudioQuery }, ) { state.audioItems[audioKey].query = audioQuery; }, action( { mutations }, - payload: { audioKey: AudioKey; audioQuery: AudioQuery }, + payload: { audioKey: AudioKey; audioQuery: EditorAudioQuery }, ) { mutations.SET_AUDIO_QUERY(payload); }, @@ -993,11 +998,13 @@ export const audioStore = createPartialStore({ .INSTANTIATE_ENGINE_CONNECTOR({ engineId, }) - .then((instance) => - instance.invoke("audioQueryAudioQueryPost")({ - text, - speaker: styleId, - }), + .then(async (instance) => + convertAudioQueryFromEngineToEditor( + await instance.invoke("audioQueryAudioQueryPost")({ + text, + speaker: styleId, + }), + ), ) .catch((error) => { window.backend.logError( @@ -1941,7 +1948,7 @@ export const audioCommandStore = transformCommandStore( payload: { audioKey: AudioKey; text: string } & ( | { update: "Text" } | { update: "AccentPhrases"; accentPhrases: AccentPhrase[] } - | { update: "AudioQuery"; query: AudioQuery } + | { update: "AudioQuery"; query: EditorAudioQuery } ), ) { audioStore.mutations.SET_AUDIO_TEXT(draft, { @@ -2047,7 +2054,7 @@ export const audioCommandStore = transformCommandStore( } | { update: "AudioQuery"; - query: AudioQuery; + query: EditorAudioQuery; } | { update: "OnlyVoice"; @@ -2111,7 +2118,7 @@ export const audioCommandStore = transformCommandStore( } | { update: "AudioQuery"; - query: AudioQuery; + query: EditorAudioQuery; } | { update: "OnlyVoice"; @@ -2122,7 +2129,7 @@ export const audioCommandStore = transformCommandStore( try { const audioItem = state.audioItems[audioKey]; if (audioItem.query == undefined) { - const query: AudioQuery = await actions.FETCH_AUDIO_QUERY({ + const query = await actions.FETCH_AUDIO_QUERY({ text: audioItem.text, engineId: voice.engineId, styleId: voice.styleId, diff --git a/src/store/proxy.ts b/src/store/proxy.ts index 6cc82334d2..82342bd632 100644 --- a/src/store/proxy.ts +++ b/src/store/proxy.ts @@ -43,6 +43,7 @@ const proxyStoreCreator = (_engineFactory: IEngineConnectorFactory) => { return proxyStore; }; +/** AudioQueryをエンジン用に変換する */ export const convertAudioQueryFromEditorToEngine = ( editorAudioQuery: EditorAudioQuery, defaultOutputSamplingRate: number, @@ -56,4 +57,14 @@ export const convertAudioQueryFromEditorToEngine = ( }; }; +/** AudioQueryをエディタ用に変換する */ +export const convertAudioQueryFromEngineToEditor = ( + engineAudioQuery: AudioQuery, +): EditorAudioQuery => { + return { + ...engineAudioQuery, + pauseLengthScale: engineAudioQuery.pauseLengthScale ?? 1, + }; +}; + export const proxyStore = proxyStoreCreator(OpenAPIEngineConnectorFactory); diff --git a/src/store/type.ts b/src/store/type.ts index af8e2986cd..09f20df236 100644 --- a/src/store/type.ts +++ b/src/store/type.ts @@ -76,8 +76,12 @@ import { /** * エディタ用のAudioQuery */ -export type EditorAudioQuery = Omit & { +export type EditorAudioQuery = Omit< + AudioQuery, + "outputSamplingRate" | "pauseLengthScale" +> & { outputSamplingRate: number | "engineDefault"; + pauseLengthScale: number; // AudioQueryと違って必須 }; export type AudioItem = { @@ -333,8 +337,8 @@ export type AudioStoreTypes = { }; SET_AUDIO_QUERY: { - mutation: { audioKey: AudioKey; audioQuery: AudioQuery }; - action(payload: { audioKey: AudioKey; audioQuery: AudioQuery }): void; + mutation: { audioKey: AudioKey; audioQuery: EditorAudioQuery }; + action(payload: { audioKey: AudioKey; audioQuery: EditorAudioQuery }): void; }; FETCH_AUDIO_QUERY: { @@ -342,7 +346,7 @@ export type AudioStoreTypes = { text: string; engineId: EngineId; styleId: StyleId; - }): Promise; + }): Promise; }; SET_AUDIO_VOICE: { @@ -510,7 +514,7 @@ export type AudioCommandStoreTypes = { mutation: { audioKey: AudioKey; text: string } & ( | { update: "Text" } | { update: "AccentPhrases"; accentPhrases: AccentPhrase[] } - | { update: "AudioQuery"; query: AudioQuery } + | { update: "AudioQuery"; query: EditorAudioQuery } ); action(payload: { audioKey: AudioKey; text: string }): void; }; @@ -526,7 +530,7 @@ export type AudioCommandStoreTypes = { } | { update: "AudioQuery"; - query: AudioQuery; + query: EditorAudioQuery; } | { update: "OnlyVoice"; From 24c04465f387bf5a42447f5c5de68d4981c85b1e Mon Sep 17 00:00:00 2001 From: Hiroshiba Date: Thu, 14 Nov 2024 12:03:46 +0900 Subject: [PATCH 06/11] =?UTF-8?q?=E3=82=A8=E3=83=B3=E3=82=B8=E3=83=B3?= =?UTF-8?q?=E3=81=A8=E3=81=AE=E9=81=95=E3=81=84=E3=82=92=E6=98=8E=E7=A2=BA?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/store/type.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/store/type.ts b/src/store/type.ts index 09f20df236..d547dd58c4 100644 --- a/src/store/type.ts +++ b/src/store/type.ts @@ -81,7 +81,7 @@ export type EditorAudioQuery = Omit< "outputSamplingRate" | "pauseLengthScale" > & { outputSamplingRate: number | "engineDefault"; - pauseLengthScale: number; // AudioQueryと違って必須 + pauseLengthScale: number; // エンジンと違って必須 }; export type AudioItem = { From 2295b72920fafcd49ae94d411a2b19a3fb5825ae Mon Sep 17 00:00:00 2001 From: X-20A <155217226+X-20A@users.noreply.github.com> Date: Fri, 15 Nov 2024 06:27:29 +0900 Subject: [PATCH 07/11] =?UTF-8?q?=E4=B8=80=E6=99=82=E3=82=B3=E3=83=9F?= =?UTF-8?q?=E3=83=83=E3=83=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- openapi.json | 2 +- src/components/Talk/AudioInfo.vue | 36 +++++++-------- src/domain/project/index.ts | 2 +- src/domain/project/schema.ts | 2 +- src/openapi/models/AudioQuery.ts | 16 +++---- src/openapi/models/Preset.ts | 16 +++---- src/store/audio.ts | 74 +++++++++++++++---------------- src/store/preset.ts | 2 +- src/store/type.ts | 18 ++++---- src/type/preload.ts | 4 +- 10 files changed, 86 insertions(+), 86 deletions(-) diff --git a/openapi.json b/openapi.json index b91b38e738..cc3615f053 100644 --- a/openapi.json +++ b/openapi.json @@ -1 +1 @@ -{"openapi":"3.1.0","info":{"title":"VOICEVOX Engine","description":"VOICEVOX の音声合成エンジンです。","version":"latest"},"paths":{"/audio_query":{"post":{"tags":["クエリ作成"],"summary":"音声合成用のクエリを作成する","description":"音声合成用のクエリの初期値を得ます。ここで得られたクエリはそのまま音声合成に利用できます。各値の意味は`Schemas`を参照してください。","operationId":"audio_query_audio_query_post","parameters":[{"name":"text","in":"query","required":true,"schema":{"type":"string","title":"Text"}},{"name":"speaker","in":"query","required":true,"schema":{"type":"integer","title":"Speaker"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudioQuery"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/audio_query_from_preset":{"post":{"tags":["クエリ作成"],"summary":"音声合成用のクエリをプリセットを用いて作成する","description":"音声合成用のクエリの初期値を得ます。ここで得られたクエリはそのまま音声合成に利用できます。各値の意味は`Schemas`を参照してください。","operationId":"audio_query_from_preset_audio_query_from_preset_post","parameters":[{"name":"text","in":"query","required":true,"schema":{"type":"string","title":"Text"}},{"name":"preset_id","in":"query","required":true,"schema":{"type":"integer","title":"Preset Id"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudioQuery"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/accent_phrases":{"post":{"tags":["クエリ編集"],"summary":"テキストからアクセント句を得る","description":"テキストからアクセント句を得ます。\nis_kanaが`true`のとき、テキストは次のAquesTalk 風記法で解釈されます。デフォルトは`false`です。\n* 全てのカナはカタカナで記述される\n* アクセント句は`/`または`、`で区切る。`、`で区切った場合に限り無音区間が挿入される。\n* カナの手前に`_`を入れるとそのカナは無声化される\n* アクセント位置を`'`で指定する。全てのアクセント句にはアクセント位置を1つ指定する必要がある。\n* アクセント句末に`?`(全角)を入れることにより疑問文の発音ができる。","operationId":"accent_phrases_accent_phrases_post","parameters":[{"name":"text","in":"query","required":true,"schema":{"type":"string","title":"Text"}},{"name":"speaker","in":"query","required":true,"schema":{"type":"integer","title":"Speaker"}},{"name":"is_kana","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Is Kana"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AccentPhrase"},"title":"Response Accent Phrases Accent Phrases Post"}}}},"400":{"description":"読み仮名のパースに失敗","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParseKanaBadRequest"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mora_data":{"post":{"tags":["クエリ編集"],"summary":"アクセント句から音高・音素長を得る","operationId":"mora_data_mora_data_post","parameters":[{"name":"speaker","in":"query","required":true,"schema":{"type":"integer","title":"Speaker"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AccentPhrase"},"title":"Accent Phrases"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AccentPhrase"},"title":"Response Mora Data Mora Data Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mora_length":{"post":{"tags":["クエリ編集"],"summary":"アクセント句から音素長を得る","operationId":"mora_length_mora_length_post","parameters":[{"name":"speaker","in":"query","required":true,"schema":{"type":"integer","title":"Speaker"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AccentPhrase"},"title":"Accent Phrases"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AccentPhrase"},"title":"Response Mora Length Mora Length Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mora_pitch":{"post":{"tags":["クエリ編集"],"summary":"アクセント句から音高を得る","operationId":"mora_pitch_mora_pitch_post","parameters":[{"name":"speaker","in":"query","required":true,"schema":{"type":"integer","title":"Speaker"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AccentPhrase"},"title":"Accent Phrases"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AccentPhrase"},"title":"Response Mora Pitch Mora Pitch Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/synthesis":{"post":{"tags":["音声合成"],"summary":"音声合成する","operationId":"synthesis_synthesis_post","parameters":[{"name":"speaker","in":"query","required":true,"schema":{"type":"integer","title":"Speaker"}},{"name":"enable_interrogative_upspeak","in":"query","required":false,"schema":{"type":"boolean","description":"疑問系のテキストが与えられたら語尾を自動調整する","default":true,"title":"Enable Interrogative Upspeak"},"description":"疑問系のテキストが与えられたら語尾を自動調整する"},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudioQuery"}}}},"responses":{"200":{"description":"Successful Response","content":{"audio/wav":{"schema":{"type":"string","format":"binary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/cancellable_synthesis":{"post":{"tags":["音声合成"],"summary":"音声合成する(キャンセル可能)","operationId":"cancellable_synthesis_cancellable_synthesis_post","parameters":[{"name":"speaker","in":"query","required":true,"schema":{"type":"integer","title":"Speaker"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudioQuery"}}}},"responses":{"200":{"description":"Successful Response","content":{"audio/wav":{"schema":{"type":"string","format":"binary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/multi_synthesis":{"post":{"tags":["音声合成"],"summary":"複数まとめて音声合成する","operationId":"multi_synthesis_multi_synthesis_post","parameters":[{"name":"speaker","in":"query","required":true,"schema":{"type":"integer","title":"Speaker"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AudioQuery"},"title":"Queries"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/zip":{"schema":{"type":"string","format":"binary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sing_frame_audio_query":{"post":{"tags":["クエリ作成"],"summary":"歌唱音声合成用のクエリを作成する","description":"歌唱音声合成用のクエリの初期値を得ます。ここで得られたクエリはそのまま歌唱音声合成に利用できます。各値の意味は`Schemas`を参照してください。","operationId":"sing_frame_audio_query_sing_frame_audio_query_post","parameters":[{"name":"speaker","in":"query","required":true,"schema":{"type":"integer","title":"Speaker"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Score"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FrameAudioQuery"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sing_frame_volume":{"post":{"tags":["クエリ編集"],"summary":"スコア・歌唱音声合成用のクエリからフレームごとの音量を得る","operationId":"sing_frame_volume_sing_frame_volume_post","parameters":[{"name":"speaker","in":"query","required":true,"schema":{"type":"integer","title":"Speaker"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_sing_frame_volume_sing_frame_volume_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"number"},"title":"Response Sing Frame Volume Sing Frame Volume Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/frame_synthesis":{"post":{"tags":["音声合成"],"summary":"Frame Synthesis","description":"歌唱音声合成を行います。","operationId":"frame_synthesis_frame_synthesis_post","parameters":[{"name":"speaker","in":"query","required":true,"schema":{"type":"integer","title":"Speaker"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FrameAudioQuery"}}}},"responses":{"200":{"description":"Successful Response","content":{"audio/wav":{"schema":{"type":"string","format":"binary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/connect_waves":{"post":{"tags":["その他"],"summary":"base64エンコードされた複数のwavデータを一つに結合する","description":"base64エンコードされたwavデータを一纏めにし、wavファイルで返します。","operationId":"connect_waves_connect_waves_post","requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array","title":"Waves"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"audio/wav":{"schema":{"type":"string","format":"binary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/validate_kana":{"post":{"tags":["その他"],"summary":"テキストがAquesTalk 風記法に従っているか判定する","description":"テキストがAquesTalk 風記法に従っているかどうかを判定します。\n従っていない場合はエラーが返ります。","operationId":"validate_kana_validate_kana_post","parameters":[{"name":"text","in":"query","required":true,"schema":{"type":"string","description":"判定する対象の文字列","title":"Text"},"description":"判定する対象の文字列"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"boolean","title":"Response Validate Kana Validate Kana Post"}}}},"400":{"description":"テキストが不正です","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParseKanaBadRequest"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/initialize_speaker":{"post":{"tags":["その他"],"summary":"Initialize Speaker","description":"指定されたスタイルを初期化します。\n実行しなくても他のAPIは使用できますが、初回実行時に時間がかかることがあります。","operationId":"initialize_speaker_initialize_speaker_post","parameters":[{"name":"speaker","in":"query","required":true,"schema":{"type":"integer","title":"Speaker"}},{"name":"skip_reinit","in":"query","required":false,"schema":{"type":"boolean","description":"既に初期化済みのスタイルの再初期化をスキップするかどうか","default":false,"title":"Skip Reinit"},"description":"既に初期化済みのスタイルの再初期化をスキップするかどうか"},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/is_initialized_speaker":{"get":{"tags":["その他"],"summary":"Is Initialized Speaker","description":"指定されたスタイルが初期化されているかどうかを返します。","operationId":"is_initialized_speaker_is_initialized_speaker_get","parameters":[{"name":"speaker","in":"query","required":true,"schema":{"type":"integer","title":"Speaker"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"boolean","title":"Response Is Initialized Speaker Is Initialized Speaker Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/supported_devices":{"get":{"tags":["その他"],"summary":"Supported Devices","description":"対応デバイスの一覧を取得します。","operationId":"supported_devices_supported_devices_get","parameters":[{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SupportedDevicesInfo"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/morphable_targets":{"post":{"tags":["音声合成"],"summary":"指定したスタイルに対してエンジン内のキャラクターがモーフィングが可能か判定する","description":"指定されたベーススタイルに対してエンジン内の各キャラクターがモーフィング機能を利用可能か返します。\nモーフィングの許可/禁止は`/speakers`の`speaker.supported_features.synthesis_morphing`に記載されています。\nプロパティが存在しない場合は、モーフィングが許可されているとみなします。\n返り値のスタイルIDはstring型なので注意。","operationId":"morphable_targets_morphable_targets_post","parameters":[{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"type":"integer"},"title":"Base Style Ids"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/MorphableTargetInfo"}},"title":"Response Morphable Targets Morphable Targets Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/synthesis_morphing":{"post":{"tags":["音声合成"],"summary":"2種類のスタイルでモーフィングした音声を合成する","description":"指定された2種類のスタイルで音声を合成、指定した割合でモーフィングした音声を得ます。\nモーフィングの割合は`morph_rate`で指定でき、0.0でベースのスタイル、1.0でターゲットのスタイルに近づきます。","operationId":"_synthesis_morphing_synthesis_morphing_post","parameters":[{"name":"base_speaker","in":"query","required":true,"schema":{"type":"integer","title":"Base Speaker"}},{"name":"target_speaker","in":"query","required":true,"schema":{"type":"integer","title":"Target Speaker"}},{"name":"morph_rate","in":"query","required":true,"schema":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Morph Rate"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudioQuery"}}}},"responses":{"200":{"description":"Successful Response","content":{"audio/wav":{"schema":{"type":"string","format":"binary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/presets":{"get":{"tags":["その他"],"summary":"Get Presets","description":"エンジンが保持しているプリセットの設定を返します","operationId":"get_presets_presets_get","responses":{"200":{"description":"プリセットのリスト","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/Preset"},"type":"array","title":"Response Get Presets Presets Get"}}}}}}},"/add_preset":{"post":{"tags":["その他"],"summary":"Add Preset","description":"新しいプリセットを追加します","operationId":"add_preset_add_preset_post","requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Preset"}],"title":"Preset","description":"新しいプリセット。プリセットIDが既存のものと重複している場合は、新規のプリセットIDが採番されます。"}}},"required":true},"responses":{"200":{"description":"追加したプリセットのプリセットID","content":{"application/json":{"schema":{"type":"integer","title":"Response Add Preset Add Preset Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/update_preset":{"post":{"tags":["その他"],"summary":"Update Preset","description":"既存のプリセットを更新します","operationId":"update_preset_update_preset_post","requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Preset"}],"title":"Preset","description":"更新するプリセット。プリセットIDが更新対象と一致している必要があります。"}}},"required":true},"responses":{"200":{"description":"更新したプリセットのプリセットID","content":{"application/json":{"schema":{"type":"integer","title":"Response Update Preset Update Preset Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/delete_preset":{"post":{"tags":["その他"],"summary":"Delete Preset","description":"既存のプリセットを削除します","operationId":"delete_preset_delete_preset_post","parameters":[{"name":"id","in":"query","required":true,"schema":{"type":"integer","description":"削除するプリセットのプリセットID","title":"Id"},"description":"削除するプリセットのプリセットID"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/speakers":{"get":{"tags":["その他"],"summary":"Speakers","description":"喋れるキャラクターの情報の一覧を返します。","operationId":"speakers_speakers_get","parameters":[{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Speaker"},"title":"Response Speakers Speakers Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/speaker_info":{"get":{"tags":["その他"],"summary":"Speaker Info","description":"UUID で指定された喋れるキャラクターの情報を返します。\n画像や音声はresource_formatで指定した形式で返されます。","operationId":"speaker_info_speaker_info_get","parameters":[{"name":"speaker_uuid","in":"query","required":true,"schema":{"type":"string","title":"Speaker Uuid"}},{"name":"resource_format","in":"query","required":false,"schema":{"enum":["base64","url"],"type":"string","default":"base64","title":"Resource Format"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpeakerInfo"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/singers":{"get":{"tags":["その他"],"summary":"Singers","description":"歌えるキャラクターの情報の一覧を返します。","operationId":"singers_singers_get","parameters":[{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Speaker"},"title":"Response Singers Singers Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/singer_info":{"get":{"tags":["その他"],"summary":"Singer Info","description":"UUID で指定された歌えるキャラクターの情報を返します。\n画像や音声はresource_formatで指定した形式で返されます。","operationId":"singer_info_singer_info_get","parameters":[{"name":"speaker_uuid","in":"query","required":true,"schema":{"type":"string","title":"Speaker Uuid"}},{"name":"resource_format","in":"query","required":false,"schema":{"enum":["base64","url"],"type":"string","default":"base64","title":"Resource Format"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpeakerInfo"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/downloadable_libraries":{"get":{"tags":["音声ライブラリ管理"],"summary":"Downloadable Libraries","description":"ダウンロード可能な音声ライブラリの情報を返します。","operationId":"downloadable_libraries_downloadable_libraries_get","responses":{"200":{"description":"ダウンロード可能な音声ライブラリの情報リスト","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/DownloadableLibraryInfo"},"type":"array","title":"Response Downloadable Libraries Downloadable Libraries Get"}}}}}}},"/installed_libraries":{"get":{"tags":["音声ライブラリ管理"],"summary":"Installed Libraries","description":"インストールした音声ライブラリの情報を返します。","operationId":"installed_libraries_installed_libraries_get","responses":{"200":{"description":"インストールした音声ライブラリの情報","content":{"application/json":{"schema":{"additionalProperties":{"$ref":"#/components/schemas/InstalledLibraryInfo"},"type":"object","title":"Response Installed Libraries Installed Libraries Get"}}}}}}},"/install_library/{library_uuid}":{"post":{"tags":["音声ライブラリ管理"],"summary":"Install Library","description":"音声ライブラリをインストールします。\n音声ライブラリのZIPファイルをリクエストボディとして送信してください。","operationId":"install_library_install_library__library_uuid__post","parameters":[{"name":"library_uuid","in":"path","required":true,"schema":{"type":"string","description":"音声ライブラリのID","title":"Library Uuid"},"description":"音声ライブラリのID"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/uninstall_library/{library_uuid}":{"post":{"tags":["音声ライブラリ管理"],"summary":"Uninstall Library","description":"音声ライブラリをアンインストールします。","operationId":"uninstall_library_uninstall_library__library_uuid__post","parameters":[{"name":"library_uuid","in":"path","required":true,"schema":{"type":"string","description":"音声ライブラリのID","title":"Library Uuid"},"description":"音声ライブラリのID"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/user_dict":{"get":{"tags":["ユーザー辞書"],"summary":"Get User Dict Words","description":"ユーザー辞書に登録されている単語の一覧を返します。\n単語の表層形(surface)は正規化済みの物を返します。","operationId":"get_user_dict_words_user_dict_get","responses":{"200":{"description":"単語のUUIDとその詳細","content":{"application/json":{"schema":{"additionalProperties":{"$ref":"#/components/schemas/UserDictWord"},"type":"object","title":"Response Get User Dict Words User Dict Get"}}}}}}},"/user_dict_word":{"post":{"tags":["ユーザー辞書"],"summary":"Add User Dict Word","description":"ユーザー辞書に言葉を追加します。","operationId":"add_user_dict_word_user_dict_word_post","parameters":[{"name":"surface","in":"query","required":true,"schema":{"type":"string","description":"言葉の表層形","title":"Surface"},"description":"言葉の表層形"},{"name":"pronunciation","in":"query","required":true,"schema":{"type":"string","description":"言葉の発音(カタカナ)","title":"Pronunciation"},"description":"言葉の発音(カタカナ)"},{"name":"accent_type","in":"query","required":true,"schema":{"type":"integer","description":"アクセント型(音が下がる場所を指す)","title":"Accent Type"},"description":"アクセント型(音が下がる場所を指す)"},{"name":"word_type","in":"query","required":false,"schema":{"allOf":[{"$ref":"#/components/schemas/WordTypes"}],"description":"PROPER_NOUN(固有名詞)、COMMON_NOUN(普通名詞)、VERB(動詞)、ADJECTIVE(形容詞)、SUFFIX(語尾)のいずれか","title":"Word Type"},"description":"PROPER_NOUN(固有名詞)、COMMON_NOUN(普通名詞)、VERB(動詞)、ADJECTIVE(形容詞)、SUFFIX(語尾)のいずれか"},{"name":"priority","in":"query","required":false,"schema":{"type":"integer","description":"単語の優先度(0から10までの整数)。数字が大きいほど優先度が高くなる。1から9までの値を指定することを推奨","maximum":10,"minimum":0,"title":"Priority"},"description":"単語の優先度(0から10までの整数)。数字が大きいほど優先度が高くなる。1から9までの値を指定することを推奨"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"string","title":"Response Add User Dict Word User Dict Word Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/user_dict_word/{word_uuid}":{"put":{"tags":["ユーザー辞書"],"summary":"Rewrite User Dict Word","description":"ユーザー辞書に登録されている言葉を更新します。","operationId":"rewrite_user_dict_word_user_dict_word__word_uuid__put","parameters":[{"name":"word_uuid","in":"path","required":true,"schema":{"type":"string","description":"更新する言葉のUUID","title":"Word Uuid"},"description":"更新する言葉のUUID"},{"name":"surface","in":"query","required":true,"schema":{"type":"string","description":"言葉の表層形","title":"Surface"},"description":"言葉の表層形"},{"name":"pronunciation","in":"query","required":true,"schema":{"type":"string","description":"言葉の発音(カタカナ)","title":"Pronunciation"},"description":"言葉の発音(カタカナ)"},{"name":"accent_type","in":"query","required":true,"schema":{"type":"integer","description":"アクセント型(音が下がる場所を指す)","title":"Accent Type"},"description":"アクセント型(音が下がる場所を指す)"},{"name":"word_type","in":"query","required":false,"schema":{"allOf":[{"$ref":"#/components/schemas/WordTypes"}],"description":"PROPER_NOUN(固有名詞)、COMMON_NOUN(普通名詞)、VERB(動詞)、ADJECTIVE(形容詞)、SUFFIX(語尾)のいずれか","title":"Word Type"},"description":"PROPER_NOUN(固有名詞)、COMMON_NOUN(普通名詞)、VERB(動詞)、ADJECTIVE(形容詞)、SUFFIX(語尾)のいずれか"},{"name":"priority","in":"query","required":false,"schema":{"type":"integer","description":"単語の優先度(0から10までの整数)。数字が大きいほど優先度が高くなる。1から9までの値を指定することを推奨。","maximum":10,"minimum":0,"title":"Priority"},"description":"単語の優先度(0から10までの整数)。数字が大きいほど優先度が高くなる。1から9までの値を指定することを推奨。"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["ユーザー辞書"],"summary":"Delete User Dict Word","description":"ユーザー辞書に登録されている言葉を削除します。","operationId":"delete_user_dict_word_user_dict_word__word_uuid__delete","parameters":[{"name":"word_uuid","in":"path","required":true,"schema":{"type":"string","description":"削除する言葉のUUID","title":"Word Uuid"},"description":"削除する言葉のUUID"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/import_user_dict":{"post":{"tags":["ユーザー辞書"],"summary":"Import User Dict Words","description":"他のユーザー辞書をインポートします。","operationId":"import_user_dict_words_import_user_dict_post","parameters":[{"name":"override","in":"query","required":true,"schema":{"type":"boolean","description":"重複したエントリがあった場合、上書きするかどうか","title":"Override"},"description":"重複したエントリがあった場合、上書きするかどうか"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/UserDictWord"},"description":"インポートするユーザー辞書のデータ","title":"Import Dict Data"}}}},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/version":{"get":{"tags":["その他"],"summary":"Version","description":"エンジンのバージョンを取得します。","operationId":"version_version_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"string","title":"Response Version Version Get"}}}}}}},"/core_versions":{"get":{"tags":["その他"],"summary":"Core Versions","description":"利用可能なコアのバージョン一覧を取得します。","operationId":"core_versions_core_versions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array","title":"Response Core Versions Core Versions Get"}}}}}}},"/engine_manifest":{"get":{"tags":["その他"],"summary":"Engine Manifest","description":"エンジンマニフェストを取得します。","operationId":"engine_manifest_engine_manifest_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EngineManifest"}}}}}}},"/setting":{"get":{"tags":["設定"],"summary":"Setting Get","description":"設定ページを返します。","operationId":"setting_get_setting_get","responses":{"200":{"description":"Successful Response"}}},"post":{"tags":["設定"],"summary":"Setting Post","description":"設定を更新します。","operationId":"setting_post_setting_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_setting_post_setting_post"}}},"required":true},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/":{"get":{"tags":["その他"],"summary":"Get Portal Page","description":"ポータルページを返します。","operationId":"get_portal_page__get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}}},"components":{"schemas":{"AccentPhrase":{"properties":{"moras":{"items":{"$ref":"#/components/schemas/Mora"},"type":"array","title":"Moras","description":"モーラのリスト"},"accent":{"type":"integer","title":"Accent","description":"アクセント箇所"},"pause_mora":{"allOf":[{"$ref":"#/components/schemas/Mora"}],"title":"Pause Mora","description":"後ろに無音を付けるかどうか"},"is_interrogative":{"type":"boolean","title":"Is Interrogative","description":"疑問系かどうか","default":false}},"type":"object","required":["moras","accent"],"title":"AccentPhrase","description":"アクセント句ごとの情報"},"AudioQuery":{"properties":{"accent_phrases":{"items":{"$ref":"#/components/schemas/AccentPhrase"},"type":"array","title":"Accent Phrases","description":"アクセント句のリスト"},"speedScale":{"type":"number","title":"Speedscale","description":"全体の話速"},"pitchScale":{"type":"number","title":"Pitchscale","description":"全体の音高"},"intonationScale":{"type":"number","title":"Intonationscale","description":"全体の抑揚"},"volumeScale":{"type":"number","title":"Volumescale","description":"全体の音量"},"prePhonemeLength":{"type":"number","title":"Prephonemelength","description":"音声の前の無音時間"},"postPhonemeLength":{"type":"number","title":"Postphonemelength","description":"音声の後の無音時間"},"pauseLength":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Pauselength","description":"句読点などの無音時間。nullのときは無視される。デフォルト値はnull"},"pauseLengthScale":{"type":"number","title":"Pauselengthscale","description":"句読点などの無音時間(倍率)。デフォルト値は1","default":1},"outputSamplingRate":{"type":"integer","title":"Outputsamplingrate","description":"音声データの出力サンプリングレート"},"outputStereo":{"type":"boolean","title":"Outputstereo","description":"音声データをステレオ出力するか否か"},"kana":{"type":"string","title":"Kana","description":"[読み取り専用]AquesTalk 風記法によるテキスト。音声合成用のクエリとしては無視される"}},"type":"object","required":["accent_phrases","speedScale","pitchScale","intonationScale","volumeScale","prePhonemeLength","postPhonemeLength","outputSamplingRate","outputStereo"],"title":"AudioQuery","description":"音声合成用のクエリ"},"Body_setting_post_setting_post":{"properties":{"cors_policy_mode":{"$ref":"#/components/schemas/CorsPolicyMode"},"allow_origin":{"type":"string","title":"Allow Origin"}},"type":"object","required":["cors_policy_mode"],"title":"Body_setting_post_setting_post"},"Body_sing_frame_volume_sing_frame_volume_post":{"properties":{"score":{"$ref":"#/components/schemas/Score"},"frame_audio_query":{"$ref":"#/components/schemas/FrameAudioQuery"}},"type":"object","required":["score","frame_audio_query"],"title":"Body_sing_frame_volume_sing_frame_volume_post"},"CorsPolicyMode":{"type":"string","enum":["all","localapps"],"title":"CorsPolicyMode","description":"CORSの許可モード"},"DownloadableLibraryInfo":{"properties":{"name":{"type":"string","title":"Name","description":"音声ライブラリの名前"},"uuid":{"type":"string","title":"Uuid","description":"音声ライブラリのUUID"},"version":{"type":"string","title":"Version","description":"音声ライブラリのバージョン"},"download_url":{"type":"string","title":"Download Url","description":"音声ライブラリのダウンロードURL"},"bytes":{"type":"integer","title":"Bytes","description":"音声ライブラリのバイト数"},"speakers":{"items":{"$ref":"#/components/schemas/LibrarySpeaker"},"type":"array","title":"Speakers","description":"音声ライブラリに含まれるキャラクターのリスト"}},"type":"object","required":["name","uuid","version","download_url","bytes","speakers"],"title":"DownloadableLibraryInfo","description":"ダウンロード可能な音声ライブラリの情報"},"EngineManifest":{"properties":{"manifest_version":{"type":"string","title":"Manifest Version","description":"マニフェストのバージョン"},"name":{"type":"string","title":"Name","description":"エンジン名"},"brand_name":{"type":"string","title":"Brand Name","description":"ブランド名"},"uuid":{"type":"string","title":"Uuid","description":"エンジンのUUID"},"url":{"type":"string","title":"Url","description":"エンジンのURL"},"icon":{"type":"string","title":"Icon","description":"エンジンのアイコンをBASE64エンコードしたもの"},"default_sampling_rate":{"type":"integer","title":"Default Sampling Rate","description":"デフォルトのサンプリング周波数"},"frame_rate":{"type":"number","title":"Frame Rate","description":"エンジンのフレームレート"},"terms_of_service":{"type":"string","title":"Terms Of Service","description":"エンジンの利用規約"},"update_infos":{"items":{"$ref":"#/components/schemas/UpdateInfo"},"type":"array","title":"Update Infos","description":"エンジンのアップデート情報"},"dependency_licenses":{"items":{"$ref":"#/components/schemas/LicenseInfo"},"type":"array","title":"Dependency Licenses","description":"依存関係のライセンス情報"},"supported_vvlib_manifest_version":{"type":"string","title":"Supported Vvlib Manifest Version","description":"エンジンが対応するvvlibのバージョン"},"supported_features":{"allOf":[{"$ref":"#/components/schemas/SupportedFeatures"}],"description":"エンジンが持つ機能"}},"type":"object","required":["manifest_version","name","brand_name","uuid","url","icon","default_sampling_rate","frame_rate","terms_of_service","update_infos","dependency_licenses","supported_features"],"title":"EngineManifest","description":"エンジン自体に関する情報"},"FrameAudioQuery":{"properties":{"f0":{"items":{"type":"number"},"type":"array","title":"F0","description":"フレームごとの基本周波数"},"volume":{"items":{"type":"number"},"type":"array","title":"Volume","description":"フレームごとの音量"},"phonemes":{"items":{"$ref":"#/components/schemas/FramePhoneme"},"type":"array","title":"Phonemes","description":"音素のリスト"},"volumeScale":{"type":"number","title":"Volumescale","description":"全体の音量"},"outputSamplingRate":{"type":"integer","title":"Outputsamplingrate","description":"音声データの出力サンプリングレート"},"outputStereo":{"type":"boolean","title":"Outputstereo","description":"音声データをステレオ出力するか否か"}},"type":"object","required":["f0","volume","phonemes","volumeScale","outputSamplingRate","outputStereo"],"title":"FrameAudioQuery","description":"フレームごとの音声合成用のクエリ"},"FramePhoneme":{"properties":{"phoneme":{"type":"string","title":"Phoneme","description":"音素"},"frame_length":{"type":"integer","title":"Frame Length","description":"音素のフレーム長"},"note_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note Id","description":"音符のID"}},"type":"object","required":["phoneme","frame_length"],"title":"FramePhoneme","description":"音素の情報"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"InstalledLibraryInfo":{"properties":{"name":{"type":"string","title":"Name","description":"音声ライブラリの名前"},"uuid":{"type":"string","title":"Uuid","description":"音声ライブラリのUUID"},"version":{"type":"string","title":"Version","description":"音声ライブラリのバージョン"},"download_url":{"type":"string","title":"Download Url","description":"音声ライブラリのダウンロードURL"},"bytes":{"type":"integer","title":"Bytes","description":"音声ライブラリのバイト数"},"speakers":{"items":{"$ref":"#/components/schemas/LibrarySpeaker"},"type":"array","title":"Speakers","description":"音声ライブラリに含まれるキャラクターのリスト"},"uninstallable":{"type":"boolean","title":"Uninstallable","description":"アンインストール可能かどうか"}},"type":"object","required":["name","uuid","version","download_url","bytes","speakers","uninstallable"],"title":"InstalledLibraryInfo","description":"インストール済み音声ライブラリの情報"},"LibrarySpeaker":{"properties":{"speaker":{"$ref":"#/components/schemas/Speaker"},"speaker_info":{"$ref":"#/components/schemas/SpeakerInfo"}},"type":"object","required":["speaker","speaker_info"],"title":"LibrarySpeaker","description":"音声ライブラリに含まれるキャラクターの情報"},"LicenseInfo":{"properties":{"name":{"type":"string","title":"Name","description":"依存ライブラリ名"},"version":{"type":"string","title":"Version","description":"依存ライブラリのバージョン"},"license":{"type":"string","title":"License","description":"依存ライブラリのライセンス名"},"text":{"type":"string","title":"Text","description":"依存ライブラリのライセンス本文"}},"type":"object","required":["name","text"],"title":"LicenseInfo","description":"依存ライブラリのライセンス情報"},"Mora":{"properties":{"text":{"type":"string","title":"Text","description":"文字"},"consonant":{"type":"string","title":"Consonant","description":"子音の音素"},"consonant_length":{"type":"number","title":"Consonant Length","description":"子音の音長"},"vowel":{"type":"string","title":"Vowel","description":"母音の音素"},"vowel_length":{"type":"number","title":"Vowel Length","description":"母音の音長"},"pitch":{"type":"number","title":"Pitch","description":"音高"}},"type":"object","required":["text","vowel","vowel_length","pitch"],"title":"Mora","description":"モーラ(子音+母音)ごとの情報"},"MorphableTargetInfo":{"properties":{"is_morphable":{"type":"boolean","title":"Is Morphable","description":"指定したキャラクターに対してモーフィングの可否"}},"type":"object","required":["is_morphable"],"title":"MorphableTargetInfo"},"Note":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id","description":"ID"},"key":{"type":"integer","title":"Key","description":"音階"},"frame_length":{"type":"integer","title":"Frame Length","description":"音符のフレーム長"},"lyric":{"type":"string","title":"Lyric","description":"音符の歌詞"}},"type":"object","required":["frame_length","lyric"],"title":"Note","description":"音符ごとの情報"},"ParseKanaBadRequest":{"properties":{"text":{"type":"string","title":"Text","description":"エラーメッセージ"},"error_name":{"type":"string","title":"Error Name","description":"エラー名\n\n|name|description|\n|---|---|\n| UNKNOWN_TEXT | 判別できない読み仮名があります: {text} |\n| ACCENT_TOP | 句頭にアクセントは置けません: {text} |\n| ACCENT_TWICE | 1つのアクセント句に二つ以上のアクセントは置けません: {text} |\n| ACCENT_NOTFOUND | アクセントを指定していないアクセント句があります: {text} |\n| EMPTY_PHRASE | {position}番目のアクセント句が空白です |\n| INTERROGATION_MARK_NOT_AT_END | アクセント句末以外に「?」は置けません: {text} |\n| INFINITE_LOOP | 処理時に無限ループになってしまいました...バグ報告をお願いします。 |"},"error_args":{"additionalProperties":{"type":"string"},"type":"object","title":"Error Args","description":"エラーを起こした箇所"}},"type":"object","required":["text","error_name","error_args"],"title":"ParseKanaBadRequest"},"Preset":{"properties":{"id":{"type":"integer","title":"Id","description":"プリセットID"},"name":{"type":"string","title":"Name","description":"プリセット名"},"speaker_uuid":{"type":"string","title":"Speaker Uuid","description":"キャラクターのUUID"},"style_id":{"type":"integer","title":"Style Id","description":"スタイルID"},"speedScale":{"type":"number","title":"Speedscale","description":"全体の話速"},"pitchScale":{"type":"number","title":"Pitchscale","description":"全体の音高"},"intonationScale":{"type":"number","title":"Intonationscale","description":"全体の抑揚"},"volumeScale":{"type":"number","title":"Volumescale","description":"全体の音量"},"prePhonemeLength":{"type":"number","title":"Prephonemelength","description":"音声の前の無音時間"},"postPhonemeLength":{"type":"number","title":"Postphonemelength","description":"音声の後の無音時間"},"pauseLength":{"type":"number","title":"Pauselength","description":"句読点などの無音時間"},"pauseLengthScale":{"type":"number","title":"Pauselengthscale","description":"句読点などの無音時間(倍率)","default":1}},"type":"object","required":["id","name","speaker_uuid","style_id","speedScale","pitchScale","intonationScale","volumeScale","prePhonemeLength","postPhonemeLength"],"title":"Preset","description":"プリセット情報"},"Score":{"properties":{"notes":{"items":{"$ref":"#/components/schemas/Note"},"type":"array","title":"Notes","description":"音符のリスト"}},"type":"object","required":["notes"],"title":"Score","description":"楽譜情報"},"Speaker":{"properties":{"name":{"type":"string","title":"Name","description":"名前"},"speaker_uuid":{"type":"string","title":"Speaker Uuid","description":"キャラクターのUUID"},"styles":{"items":{"$ref":"#/components/schemas/SpeakerStyle"},"type":"array","title":"Styles","description":"スタイルの一覧"},"version":{"type":"string","title":"Version","description":"キャラクターのバージョン"},"supported_features":{"allOf":[{"$ref":"#/components/schemas/SpeakerSupportedFeatures"}],"description":"キャラクターの対応機能"}},"type":"object","required":["name","speaker_uuid","styles","version"],"title":"Speaker","description":"キャラクター情報"},"SpeakerInfo":{"properties":{"policy":{"type":"string","title":"Policy","description":"policy.md"},"portrait":{"type":"string","title":"Portrait","description":"立ち絵画像をbase64エンコードしたもの、あるいはURL"},"style_infos":{"items":{"$ref":"#/components/schemas/StyleInfo"},"type":"array","title":"Style Infos","description":"スタイルの追加情報"}},"type":"object","required":["policy","portrait","style_infos"],"title":"SpeakerInfo","description":"キャラクターの追加情報"},"SpeakerStyle":{"properties":{"name":{"type":"string","title":"Name","description":"スタイル名"},"id":{"type":"integer","title":"Id","description":"スタイルID"},"type":{"type":"string","enum":["talk","singing_teacher","frame_decode","sing"],"title":"Type","description":"スタイルの種類。talk:音声合成クエリの作成と音声合成が可能。singing_teacher:歌唱音声合成用のクエリの作成が可能。frame_decode:歌唱音声合成が可能。sing:歌唱音声合成用のクエリの作成と歌唱音声合成が可能。","default":"talk"}},"type":"object","required":["name","id"],"title":"SpeakerStyle","description":"キャラクターのスタイル情報"},"SpeakerSupportedFeatures":{"properties":{"permitted_synthesis_morphing":{"type":"string","enum":["ALL","SELF_ONLY","NOTHING"],"title":"Permitted Synthesis Morphing","description":"モーフィング機能への対応。'ALL' は「全て許可」、'SELF_ONLY' は「同じキャラクター内でのみ許可」、'NOTHING' は「全て禁止」","default":"ALL"}},"type":"object","title":"SpeakerSupportedFeatures","description":"キャラクターの対応機能の情報"},"StyleInfo":{"properties":{"id":{"type":"integer","title":"Id","description":"スタイルID"},"icon":{"type":"string","title":"Icon","description":"このスタイルのアイコンをbase64エンコードしたもの、あるいはURL"},"portrait":{"type":"string","title":"Portrait","description":"このスタイルの立ち絵画像をbase64エンコードしたもの、あるいはURL"},"voice_samples":{"items":{"type":"string"},"type":"array","title":"Voice Samples","description":"サンプル音声をbase64エンコードしたもの、あるいはURL"}},"type":"object","required":["id","icon","voice_samples"],"title":"StyleInfo","description":"スタイルの追加情報"},"SupportedDevicesInfo":{"properties":{"cpu":{"type":"boolean","title":"Cpu","description":"CPUに対応しているか"},"cuda":{"type":"boolean","title":"Cuda","description":"CUDA(Nvidia GPU)に対応しているか"},"dml":{"type":"boolean","title":"Dml","description":"DirectML(Nvidia GPU/Radeon GPU等)に対応しているか"}},"type":"object","required":["cpu","cuda","dml"],"title":"SupportedDevicesInfo","description":"対応しているデバイスの情報"},"SupportedFeatures":{"properties":{"adjust_mora_pitch":{"type":"boolean","title":"Adjust Mora Pitch","description":"モーラごとの音高の調整"},"adjust_phoneme_length":{"type":"boolean","title":"Adjust Phoneme Length","description":"音素ごとの長さの調整"},"adjust_speed_scale":{"type":"boolean","title":"Adjust Speed Scale","description":"全体の話速の調整"},"adjust_pitch_scale":{"type":"boolean","title":"Adjust Pitch Scale","description":"全体の音高の調整"},"adjust_intonation_scale":{"type":"boolean","title":"Adjust Intonation Scale","description":"全体の抑揚の調整"},"adjust_volume_scale":{"type":"boolean","title":"Adjust Volume Scale","description":"全体の音量の調整"},"adjust_pause_length":{"type":"boolean","title":"Adjust Pause Length","description":"句読点などの無音時間の調整"},"interrogative_upspeak":{"type":"boolean","title":"Interrogative Upspeak","description":"疑問文の自動調整"},"synthesis_morphing":{"type":"boolean","title":"Synthesis Morphing","description":"2種類のスタイルでモーフィングした音声を合成"},"sing":{"type":"boolean","title":"Sing","description":"歌唱音声合成"},"manage_library":{"type":"boolean","title":"Manage Library","description":"音声ライブラリのインストール・アンインストール"},"return_resource_url":{"type":"boolean","title":"Return Resource Url","description":"キャラクター情報のリソースをURLで返送"}},"type":"object","required":["adjust_mora_pitch","adjust_phoneme_length","adjust_speed_scale","adjust_pitch_scale","adjust_intonation_scale","adjust_volume_scale","interrogative_upspeak","synthesis_morphing"],"title":"SupportedFeatures","description":"エンジンが持つ機能の一覧"},"UpdateInfo":{"properties":{"version":{"type":"string","title":"Version","description":"エンジンのバージョン名"},"descriptions":{"items":{"type":"string"},"type":"array","title":"Descriptions","description":"アップデートの詳細についての説明"},"contributors":{"items":{"type":"string"},"type":"array","title":"Contributors","description":"貢献者名"}},"type":"object","required":["version","descriptions"],"title":"UpdateInfo","description":"エンジンのアップデート情報"},"UserDictWord":{"properties":{"surface":{"type":"string","title":"Surface","description":"表層形"},"priority":{"type":"integer","maximum":10.0,"minimum":0.0,"title":"Priority","description":"優先度"},"context_id":{"type":"integer","title":"Context Id","description":"文脈ID","default":1348},"part_of_speech":{"type":"string","title":"Part Of Speech","description":"品詞"},"part_of_speech_detail_1":{"type":"string","title":"Part Of Speech Detail 1","description":"品詞細分類1"},"part_of_speech_detail_2":{"type":"string","title":"Part Of Speech Detail 2","description":"品詞細分類2"},"part_of_speech_detail_3":{"type":"string","title":"Part Of Speech Detail 3","description":"品詞細分類3"},"inflectional_type":{"type":"string","title":"Inflectional Type","description":"活用型"},"inflectional_form":{"type":"string","title":"Inflectional Form","description":"活用形"},"stem":{"type":"string","title":"Stem","description":"原形"},"yomi":{"type":"string","title":"Yomi","description":"読み"},"pronunciation":{"type":"string","title":"Pronunciation","description":"発音"},"accent_type":{"type":"integer","title":"Accent Type","description":"アクセント型"},"mora_count":{"type":"integer","title":"Mora Count","description":"モーラ数"},"accent_associative_rule":{"type":"string","title":"Accent Associative Rule","description":"アクセント結合規則"}},"type":"object","required":["surface","priority","part_of_speech","part_of_speech_detail_1","part_of_speech_detail_2","part_of_speech_detail_3","inflectional_type","inflectional_form","stem","yomi","pronunciation","accent_type","accent_associative_rule"],"title":"UserDictWord","description":"辞書のコンパイルに使われる情報"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WordTypes":{"type":"string","enum":["PROPER_NOUN","COMMON_NOUN","VERB","ADJECTIVE","SUFFIX"],"title":"WordTypes","description":"品詞"},"BaseLibraryInfo":{"description":"音声ライブラリの情報","properties":{"name":{"description":"音声ライブラリの名前","title":"Name","type":"string"},"uuid":{"description":"音声ライブラリのUUID","title":"Uuid","type":"string"},"version":{"description":"音声ライブラリのバージョン","title":"Version","type":"string"},"download_url":{"description":"音声ライブラリのダウンロードURL","title":"Download Url","type":"string"},"bytes":{"description":"音声ライブラリのバイト数","title":"Bytes","type":"integer"},"speakers":{"description":"音声ライブラリに含まれるキャラクターのリスト","items":{"$ref":"#/components/schemas/LibrarySpeaker"},"title":"Speakers","type":"array"}},"required":["name","uuid","version","download_url","bytes","speakers"],"title":"BaseLibraryInfo","type":"object"},"VvlibManifest":{"description":"vvlib(VOICEVOX Library)に関する情報","properties":{"manifest_version":{"description":"マニフェストバージョン","title":"Manifest Version","type":"string"},"name":{"description":"音声ライブラリ名","title":"Name","type":"string"},"version":{"description":"音声ライブラリバージョン","title":"Version","type":"string"},"uuid":{"description":"音声ライブラリのUUID","title":"Uuid","type":"string"},"brand_name":{"description":"エンジンのブランド名","title":"Brand Name","type":"string"},"engine_name":{"description":"エンジン名","title":"Engine Name","type":"string"},"engine_uuid":{"description":"エンジンのUUID","title":"Engine Uuid","type":"string"}},"required":["manifest_version","name","version","uuid","brand_name","engine_name","engine_uuid"],"title":"VvlibManifest","type":"object"}}}} \ No newline at end of file +{"openapi":"3.1.0","info":{"title":"VOICEVOX Engine","description":"VOICEVOX の音声合成エンジンです。","version":"latest"},"paths":{"/audio_query":{"post":{"tags":["クエリ作成"],"summary":"音声合成用のクエリを作成する","description":"音声合成用のクエリの初期値を得ます。ここで得られたクエリはそのまま音声合成に利用できます。各値の意味は`Schemas`を参照してください。","operationId":"audio_query_audio_query_post","parameters":[{"name":"text","in":"query","required":true,"schema":{"type":"string","title":"Text"}},{"name":"speaker","in":"query","required":true,"schema":{"type":"integer","title":"Speaker"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudioQuery"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/audio_query_from_preset":{"post":{"tags":["クエリ作成"],"summary":"音声合成用のクエリをプリセットを用いて作成する","description":"音声合成用のクエリの初期値を得ます。ここで得られたクエリはそのまま音声合成に利用できます。各値の意味は`Schemas`を参照してください。","operationId":"audio_query_from_preset_audio_query_from_preset_post","parameters":[{"name":"text","in":"query","required":true,"schema":{"type":"string","title":"Text"}},{"name":"preset_id","in":"query","required":true,"schema":{"type":"integer","title":"Preset Id"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudioQuery"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/accent_phrases":{"post":{"tags":["クエリ編集"],"summary":"テキストからアクセント句を得る","description":"テキストからアクセント句を得ます。\nis_kanaが`true`のとき、テキストは次のAquesTalk 風記法で解釈されます。デフォルトは`false`です。\n* 全てのカナはカタカナで記述される\n* アクセント句は`/`または`、`で区切る。`、`で区切った場合に限り無音区間が挿入される。\n* カナの手前に`_`を入れるとそのカナは無声化される\n* アクセント位置を`'`で指定する。全てのアクセント句にはアクセント位置を1つ指定する必要がある。\n* アクセント句末に`?`(全角)を入れることにより疑問文の発音ができる。","operationId":"accent_phrases_accent_phrases_post","parameters":[{"name":"text","in":"query","required":true,"schema":{"type":"string","title":"Text"}},{"name":"speaker","in":"query","required":true,"schema":{"type":"integer","title":"Speaker"}},{"name":"is_kana","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Is Kana"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AccentPhrase"},"title":"Response Accent Phrases Accent Phrases Post"}}}},"400":{"description":"読み仮名のパースに失敗","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParseKanaBadRequest"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mora_data":{"post":{"tags":["クエリ編集"],"summary":"アクセント句から音高・音素長を得る","operationId":"mora_data_mora_data_post","parameters":[{"name":"speaker","in":"query","required":true,"schema":{"type":"integer","title":"Speaker"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AccentPhrase"},"title":"Accent Phrases"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AccentPhrase"},"title":"Response Mora Data Mora Data Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mora_length":{"post":{"tags":["クエリ編集"],"summary":"アクセント句から音素長を得る","operationId":"mora_length_mora_length_post","parameters":[{"name":"speaker","in":"query","required":true,"schema":{"type":"integer","title":"Speaker"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AccentPhrase"},"title":"Accent Phrases"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AccentPhrase"},"title":"Response Mora Length Mora Length Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mora_pitch":{"post":{"tags":["クエリ編集"],"summary":"アクセント句から音高を得る","operationId":"mora_pitch_mora_pitch_post","parameters":[{"name":"speaker","in":"query","required":true,"schema":{"type":"integer","title":"Speaker"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AccentPhrase"},"title":"Accent Phrases"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AccentPhrase"},"title":"Response Mora Pitch Mora Pitch Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/synthesis":{"post":{"tags":["音声合成"],"summary":"音声合成する","operationId":"synthesis_synthesis_post","parameters":[{"name":"speaker","in":"query","required":true,"schema":{"type":"integer","title":"Speaker"}},{"name":"enable_interrogative_upspeak","in":"query","required":false,"schema":{"type":"boolean","description":"疑問系のテキストが与えられたら語尾を自動調整する","default":true,"title":"Enable Interrogative Upspeak"},"description":"疑問系のテキストが与えられたら語尾を自動調整する"},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudioQuery"}}}},"responses":{"200":{"description":"Successful Response","content":{"audio/wav":{"schema":{"type":"string","format":"binary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/cancellable_synthesis":{"post":{"tags":["音声合成"],"summary":"音声合成する(キャンセル可能)","operationId":"cancellable_synthesis_cancellable_synthesis_post","parameters":[{"name":"speaker","in":"query","required":true,"schema":{"type":"integer","title":"Speaker"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudioQuery"}}}},"responses":{"200":{"description":"Successful Response","content":{"audio/wav":{"schema":{"type":"string","format":"binary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/multi_synthesis":{"post":{"tags":["音声合成"],"summary":"複数まとめて音声合成する","operationId":"multi_synthesis_multi_synthesis_post","parameters":[{"name":"speaker","in":"query","required":true,"schema":{"type":"integer","title":"Speaker"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AudioQuery"},"title":"Queries"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/zip":{"schema":{"type":"string","format":"binary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sing_frame_audio_query":{"post":{"tags":["クエリ作成"],"summary":"歌唱音声合成用のクエリを作成する","description":"歌唱音声合成用のクエリの初期値を得ます。ここで得られたクエリはそのまま歌唱音声合成に利用できます。各値の意味は`Schemas`を参照してください。","operationId":"sing_frame_audio_query_sing_frame_audio_query_post","parameters":[{"name":"speaker","in":"query","required":true,"schema":{"type":"integer","title":"Speaker"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Score"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FrameAudioQuery"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sing_frame_volume":{"post":{"tags":["クエリ編集"],"summary":"スコア・歌唱音声合成用のクエリからフレームごとの音量を得る","operationId":"sing_frame_volume_sing_frame_volume_post","parameters":[{"name":"speaker","in":"query","required":true,"schema":{"type":"integer","title":"Speaker"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_sing_frame_volume_sing_frame_volume_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"number"},"title":"Response Sing Frame Volume Sing Frame Volume Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/frame_synthesis":{"post":{"tags":["音声合成"],"summary":"Frame Synthesis","description":"歌唱音声合成を行います。","operationId":"frame_synthesis_frame_synthesis_post","parameters":[{"name":"speaker","in":"query","required":true,"schema":{"type":"integer","title":"Speaker"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FrameAudioQuery"}}}},"responses":{"200":{"description":"Successful Response","content":{"audio/wav":{"schema":{"type":"string","format":"binary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/connect_waves":{"post":{"tags":["その他"],"summary":"base64エンコードされた複数のwavデータを一つに結合する","description":"base64エンコードされたwavデータを一纏めにし、wavファイルで返します。","operationId":"connect_waves_connect_waves_post","requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array","title":"Waves"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"audio/wav":{"schema":{"type":"string","format":"binary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/validate_kana":{"post":{"tags":["その他"],"summary":"テキストがAquesTalk 風記法に従っているか判定する","description":"テキストがAquesTalk 風記法に従っているかどうかを判定します。\n従っていない場合はエラーが返ります。","operationId":"validate_kana_validate_kana_post","parameters":[{"name":"text","in":"query","required":true,"schema":{"type":"string","description":"判定する対象の文字列","title":"Text"},"description":"判定する対象の文字列"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"boolean","title":"Response Validate Kana Validate Kana Post"}}}},"400":{"description":"テキストが不正です","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParseKanaBadRequest"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/initialize_speaker":{"post":{"tags":["その他"],"summary":"Initialize Speaker","description":"指定されたスタイルを初期化します。\n実行しなくても他のAPIは使用できますが、初回実行時に時間がかかることがあります。","operationId":"initialize_speaker_initialize_speaker_post","parameters":[{"name":"speaker","in":"query","required":true,"schema":{"type":"integer","title":"Speaker"}},{"name":"skip_reinit","in":"query","required":false,"schema":{"type":"boolean","description":"既に初期化済みのスタイルの再初期化をスキップするかどうか","default":false,"title":"Skip Reinit"},"description":"既に初期化済みのスタイルの再初期化をスキップするかどうか"},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/is_initialized_speaker":{"get":{"tags":["その他"],"summary":"Is Initialized Speaker","description":"指定されたスタイルが初期化されているかどうかを返します。","operationId":"is_initialized_speaker_is_initialized_speaker_get","parameters":[{"name":"speaker","in":"query","required":true,"schema":{"type":"integer","title":"Speaker"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"boolean","title":"Response Is Initialized Speaker Is Initialized Speaker Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/supported_devices":{"get":{"tags":["その他"],"summary":"Supported Devices","description":"対応デバイスの一覧を取得します。","operationId":"supported_devices_supported_devices_get","parameters":[{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SupportedDevicesInfo"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/morphable_targets":{"post":{"tags":["音声合成"],"summary":"指定したスタイルに対してエンジン内のキャラクターがモーフィングが可能か判定する","description":"指定されたベーススタイルに対してエンジン内の各キャラクターがモーフィング機能を利用可能か返します。\nモーフィングの許可/禁止は`/speakers`の`speaker.supported_features.synthesis_morphing`に記載されています。\nプロパティが存在しない場合は、モーフィングが許可されているとみなします。\n返り値のスタイルIDはstring型なので注意。","operationId":"morphable_targets_morphable_targets_post","parameters":[{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"type":"integer"},"title":"Base Style Ids"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/MorphableTargetInfo"}},"title":"Response Morphable Targets Morphable Targets Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/synthesis_morphing":{"post":{"tags":["音声合成"],"summary":"2種類のスタイルでモーフィングした音声を合成する","description":"指定された2種類のスタイルで音声を合成、指定した割合でモーフィングした音声を得ます。\nモーフィングの割合は`morph_rate`で指定でき、0.0でベースのスタイル、1.0でターゲットのスタイルに近づきます。","operationId":"_synthesis_morphing_synthesis_morphing_post","parameters":[{"name":"base_speaker","in":"query","required":true,"schema":{"type":"integer","title":"Base Speaker"}},{"name":"target_speaker","in":"query","required":true,"schema":{"type":"integer","title":"Target Speaker"}},{"name":"morph_rate","in":"query","required":true,"schema":{"type":"number","maximum":1,"minimum":0,"title":"Morph Rate"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudioQuery"}}}},"responses":{"200":{"description":"Successful Response","content":{"audio/wav":{"schema":{"type":"string","format":"binary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/presets":{"get":{"tags":["その他"],"summary":"Get Presets","description":"エンジンが保持しているプリセットの設定を返します","operationId":"get_presets_presets_get","responses":{"200":{"description":"プリセットのリスト","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/Preset"},"type":"array","title":"Response Get Presets Presets Get"}}}}}}},"/add_preset":{"post":{"tags":["その他"],"summary":"Add Preset","description":"新しいプリセットを追加します","operationId":"add_preset_add_preset_post","requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Preset"}],"title":"Preset","description":"新しいプリセット。プリセットIDが既存のものと重複している場合は、新規のプリセットIDが採番されます。"}}},"required":true},"responses":{"200":{"description":"追加したプリセットのプリセットID","content":{"application/json":{"schema":{"type":"integer","title":"Response Add Preset Add Preset Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/update_preset":{"post":{"tags":["その他"],"summary":"Update Preset","description":"既存のプリセットを更新します","operationId":"update_preset_update_preset_post","requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Preset"}],"title":"Preset","description":"更新するプリセット。プリセットIDが更新対象と一致している必要があります。"}}},"required":true},"responses":{"200":{"description":"更新したプリセットのプリセットID","content":{"application/json":{"schema":{"type":"integer","title":"Response Update Preset Update Preset Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/delete_preset":{"post":{"tags":["その他"],"summary":"Delete Preset","description":"既存のプリセットを削除します","operationId":"delete_preset_delete_preset_post","parameters":[{"name":"id","in":"query","required":true,"schema":{"type":"integer","description":"削除するプリセットのプリセットID","title":"Id"},"description":"削除するプリセットのプリセットID"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/speakers":{"get":{"tags":["その他"],"summary":"Speakers","description":"喋れるキャラクターの情報の一覧を返します。","operationId":"speakers_speakers_get","parameters":[{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Speaker"},"title":"Response Speakers Speakers Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/speaker_info":{"get":{"tags":["その他"],"summary":"Speaker Info","description":"UUID で指定された喋れるキャラクターの情報を返します。\n画像や音声はresource_formatで指定した形式で返されます。","operationId":"speaker_info_speaker_info_get","parameters":[{"name":"speaker_uuid","in":"query","required":true,"schema":{"type":"string","title":"Speaker Uuid"}},{"name":"resource_format","in":"query","required":false,"schema":{"enum":["base64","url"],"type":"string","default":"base64","title":"Resource Format"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpeakerInfo"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/singers":{"get":{"tags":["その他"],"summary":"Singers","description":"歌えるキャラクターの情報の一覧を返します。","operationId":"singers_singers_get","parameters":[{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Speaker"},"title":"Response Singers Singers Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/singer_info":{"get":{"tags":["その他"],"summary":"Singer Info","description":"UUID で指定された歌えるキャラクターの情報を返します。\n画像や音声はresource_formatで指定した形式で返されます。","operationId":"singer_info_singer_info_get","parameters":[{"name":"speaker_uuid","in":"query","required":true,"schema":{"type":"string","title":"Speaker Uuid"}},{"name":"resource_format","in":"query","required":false,"schema":{"enum":["base64","url"],"type":"string","default":"base64","title":"Resource Format"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpeakerInfo"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/downloadable_libraries":{"get":{"tags":["音声ライブラリ管理"],"summary":"Downloadable Libraries","description":"ダウンロード可能な音声ライブラリの情報を返します。","operationId":"downloadable_libraries_downloadable_libraries_get","responses":{"200":{"description":"ダウンロード可能な音声ライブラリの情報リスト","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/DownloadableLibraryInfo"},"type":"array","title":"Response Downloadable Libraries Downloadable Libraries Get"}}}}}}},"/installed_libraries":{"get":{"tags":["音声ライブラリ管理"],"summary":"Installed Libraries","description":"インストールした音声ライブラリの情報を返します。","operationId":"installed_libraries_installed_libraries_get","responses":{"200":{"description":"インストールした音声ライブラリの情報","content":{"application/json":{"schema":{"additionalProperties":{"$ref":"#/components/schemas/InstalledLibraryInfo"},"type":"object","title":"Response Installed Libraries Installed Libraries Get"}}}}}}},"/install_library/{library_uuid}":{"post":{"tags":["音声ライブラリ管理"],"summary":"Install Library","description":"音声ライブラリをインストールします。\n音声ライブラリのZIPファイルをリクエストボディとして送信してください。","operationId":"install_library_install_library__library_uuid__post","parameters":[{"name":"library_uuid","in":"path","required":true,"schema":{"type":"string","description":"音声ライブラリのID","title":"Library Uuid"},"description":"音声ライブラリのID"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/uninstall_library/{library_uuid}":{"post":{"tags":["音声ライブラリ管理"],"summary":"Uninstall Library","description":"音声ライブラリをアンインストールします。","operationId":"uninstall_library_uninstall_library__library_uuid__post","parameters":[{"name":"library_uuid","in":"path","required":true,"schema":{"type":"string","description":"音声ライブラリのID","title":"Library Uuid"},"description":"音声ライブラリのID"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/user_dict":{"get":{"tags":["ユーザー辞書"],"summary":"Get User Dict Words","description":"ユーザー辞書に登録されている単語の一覧を返します。\n単語の表層形(surface)は正規化済みの物を返します。","operationId":"get_user_dict_words_user_dict_get","responses":{"200":{"description":"単語のUUIDとその詳細","content":{"application/json":{"schema":{"additionalProperties":{"$ref":"#/components/schemas/UserDictWord"},"type":"object","title":"Response Get User Dict Words User Dict Get"}}}}}}},"/user_dict_word":{"post":{"tags":["ユーザー辞書"],"summary":"Add User Dict Word","description":"ユーザー辞書に言葉を追加します。","operationId":"add_user_dict_word_user_dict_word_post","parameters":[{"name":"surface","in":"query","required":true,"schema":{"type":"string","description":"言葉の表層形","title":"Surface"},"description":"言葉の表層形"},{"name":"pronunciation","in":"query","required":true,"schema":{"type":"string","description":"言葉の発音(カタカナ)","title":"Pronunciation"},"description":"言葉の発音(カタカナ)"},{"name":"accent_type","in":"query","required":true,"schema":{"type":"integer","description":"アクセント型(音が下がる場所を指す)","title":"Accent Type"},"description":"アクセント型(音が下がる場所を指す)"},{"name":"word_type","in":"query","required":false,"schema":{"allOf":[{"$ref":"#/components/schemas/WordTypes"}],"description":"PROPER_NOUN(固有名詞)、COMMON_NOUN(普通名詞)、VERB(動詞)、ADJECTIVE(形容詞)、SUFFIX(語尾)のいずれか","title":"Word Type"},"description":"PROPER_NOUN(固有名詞)、COMMON_NOUN(普通名詞)、VERB(動詞)、ADJECTIVE(形容詞)、SUFFIX(語尾)のいずれか"},{"name":"priority","in":"query","required":false,"schema":{"type":"integer","description":"単語の優先度(0から10までの整数)。数字が大きいほど優先度が高くなる。1から9までの値を指定することを推奨","maximum":10,"minimum":0,"title":"Priority"},"description":"単語の優先度(0から10までの整数)。数字が大きいほど優先度が高くなる。1から9までの値を指定することを推奨"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"string","title":"Response Add User Dict Word User Dict Word Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/user_dict_word/{word_uuid}":{"put":{"tags":["ユーザー辞書"],"summary":"Rewrite User Dict Word","description":"ユーザー辞書に登録されている言葉を更新します。","operationId":"rewrite_user_dict_word_user_dict_word__word_uuid__put","parameters":[{"name":"word_uuid","in":"path","required":true,"schema":{"type":"string","description":"更新する言葉のUUID","title":"Word Uuid"},"description":"更新する言葉のUUID"},{"name":"surface","in":"query","required":true,"schema":{"type":"string","description":"言葉の表層形","title":"Surface"},"description":"言葉の表層形"},{"name":"pronunciation","in":"query","required":true,"schema":{"type":"string","description":"言葉の発音(カタカナ)","title":"Pronunciation"},"description":"言葉の発音(カタカナ)"},{"name":"accent_type","in":"query","required":true,"schema":{"type":"integer","description":"アクセント型(音が下がる場所を指す)","title":"Accent Type"},"description":"アクセント型(音が下がる場所を指す)"},{"name":"word_type","in":"query","required":false,"schema":{"allOf":[{"$ref":"#/components/schemas/WordTypes"}],"description":"PROPER_NOUN(固有名詞)、COMMON_NOUN(普通名詞)、VERB(動詞)、ADJECTIVE(形容詞)、SUFFIX(語尾)のいずれか","title":"Word Type"},"description":"PROPER_NOUN(固有名詞)、COMMON_NOUN(普通名詞)、VERB(動詞)、ADJECTIVE(形容詞)、SUFFIX(語尾)のいずれか"},{"name":"priority","in":"query","required":false,"schema":{"type":"integer","description":"単語の優先度(0から10までの整数)。数字が大きいほど優先度が高くなる。1から9までの値を指定することを推奨。","maximum":10,"minimum":0,"title":"Priority"},"description":"単語の優先度(0から10までの整数)。数字が大きいほど優先度が高くなる。1から9までの値を指定することを推奨。"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["ユーザー辞書"],"summary":"Delete User Dict Word","description":"ユーザー辞書に登録されている言葉を削除します。","operationId":"delete_user_dict_word_user_dict_word__word_uuid__delete","parameters":[{"name":"word_uuid","in":"path","required":true,"schema":{"type":"string","description":"削除する言葉のUUID","title":"Word Uuid"},"description":"削除する言葉のUUID"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/import_user_dict":{"post":{"tags":["ユーザー辞書"],"summary":"Import User Dict Words","description":"他のユーザー辞書をインポートします。","operationId":"import_user_dict_words_import_user_dict_post","parameters":[{"name":"override","in":"query","required":true,"schema":{"type":"boolean","description":"重複したエントリがあった場合、上書きするかどうか","title":"Override"},"description":"重複したエントリがあった場合、上書きするかどうか"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/UserDictWord"},"description":"インポートするユーザー辞書のデータ","title":"Import Dict Data"}}}},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/version":{"get":{"tags":["その他"],"summary":"Version","description":"エンジンのバージョンを取得します。","operationId":"version_version_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"string","title":"Response Version Version Get"}}}}}}},"/core_versions":{"get":{"tags":["その他"],"summary":"Core Versions","description":"利用可能なコアのバージョン一覧を取得します。","operationId":"core_versions_core_versions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array","title":"Response Core Versions Core Versions Get"}}}}}}},"/engine_manifest":{"get":{"tags":["その他"],"summary":"Engine Manifest","description":"エンジンマニフェストを取得します。","operationId":"engine_manifest_engine_manifest_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EngineManifest"}}}}}}},"/setting":{"get":{"tags":["設定"],"summary":"Setting Get","description":"設定ページを返します。","operationId":"setting_get_setting_get","responses":{"200":{"description":"Successful Response"}}},"post":{"tags":["設定"],"summary":"Setting Post","description":"設定を更新します。","operationId":"setting_post_setting_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_setting_post_setting_post"}}},"required":true},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/":{"get":{"tags":["その他"],"summary":"Get Portal Page","description":"ポータルページを返します。","operationId":"get_portal_page__get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}}},"components":{"schemas":{"AccentPhrase":{"properties":{"moras":{"items":{"$ref":"#/components/schemas/Mora"},"type":"array","title":"Moras","description":"モーラのリスト"},"accent":{"type":"integer","title":"Accent","description":"アクセント箇所"},"pause_mora":{"allOf":[{"$ref":"#/components/schemas/Mora"}],"title":"Pause Mora","description":"後ろに無音を付けるかどうか"},"is_interrogative":{"type":"boolean","title":"Is Interrogative","description":"疑問系かどうか","default":false}},"type":"object","required":["moras","accent"],"title":"AccentPhrase","description":"アクセント句ごとの情報"},"AudioQuery":{"properties":{"accent_phrases":{"items":{"$ref":"#/components/schemas/AccentPhrase"},"type":"array","title":"Accent Phrases","description":"アクセント句のリスト"},"speedScale":{"type":"number","title":"Speedscale","description":"全体の話速"},"pitchScale":{"type":"number","title":"Pitchscale","description":"全体の音高"},"intonationScale":{"type":"number","title":"Intonationscale","description":"全体の抑揚"},"volumeScale":{"type":"number","title":"Volumescale","description":"全体の音量"},"pauseLengthScale":{"type":"number","title":"Pauselengthscale","description":"句読点などの無音時間(倍率)。デフォルト値は1","default":1},"prePhonemeLength":{"type":"number","title":"Prephonemelength","description":"音声の前の無音時間"},"postPhonemeLength":{"type":"number","title":"Postphonemelength","description":"音声の後の無音時間"},"pauseLength":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Pauselength","description":"句読点などの無音時間。nullのときは無視される。デフォルト値はnull"},"outputSamplingRate":{"type":"integer","title":"Outputsamplingrate","description":"音声データの出力サンプリングレート"},"outputStereo":{"type":"boolean","title":"Outputstereo","description":"音声データをステレオ出力するか否か"},"kana":{"type":"string","title":"Kana","description":"[読み取り専用]AquesTalk 風記法によるテキスト。音声合成用のクエリとしては無視される"}},"type":"object","required":["accent_phrases","speedScale","pitchScale","intonationScale","volumeScale","prePhonemeLength","postPhonemeLength","outputSamplingRate","outputStereo"],"title":"AudioQuery","description":"音声合成用のクエリ"},"Body_setting_post_setting_post":{"properties":{"cors_policy_mode":{"$ref":"#/components/schemas/CorsPolicyMode"},"allow_origin":{"type":"string","title":"Allow Origin"}},"type":"object","required":["cors_policy_mode"],"title":"Body_setting_post_setting_post"},"Body_sing_frame_volume_sing_frame_volume_post":{"properties":{"score":{"$ref":"#/components/schemas/Score"},"frame_audio_query":{"$ref":"#/components/schemas/FrameAudioQuery"}},"type":"object","required":["score","frame_audio_query"],"title":"Body_sing_frame_volume_sing_frame_volume_post"},"CorsPolicyMode":{"type":"string","enum":["all","localapps"],"title":"CorsPolicyMode","description":"CORSの許可モード"},"DownloadableLibraryInfo":{"properties":{"name":{"type":"string","title":"Name","description":"音声ライブラリの名前"},"uuid":{"type":"string","title":"Uuid","description":"音声ライブラリのUUID"},"version":{"type":"string","title":"Version","description":"音声ライブラリのバージョン"},"download_url":{"type":"string","title":"Download Url","description":"音声ライブラリのダウンロードURL"},"bytes":{"type":"integer","title":"Bytes","description":"音声ライブラリのバイト数"},"speakers":{"items":{"$ref":"#/components/schemas/LibrarySpeaker"},"type":"array","title":"Speakers","description":"音声ライブラリに含まれるキャラクターのリスト"}},"type":"object","required":["name","uuid","version","download_url","bytes","speakers"],"title":"DownloadableLibraryInfo","description":"ダウンロード可能な音声ライブラリの情報"},"EngineManifest":{"properties":{"manifest_version":{"type":"string","title":"Manifest Version","description":"マニフェストのバージョン"},"name":{"type":"string","title":"Name","description":"エンジン名"},"brand_name":{"type":"string","title":"Brand Name","description":"ブランド名"},"uuid":{"type":"string","title":"Uuid","description":"エンジンのUUID"},"url":{"type":"string","title":"Url","description":"エンジンのURL"},"icon":{"type":"string","title":"Icon","description":"エンジンのアイコンをBASE64エンコードしたもの"},"default_sampling_rate":{"type":"integer","title":"Default Sampling Rate","description":"デフォルトのサンプリング周波数"},"frame_rate":{"type":"number","title":"Frame Rate","description":"エンジンのフレームレート"},"terms_of_service":{"type":"string","title":"Terms Of Service","description":"エンジンの利用規約"},"update_infos":{"items":{"$ref":"#/components/schemas/UpdateInfo"},"type":"array","title":"Update Infos","description":"エンジンのアップデート情報"},"dependency_licenses":{"items":{"$ref":"#/components/schemas/LicenseInfo"},"type":"array","title":"Dependency Licenses","description":"依存関係のライセンス情報"},"supported_vvlib_manifest_version":{"type":"string","title":"Supported Vvlib Manifest Version","description":"エンジンが対応するvvlibのバージョン"},"supported_features":{"allOf":[{"$ref":"#/components/schemas/SupportedFeatures"}],"description":"エンジンが持つ機能"}},"type":"object","required":["manifest_version","name","brand_name","uuid","url","icon","default_sampling_rate","frame_rate","terms_of_service","update_infos","dependency_licenses","supported_features"],"title":"EngineManifest","description":"エンジン自体に関する情報"},"FrameAudioQuery":{"properties":{"f0":{"items":{"type":"number"},"type":"array","title":"F0","description":"フレームごとの基本周波数"},"volume":{"items":{"type":"number"},"type":"array","title":"Volume","description":"フレームごとの音量"},"phonemes":{"items":{"$ref":"#/components/schemas/FramePhoneme"},"type":"array","title":"Phonemes","description":"音素のリスト"},"volumeScale":{"type":"number","title":"Volumescale","description":"全体の音量"},"outputSamplingRate":{"type":"integer","title":"Outputsamplingrate","description":"音声データの出力サンプリングレート"},"outputStereo":{"type":"boolean","title":"Outputstereo","description":"音声データをステレオ出力するか否か"}},"type":"object","required":["f0","volume","phonemes","volumeScale","outputSamplingRate","outputStereo"],"title":"FrameAudioQuery","description":"フレームごとの音声合成用のクエリ"},"FramePhoneme":{"properties":{"phoneme":{"type":"string","title":"Phoneme","description":"音素"},"frame_length":{"type":"integer","title":"Frame Length","description":"音素のフレーム長"},"note_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note Id","description":"音符のID"}},"type":"object","required":["phoneme","frame_length"],"title":"FramePhoneme","description":"音素の情報"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"InstalledLibraryInfo":{"properties":{"name":{"type":"string","title":"Name","description":"音声ライブラリの名前"},"uuid":{"type":"string","title":"Uuid","description":"音声ライブラリのUUID"},"version":{"type":"string","title":"Version","description":"音声ライブラリのバージョン"},"download_url":{"type":"string","title":"Download Url","description":"音声ライブラリのダウンロードURL"},"bytes":{"type":"integer","title":"Bytes","description":"音声ライブラリのバイト数"},"speakers":{"items":{"$ref":"#/components/schemas/LibrarySpeaker"},"type":"array","title":"Speakers","description":"音声ライブラリに含まれるキャラクターのリスト"},"uninstallable":{"type":"boolean","title":"Uninstallable","description":"アンインストール可能かどうか"}},"type":"object","required":["name","uuid","version","download_url","bytes","speakers","uninstallable"],"title":"InstalledLibraryInfo","description":"インストール済み音声ライブラリの情報"},"LibrarySpeaker":{"properties":{"speaker":{"$ref":"#/components/schemas/Speaker"},"speaker_info":{"$ref":"#/components/schemas/SpeakerInfo"}},"type":"object","required":["speaker","speaker_info"],"title":"LibrarySpeaker","description":"音声ライブラリに含まれるキャラクターの情報"},"LicenseInfo":{"properties":{"name":{"type":"string","title":"Name","description":"依存ライブラリ名"},"version":{"type":"string","title":"Version","description":"依存ライブラリのバージョン"},"license":{"type":"string","title":"License","description":"依存ライブラリのライセンス名"},"text":{"type":"string","title":"Text","description":"依存ライブラリのライセンス本文"}},"type":"object","required":["name","text"],"title":"LicenseInfo","description":"依存ライブラリのライセンス情報"},"Mora":{"properties":{"text":{"type":"string","title":"Text","description":"文字"},"consonant":{"type":"string","title":"Consonant","description":"子音の音素"},"consonant_length":{"type":"number","title":"Consonant Length","description":"子音の音長"},"vowel":{"type":"string","title":"Vowel","description":"母音の音素"},"vowel_length":{"type":"number","title":"Vowel Length","description":"母音の音長"},"pitch":{"type":"number","title":"Pitch","description":"音高"}},"type":"object","required":["text","vowel","vowel_length","pitch"],"title":"Mora","description":"モーラ(子音+母音)ごとの情報"},"MorphableTargetInfo":{"properties":{"is_morphable":{"type":"boolean","title":"Is Morphable","description":"指定したキャラクターに対してモーフィングの可否"}},"type":"object","required":["is_morphable"],"title":"MorphableTargetInfo"},"Note":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id","description":"ID"},"key":{"type":"integer","title":"Key","description":"音階"},"frame_length":{"type":"integer","title":"Frame Length","description":"音符のフレーム長"},"lyric":{"type":"string","title":"Lyric","description":"音符の歌詞"}},"type":"object","required":["frame_length","lyric"],"title":"Note","description":"音符ごとの情報"},"ParseKanaBadRequest":{"properties":{"text":{"type":"string","title":"Text","description":"エラーメッセージ"},"error_name":{"type":"string","title":"Error Name","description":"エラー名\n\n|name|description|\n|---|---|\n| UNKNOWN_TEXT | 判別できない読み仮名があります: {text} |\n| ACCENT_TOP | 句頭にアクセントは置けません: {text} |\n| ACCENT_TWICE | 1つのアクセント句に二つ以上のアクセントは置けません: {text} |\n| ACCENT_NOTFOUND | アクセントを指定していないアクセント句があります: {text} |\n| EMPTY_PHRASE | {position}番目のアクセント句が空白です |\n| INTERROGATION_MARK_NOT_AT_END | アクセント句末以外に「?」は置けません: {text} |\n| INFINITE_LOOP | 処理時に無限ループになってしまいました...バグ報告をお願いします。 |"},"error_args":{"additionalProperties":{"type":"string"},"type":"object","title":"Error Args","description":"エラーを起こした箇所"}},"type":"object","required":["text","error_name","error_args"],"title":"ParseKanaBadRequest"},"Preset":{"properties":{"id":{"type":"integer","title":"Id","description":"プリセットID"},"name":{"type":"string","title":"Name","description":"プリセット名"},"speaker_uuid":{"type":"string","title":"Speaker Uuid","description":"キャラクターのUUID"},"style_id":{"type":"integer","title":"Style Id","description":"スタイルID"},"speedScale":{"type":"number","title":"Speedscale","description":"全体の話速"},"pitchScale":{"type":"number","title":"Pitchscale","description":"全体の音高"},"intonationScale":{"type":"number","title":"Intonationscale","description":"全体の抑揚"},"volumeScale":{"type":"number","title":"Volumescale","description":"全体の音量"},"pauseLengthScale":{"type":"number","title":"Pauselengthscale","description":"句読点などの無音時間(倍率)","default":1},"prePhonemeLength":{"type":"number","title":"Prephonemelength","description":"音声の前の無音時間"},"postPhonemeLength":{"type":"number","title":"Postphonemelength","description":"音声の後の無音時間"},"pauseLength":{"type":"number","title":"Pauselength","description":"句読点などの無音時間"}},"type":"object","required":["id","name","speaker_uuid","style_id","speedScale","pitchScale","intonationScale","volumeScale","prePhonemeLength","postPhonemeLength"],"title":"Preset","description":"プリセット情報"},"Score":{"properties":{"notes":{"items":{"$ref":"#/components/schemas/Note"},"type":"array","title":"Notes","description":"音符のリスト"}},"type":"object","required":["notes"],"title":"Score","description":"楽譜情報"},"Speaker":{"properties":{"name":{"type":"string","title":"Name","description":"名前"},"speaker_uuid":{"type":"string","title":"Speaker Uuid","description":"キャラクターのUUID"},"styles":{"items":{"$ref":"#/components/schemas/SpeakerStyle"},"type":"array","title":"Styles","description":"スタイルの一覧"},"version":{"type":"string","title":"Version","description":"キャラクターのバージョン"},"supported_features":{"allOf":[{"$ref":"#/components/schemas/SpeakerSupportedFeatures"}],"description":"キャラクターの対応機能"}},"type":"object","required":["name","speaker_uuid","styles","version"],"title":"Speaker","description":"キャラクター情報"},"SpeakerInfo":{"properties":{"policy":{"type":"string","title":"Policy","description":"policy.md"},"portrait":{"type":"string","title":"Portrait","description":"立ち絵画像をbase64エンコードしたもの、あるいはURL"},"style_infos":{"items":{"$ref":"#/components/schemas/StyleInfo"},"type":"array","title":"Style Infos","description":"スタイルの追加情報"}},"type":"object","required":["policy","portrait","style_infos"],"title":"SpeakerInfo","description":"キャラクターの追加情報"},"SpeakerStyle":{"properties":{"name":{"type":"string","title":"Name","description":"スタイル名"},"id":{"type":"integer","title":"Id","description":"スタイルID"},"type":{"type":"string","enum":["talk","singing_teacher","frame_decode","sing"],"title":"Type","description":"スタイルの種類。talk:音声合成クエリの作成と音声合成が可能。singing_teacher:歌唱音声合成用のクエリの作成が可能。frame_decode:歌唱音声合成が可能。sing:歌唱音声合成用のクエリの作成と歌唱音声合成が可能。","default":"talk"}},"type":"object","required":["name","id"],"title":"SpeakerStyle","description":"キャラクターのスタイル情報"},"SpeakerSupportedFeatures":{"properties":{"permitted_synthesis_morphing":{"type":"string","enum":["ALL","SELF_ONLY","NOTHING"],"title":"Permitted Synthesis Morphing","description":"モーフィング機能への対応。'ALL' は「全て許可」、'SELF_ONLY' は「同じキャラクター内でのみ許可」、'NOTHING' は「全て禁止」","default":"ALL"}},"type":"object","title":"SpeakerSupportedFeatures","description":"キャラクターの対応機能の情報"},"StyleInfo":{"properties":{"id":{"type":"integer","title":"Id","description":"スタイルID"},"icon":{"type":"string","title":"Icon","description":"このスタイルのアイコンをbase64エンコードしたもの、あるいはURL"},"portrait":{"type":"string","title":"Portrait","description":"このスタイルの立ち絵画像をbase64エンコードしたもの、あるいはURL"},"voice_samples":{"items":{"type":"string"},"type":"array","title":"Voice Samples","description":"サンプル音声をbase64エンコードしたもの、あるいはURL"}},"type":"object","required":["id","icon","voice_samples"],"title":"StyleInfo","description":"スタイルの追加情報"},"SupportedDevicesInfo":{"properties":{"cpu":{"type":"boolean","title":"Cpu","description":"CPUに対応しているか"},"cuda":{"type":"boolean","title":"Cuda","description":"CUDA(Nvidia GPU)に対応しているか"},"dml":{"type":"boolean","title":"Dml","description":"DirectML(Nvidia GPU/Radeon GPU等)に対応しているか"}},"type":"object","required":["cpu","cuda","dml"],"title":"SupportedDevicesInfo","description":"対応しているデバイスの情報"},"SupportedFeatures":{"properties":{"adjust_mora_pitch":{"type":"boolean","title":"Adjust Mora Pitch","description":"モーラごとの音高の調整"},"adjust_phoneme_length":{"type":"boolean","title":"Adjust Phoneme Length","description":"音素ごとの長さの調整"},"adjust_speed_scale":{"type":"boolean","title":"Adjust Speed Scale","description":"全体の話速の調整"},"adjust_pitch_scale":{"type":"boolean","title":"Adjust Pitch Scale","description":"全体の音高の調整"},"adjust_intonation_scale":{"type":"boolean","title":"Adjust Intonation Scale","description":"全体の抑揚の調整"},"adjust_volume_scale":{"type":"boolean","title":"Adjust Volume Scale","description":"全体の音量の調整"},"adjust_pause_length":{"type":"boolean","title":"Adjust Pause Length","description":"句読点などの無音時間の調整"},"interrogative_upspeak":{"type":"boolean","title":"Interrogative Upspeak","description":"疑問文の自動調整"},"synthesis_morphing":{"type":"boolean","title":"Synthesis Morphing","description":"2種類のスタイルでモーフィングした音声を合成"},"sing":{"type":"boolean","title":"Sing","description":"歌唱音声合成"},"manage_library":{"type":"boolean","title":"Manage Library","description":"音声ライブラリのインストール・アンインストール"},"return_resource_url":{"type":"boolean","title":"Return Resource Url","description":"キャラクター情報のリソースをURLで返送"}},"type":"object","required":["adjust_mora_pitch","adjust_phoneme_length","adjust_speed_scale","adjust_pitch_scale","adjust_intonation_scale","adjust_volume_scale","interrogative_upspeak","synthesis_morphing"],"title":"SupportedFeatures","description":"エンジンが持つ機能の一覧"},"UpdateInfo":{"properties":{"version":{"type":"string","title":"Version","description":"エンジンのバージョン名"},"descriptions":{"items":{"type":"string"},"type":"array","title":"Descriptions","description":"アップデートの詳細についての説明"},"contributors":{"items":{"type":"string"},"type":"array","title":"Contributors","description":"貢献者名"}},"type":"object","required":["version","descriptions"],"title":"UpdateInfo","description":"エンジンのアップデート情報"},"UserDictWord":{"properties":{"surface":{"type":"string","title":"Surface","description":"表層形"},"priority":{"type":"integer","maximum":10,"minimum":0,"title":"Priority","description":"優先度"},"context_id":{"type":"integer","title":"Context Id","description":"文脈ID","default":1348},"part_of_speech":{"type":"string","title":"Part Of Speech","description":"品詞"},"part_of_speech_detail_1":{"type":"string","title":"Part Of Speech Detail 1","description":"品詞細分類1"},"part_of_speech_detail_2":{"type":"string","title":"Part Of Speech Detail 2","description":"品詞細分類2"},"part_of_speech_detail_3":{"type":"string","title":"Part Of Speech Detail 3","description":"品詞細分類3"},"inflectional_type":{"type":"string","title":"Inflectional Type","description":"活用型"},"inflectional_form":{"type":"string","title":"Inflectional Form","description":"活用形"},"stem":{"type":"string","title":"Stem","description":"原形"},"yomi":{"type":"string","title":"Yomi","description":"読み"},"pronunciation":{"type":"string","title":"Pronunciation","description":"発音"},"accent_type":{"type":"integer","title":"Accent Type","description":"アクセント型"},"mora_count":{"type":"integer","title":"Mora Count","description":"モーラ数"},"accent_associative_rule":{"type":"string","title":"Accent Associative Rule","description":"アクセント結合規則"}},"type":"object","required":["surface","priority","part_of_speech","part_of_speech_detail_1","part_of_speech_detail_2","part_of_speech_detail_3","inflectional_type","inflectional_form","stem","yomi","pronunciation","accent_type","accent_associative_rule"],"title":"UserDictWord","description":"辞書のコンパイルに使われる情報"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WordTypes":{"type":"string","enum":["PROPER_NOUN","COMMON_NOUN","VERB","ADJECTIVE","SUFFIX"],"title":"WordTypes","description":"品詞"},"BaseLibraryInfo":{"description":"音声ライブラリの情報","properties":{"name":{"description":"音声ライブラリの名前","title":"Name","type":"string"},"uuid":{"description":"音声ライブラリのUUID","title":"Uuid","type":"string"},"version":{"description":"音声ライブラリのバージョン","title":"Version","type":"string"},"download_url":{"description":"音声ライブラリのダウンロードURL","title":"Download Url","type":"string"},"bytes":{"description":"音声ライブラリのバイト数","title":"Bytes","type":"integer"},"speakers":{"description":"音声ライブラリに含まれるキャラクターのリスト","items":{"$ref":"#/components/schemas/LibrarySpeaker"},"title":"Speakers","type":"array"}},"required":["name","uuid","version","download_url","bytes","speakers"],"title":"BaseLibraryInfo","type":"object"},"VvlibManifest":{"description":"vvlib(VOICEVOX Library)に関する情報","properties":{"manifest_version":{"description":"マニフェストバージョン","title":"Manifest Version","type":"string"},"name":{"description":"音声ライブラリ名","title":"Name","type":"string"},"version":{"description":"音声ライブラリバージョン","title":"Version","type":"string"},"uuid":{"description":"音声ライブラリのUUID","title":"Uuid","type":"string"},"brand_name":{"description":"エンジンのブランド名","title":"Brand Name","type":"string"},"engine_name":{"description":"エンジン名","title":"Engine Name","type":"string"},"engine_uuid":{"description":"エンジンのUUID","title":"Engine Uuid","type":"string"}},"required":["manifest_version","name","version","uuid","brand_name","engine_name","engine_uuid"],"title":"VvlibManifest","type":"object"}}}} \ No newline at end of file diff --git a/src/components/Talk/AudioInfo.vue b/src/components/Talk/AudioInfo.vue index 2f88550845..9979426acb 100644 --- a/src/components/Talk/AudioInfo.vue +++ b/src/components/Talk/AudioInfo.vue @@ -434,6 +434,24 @@ const parameterConfigs = computed(() => [ }), key: "volumeScale", }, + { + label: "文内無音倍率", + sliderProps: { + modelValue: () => query.value?.pauseLengthScale ?? null, + disable: () => uiLocked.value, + max: SLIDER_PARAMETERS.PAUSE_LENGTH_SCALE.max, + min: SLIDER_PARAMETERS.PAUSE_LENGTH_SCALE.min, + step: SLIDER_PARAMETERS.PAUSE_LENGTH_SCALE.step, + scrollStep: SLIDER_PARAMETERS.PAUSE_LENGTH_SCALE.scrollStep, + scrollMinStep: SLIDER_PARAMETERS.PAUSE_LENGTH_SCALE.scrollMinStep, + }, + onChange: (pauseLengthScale: number) => + store.actions.COMMAND_MULTI_SET_AUDIO_PAUSE_LENGTH_SCALE({ + audioKeys: selectedAudioKeys.value, + pauseLengthScale, + }), + key: "pauseLengthScale", + }, { label: "開始無音", sliderProps: { @@ -470,24 +488,6 @@ const parameterConfigs = computed(() => [ }), key: "postPhonemeLength", }, - { - label: "文内無音倍率", - sliderProps: { - modelValue: () => query.value?.pauseLengthScale ?? null, - disable: () => uiLocked.value, - max: SLIDER_PARAMETERS.PAUSE_LENGTH_SCALE.max, - min: SLIDER_PARAMETERS.PAUSE_LENGTH_SCALE.min, - step: SLIDER_PARAMETERS.PAUSE_LENGTH_SCALE.step, - scrollStep: SLIDER_PARAMETERS.PAUSE_LENGTH_SCALE.scrollStep, - scrollMinStep: SLIDER_PARAMETERS.PAUSE_LENGTH_SCALE.scrollMinStep, - }, - onChange: (pauseLengthScale: number) => - store.actions.COMMAND_MULTI_SET_AUDIO_PAUSE_LENGTH_SCALE({ - audioKeys: selectedAudioKeys.value, - pauseLengthScale, - }), - key: "pauseLengthScale", - }, ]); /** パラメーター制御用 */ diff --git a/src/domain/project/index.ts b/src/domain/project/index.ts index 1deb9974a7..b6d3e3d317 100644 --- a/src/domain/project/index.ts +++ b/src/domain/project/index.ts @@ -125,9 +125,9 @@ export const migrateProjectFileObject = async ( for (const audioItemsKey in projectData.audioItems) { if (projectData.audioItems[audioItemsKey].query != null) { projectData.audioItems[audioItemsKey].query.volumeScale = 1; + projectData.audioItems[audioItemsKey].query.pauseLengthScale = 1; projectData.audioItems[audioItemsKey].query.prePhonemeLength = 0.1; projectData.audioItems[audioItemsKey].query.postPhonemeLength = 0.1; - projectData.audioItems[audioItemsKey].query.pauseLengthScale = 1; projectData.audioItems[audioItemsKey].query.outputSamplingRate = DEFAULT_SAMPLING_RATE; } diff --git a/src/domain/project/schema.ts b/src/domain/project/schema.ts index 8a38cea26f..eba32d5989 100644 --- a/src/domain/project/schema.ts +++ b/src/domain/project/schema.ts @@ -33,9 +33,9 @@ const audioQuerySchema = z.object({ pitchScale: z.number(), intonationScale: z.number(), volumeScale: z.number(), + pauseLengthScale: z.number(), prePhonemeLength: z.number(), postPhonemeLength: z.number(), - pauseLengthScale: z.number(), outputSamplingRate: z.union([z.number(), z.literal("engineDefault")]), outputStereo: z.boolean(), kana: z.string().optional(), diff --git a/src/openapi/models/AudioQuery.ts b/src/openapi/models/AudioQuery.ts index ad59b95877..92b82012b8 100644 --- a/src/openapi/models/AudioQuery.ts +++ b/src/openapi/models/AudioQuery.ts @@ -56,6 +56,12 @@ export interface AudioQuery { * @memberof AudioQuery */ volumeScale: number; + /** + * 句読点などの無音時間(倍率)。デフォルト値は1 + * @type {number} + * @memberof AudioQuery + */ + pauseLengthScale: number; /** * 音声の前の無音時間 * @type {number} @@ -74,12 +80,6 @@ export interface AudioQuery { * @memberof AudioQuery */ pauseLength?: number | null; - /** - * 句読点などの無音時間(倍率)。デフォルト値は1 - * @type {number} - * @memberof AudioQuery - */ - pauseLengthScale: number; /** * 音声データの出力サンプリングレート * @type {number} @@ -134,10 +134,10 @@ export function AudioQueryFromJSONTyped(json: any, ignoreDiscriminator: boolean) 'pitchScale': json['pitchScale'], 'intonationScale': json['intonationScale'], 'volumeScale': json['volumeScale'], + 'pauseLengthScale': !exists(json, 'pauseLengthScale') ? undefined : json['pauseLengthScale'], 'prePhonemeLength': json['prePhonemeLength'], 'postPhonemeLength': json['postPhonemeLength'], 'pauseLength': !exists(json, 'pauseLength') ? undefined : json['pauseLength'], - 'pauseLengthScale': !exists(json, 'pauseLengthScale') ? undefined : json['pauseLengthScale'], 'outputSamplingRate': json['outputSamplingRate'], 'outputStereo': json['outputStereo'], 'kana': !exists(json, 'kana') ? undefined : json['kana'], @@ -158,10 +158,10 @@ export function AudioQueryToJSON(value?: AudioQuery | null): any { 'pitchScale': value.pitchScale, 'intonationScale': value.intonationScale, 'volumeScale': value.volumeScale, + 'pauseLengthScale': value.pauseLengthScale, 'prePhonemeLength': value.prePhonemeLength, 'postPhonemeLength': value.postPhonemeLength, 'pauseLength': value.pauseLength, - 'pauseLengthScale': value.pauseLengthScale, 'outputSamplingRate': value.outputSamplingRate, 'outputStereo': value.outputStereo, 'kana': value.kana, diff --git a/src/openapi/models/Preset.ts b/src/openapi/models/Preset.ts index 5f4cfe6371..6397e928cf 100644 --- a/src/openapi/models/Preset.ts +++ b/src/openapi/models/Preset.ts @@ -67,6 +67,12 @@ export interface Preset { * @memberof Preset */ volumeScale: number; + /** + * 句読点などの無音時間(倍率) + * @type {number} + * @memberof Preset + */ + pauseLengthScale: number; /** * 音声の前の無音時間 * @type {number} @@ -85,12 +91,6 @@ export interface Preset { * @memberof Preset */ pauseLength?: number; - /** - * 句読点などの無音時間(倍率) - * @type {number} - * @memberof Preset - */ - pauseLengthScale: number; } /** @@ -131,10 +131,10 @@ export function PresetFromJSONTyped(json: any, ignoreDiscriminator: boolean): Pr 'pitchScale': json['pitchScale'], 'intonationScale': json['intonationScale'], 'volumeScale': json['volumeScale'], + 'pauseLengthScale': !exists(json, 'pauseLengthScale') ? undefined : json['pauseLengthScale'], 'prePhonemeLength': json['prePhonemeLength'], 'postPhonemeLength': json['postPhonemeLength'], 'pauseLength': !exists(json, 'pauseLength') ? undefined : json['pauseLength'], - 'pauseLengthScale': !exists(json, 'pauseLengthScale') ? undefined : json['pauseLengthScale'], }; } @@ -155,10 +155,10 @@ export function PresetToJSON(value?: Preset | null): any { 'pitchScale': value.pitchScale, 'intonationScale': value.intonationScale, 'volumeScale': value.volumeScale, + 'pauseLengthScale': value.pauseLengthScale, 'prePhonemeLength': value.prePhonemeLength, 'postPhonemeLength': value.postPhonemeLength, 'pauseLength': value.pauseLength, - 'pauseLengthScale': value.pauseLengthScale, }; } diff --git a/src/store/audio.ts b/src/store/audio.ts index 9ef03bd106..21719cd00d 100644 --- a/src/store/audio.ts +++ b/src/store/audio.ts @@ -893,48 +893,48 @@ export const audioStore = createPartialStore({ }, }, - SET_AUDIO_PRE_PHONEME_LENGTH: { + SET_AUDIO_PAUSE_LENGTH_SCALE: { mutation( state, { audioKey, - prePhonemeLength, - }: { audioKey: AudioKey; prePhonemeLength: number }, + pauseLengthScale, + }: { + audioKey: AudioKey; + pauseLengthScale: number; + }, ) { const query = state.audioItems[audioKey].query; if (query == undefined) throw new Error("query == undefined"); - query.prePhonemeLength = prePhonemeLength; + query.pauseLengthScale = pauseLengthScale; }, }, - SET_AUDIO_POST_PHONEME_LENGTH: { + SET_AUDIO_PRE_PHONEME_LENGTH: { mutation( state, { audioKey, - postPhonemeLength, - }: { audioKey: AudioKey; postPhonemeLength: number }, + prePhonemeLength, + }: { audioKey: AudioKey; prePhonemeLength: number }, ) { const query = state.audioItems[audioKey].query; if (query == undefined) throw new Error("query == undefined"); - query.postPhonemeLength = postPhonemeLength; + query.prePhonemeLength = prePhonemeLength; }, }, - SET_AUDIO_PAUSE_LENGTH_SCALE: { + SET_AUDIO_POST_PHONEME_LENGTH: { mutation( state, { audioKey, - pauseLengthScale, - }: { - audioKey: AudioKey; - pauseLengthScale: number; - }, + postPhonemeLength, + }: { audioKey: AudioKey; postPhonemeLength: number }, ) { const query = state.audioItems[audioKey].query; if (query == undefined) throw new Error("query == undefined"); - query.pauseLengthScale = pauseLengthScale; + query.postPhonemeLength = postPhonemeLength; }, }, @@ -2733,66 +2733,66 @@ export const audioCommandStore = transformCommandStore( }, }, - COMMAND_MULTI_SET_AUDIO_PRE_PHONEME_LENGTH: { + COMMAND_MULTI_SET_AUDIO_PAUSE_LENGTH_SCALE: { mutation( draft, - payload: { audioKeys: AudioKey[]; prePhonemeLength: number }, + payload: { + audioKeys: AudioKey[]; + pauseLengthScale: number; + }, ) { for (const audioKey of payload.audioKeys) { - audioStore.mutations.SET_AUDIO_PRE_PHONEME_LENGTH(draft, { + audioStore.mutations.SET_AUDIO_PAUSE_LENGTH_SCALE(draft, { audioKey, - prePhonemeLength: payload.prePhonemeLength, + pauseLengthScale: payload.pauseLengthScale, }); } }, action( { mutations }, - payload: { audioKeys: AudioKey[]; prePhonemeLength: number }, + payload: { audioKeys: AudioKey[]; pauseLengthScale: number }, ) { - mutations.COMMAND_MULTI_SET_AUDIO_PRE_PHONEME_LENGTH(payload); + mutations.COMMAND_MULTI_SET_AUDIO_PAUSE_LENGTH_SCALE(payload); }, }, - COMMAND_MULTI_SET_AUDIO_POST_PHONEME_LENGTH: { + COMMAND_MULTI_SET_AUDIO_PRE_PHONEME_LENGTH: { mutation( draft, - payload: { audioKeys: AudioKey[]; postPhonemeLength: number }, + payload: { audioKeys: AudioKey[]; prePhonemeLength: number }, ) { for (const audioKey of payload.audioKeys) { - audioStore.mutations.SET_AUDIO_POST_PHONEME_LENGTH(draft, { + audioStore.mutations.SET_AUDIO_PRE_PHONEME_LENGTH(draft, { audioKey, - postPhonemeLength: payload.postPhonemeLength, + prePhonemeLength: payload.prePhonemeLength, }); } }, action( { mutations }, - payload: { audioKeys: AudioKey[]; postPhonemeLength: number }, + payload: { audioKeys: AudioKey[]; prePhonemeLength: number }, ) { - mutations.COMMAND_MULTI_SET_AUDIO_POST_PHONEME_LENGTH(payload); + mutations.COMMAND_MULTI_SET_AUDIO_PRE_PHONEME_LENGTH(payload); }, }, - COMMAND_MULTI_SET_AUDIO_PAUSE_LENGTH_SCALE: { + COMMAND_MULTI_SET_AUDIO_POST_PHONEME_LENGTH: { mutation( draft, - payload: { - audioKeys: AudioKey[]; - pauseLengthScale: number; - }, + payload: { audioKeys: AudioKey[]; postPhonemeLength: number }, ) { for (const audioKey of payload.audioKeys) { - audioStore.mutations.SET_AUDIO_PAUSE_LENGTH_SCALE(draft, { + audioStore.mutations.SET_AUDIO_POST_PHONEME_LENGTH(draft, { audioKey, - pauseLengthScale: payload.pauseLengthScale, + postPhonemeLength: payload.postPhonemeLength, }); } }, action( - { commit }, - payload: { audioKeys: AudioKey[]; pauseLengthScale: number }, + { mutations }, + payload: { audioKeys: AudioKey[]; postPhonemeLength: number }, ) { - commit("COMMAND_MULTI_SET_AUDIO_PAUSE_LENGTH_SCALE", payload); + mutations.COMMAND_MULTI_SET_AUDIO_POST_PHONEME_LENGTH(payload); }, }, diff --git a/src/store/preset.ts b/src/store/preset.ts index dfd635dc4e..6672d5dd81 100644 --- a/src/store/preset.ts +++ b/src/store/preset.ts @@ -222,9 +222,9 @@ export const presetStore = createPartialStore({ pitchScale: 0.0, intonationScale: 1.0, volumeScale: 1.0, + pauseLengthScale: 1, prePhonemeLength: 0.1, postPhonemeLength: 0.1, - pauseLengthScale: 1, }; const newPresetKey = await actions.ADD_PRESET({ presetData }); diff --git a/src/store/type.ts b/src/store/type.ts index af8e2986cd..2586bbf122 100644 --- a/src/store/type.ts +++ b/src/store/type.ts @@ -290,6 +290,10 @@ export type AudioStoreTypes = { mutation: { audioKey: AudioKey; volumeScale: number }; }; + SET_AUDIO_PAUSE_LENGTH_SCALE: { + mutation: { audioKey: AudioKey; pauseLengthScale: number }; + }; + SET_AUDIO_PRE_PHONEME_LENGTH: { mutation: { audioKey: AudioKey; prePhonemeLength: number }; }; @@ -298,10 +302,6 @@ export type AudioStoreTypes = { mutation: { audioKey: AudioKey; postPhonemeLength: number }; }; - SET_AUDIO_PAUSE_LENGTH_SCALE: { - mutation: { audioKey: AudioKey; pauseLengthScale: number }; - }; - LOAD_MORPHABLE_TARGETS: { action(payload: { engineId: EngineId; baseStyleId: StyleId }): void; }; @@ -631,6 +631,11 @@ export type AudioCommandStoreTypes = { action(payload: { audioKeys: AudioKey[]; volumeScale: number }): void; }; + COMMAND_MULTI_SET_AUDIO_PAUSE_LENGTH_SCALE: { + mutation: { audioKeys: AudioKey[]; pauseLengthScale: number }; + action(payload: { audioKeys: AudioKey[]; pauseLengthScale: number }): void; + }; + COMMAND_MULTI_SET_AUDIO_PRE_PHONEME_LENGTH: { mutation: { audioKeys: AudioKey[]; prePhonemeLength: number }; action(payload: { audioKeys: AudioKey[]; prePhonemeLength: number }): void; @@ -641,11 +646,6 @@ export type AudioCommandStoreTypes = { action(payload: { audioKeys: AudioKey[]; postPhonemeLength: number }): void; }; - COMMAND_MULTI_SET_AUDIO_PAUSE_LENGTH_SCALE: { - mutation: { audioKeys: AudioKey[]; pauseLengthScale: number }; - action(payload: { audioKeys: AudioKey[]; pauseLengthScale: number }): void; - }; - COMMAND_MULTI_SET_MORPHING_INFO: { mutation: { audioKeys: AudioKey[]; diff --git a/src/type/preload.ts b/src/type/preload.ts index 55872ef44e..7e6d141999 100644 --- a/src/type/preload.ts +++ b/src/type/preload.ts @@ -414,9 +414,9 @@ export type Preset = { pitchScale: number; intonationScale: number; volumeScale: number; + pauseLengthScale: number; prePhonemeLength: number; postPhonemeLength: number; - pauseLengthScale: number; morphingInfo?: MorphingInfo; }; @@ -644,9 +644,9 @@ export const configSchema = z pitchScale: z.number(), intonationScale: z.number(), volumeScale: z.number(), + pauseLengthScale: z.number(), prePhonemeLength: z.number(), postPhonemeLength: z.number(), - pauseLengthScale: z.number(), morphingInfo: z .object({ rate: z.number(), From 7f72bc095292b24e01fea4f83919450c656e2f5a Mon Sep 17 00:00:00 2001 From: X-20A <155217226+X-20A@users.noreply.github.com> Date: Fri, 15 Nov 2024 06:36:14 +0900 Subject: [PATCH 08/11] =?UTF-8?q?=E6=BC=8F=E3=82=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/domain/project/index.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/domain/project/index.ts b/src/domain/project/index.ts index 74feb2fab0..6be25eb57b 100644 --- a/src/domain/project/index.ts +++ b/src/domain/project/index.ts @@ -307,7 +307,6 @@ export const migrateProjectFileObject = async ( // 文内無音倍率の追加 for (const audioItemsKey in projectData.talk.audioItems) { projectData.talk.audioItems[audioItemsKey].query.pauseLengthScale = 1; - console.log(projectData.talk.audioItems[audioItemsKey].query); } } From d6d219b9453b5baa67d6f535eefd7de7c9bc4f80 Mon Sep 17 00:00:00 2001 From: X-20A <155217226+X-20A@users.noreply.github.com> Date: Fri, 15 Nov 2024 21:48:32 +0900 Subject: [PATCH 09/11] =?UTF-8?q?=E8=AA=BF=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- openapi.json | 2 +- src/openapi/models/AudioQuery.ts | 16 ++++++++-------- src/openapi/models/Preset.ts | 16 ++++++++-------- src/store/audio.ts | 7 +++---- src/store/audioGenerate.ts | 6 +++++- 5 files changed, 25 insertions(+), 22 deletions(-) diff --git a/openapi.json b/openapi.json index cc3615f053..b91b38e738 100644 --- a/openapi.json +++ b/openapi.json @@ -1 +1 @@ -{"openapi":"3.1.0","info":{"title":"VOICEVOX Engine","description":"VOICEVOX の音声合成エンジンです。","version":"latest"},"paths":{"/audio_query":{"post":{"tags":["クエリ作成"],"summary":"音声合成用のクエリを作成する","description":"音声合成用のクエリの初期値を得ます。ここで得られたクエリはそのまま音声合成に利用できます。各値の意味は`Schemas`を参照してください。","operationId":"audio_query_audio_query_post","parameters":[{"name":"text","in":"query","required":true,"schema":{"type":"string","title":"Text"}},{"name":"speaker","in":"query","required":true,"schema":{"type":"integer","title":"Speaker"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudioQuery"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/audio_query_from_preset":{"post":{"tags":["クエリ作成"],"summary":"音声合成用のクエリをプリセットを用いて作成する","description":"音声合成用のクエリの初期値を得ます。ここで得られたクエリはそのまま音声合成に利用できます。各値の意味は`Schemas`を参照してください。","operationId":"audio_query_from_preset_audio_query_from_preset_post","parameters":[{"name":"text","in":"query","required":true,"schema":{"type":"string","title":"Text"}},{"name":"preset_id","in":"query","required":true,"schema":{"type":"integer","title":"Preset Id"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudioQuery"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/accent_phrases":{"post":{"tags":["クエリ編集"],"summary":"テキストからアクセント句を得る","description":"テキストからアクセント句を得ます。\nis_kanaが`true`のとき、テキストは次のAquesTalk 風記法で解釈されます。デフォルトは`false`です。\n* 全てのカナはカタカナで記述される\n* アクセント句は`/`または`、`で区切る。`、`で区切った場合に限り無音区間が挿入される。\n* カナの手前に`_`を入れるとそのカナは無声化される\n* アクセント位置を`'`で指定する。全てのアクセント句にはアクセント位置を1つ指定する必要がある。\n* アクセント句末に`?`(全角)を入れることにより疑問文の発音ができる。","operationId":"accent_phrases_accent_phrases_post","parameters":[{"name":"text","in":"query","required":true,"schema":{"type":"string","title":"Text"}},{"name":"speaker","in":"query","required":true,"schema":{"type":"integer","title":"Speaker"}},{"name":"is_kana","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Is Kana"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AccentPhrase"},"title":"Response Accent Phrases Accent Phrases Post"}}}},"400":{"description":"読み仮名のパースに失敗","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParseKanaBadRequest"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mora_data":{"post":{"tags":["クエリ編集"],"summary":"アクセント句から音高・音素長を得る","operationId":"mora_data_mora_data_post","parameters":[{"name":"speaker","in":"query","required":true,"schema":{"type":"integer","title":"Speaker"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AccentPhrase"},"title":"Accent Phrases"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AccentPhrase"},"title":"Response Mora Data Mora Data Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mora_length":{"post":{"tags":["クエリ編集"],"summary":"アクセント句から音素長を得る","operationId":"mora_length_mora_length_post","parameters":[{"name":"speaker","in":"query","required":true,"schema":{"type":"integer","title":"Speaker"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AccentPhrase"},"title":"Accent Phrases"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AccentPhrase"},"title":"Response Mora Length Mora Length Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mora_pitch":{"post":{"tags":["クエリ編集"],"summary":"アクセント句から音高を得る","operationId":"mora_pitch_mora_pitch_post","parameters":[{"name":"speaker","in":"query","required":true,"schema":{"type":"integer","title":"Speaker"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AccentPhrase"},"title":"Accent Phrases"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AccentPhrase"},"title":"Response Mora Pitch Mora Pitch Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/synthesis":{"post":{"tags":["音声合成"],"summary":"音声合成する","operationId":"synthesis_synthesis_post","parameters":[{"name":"speaker","in":"query","required":true,"schema":{"type":"integer","title":"Speaker"}},{"name":"enable_interrogative_upspeak","in":"query","required":false,"schema":{"type":"boolean","description":"疑問系のテキストが与えられたら語尾を自動調整する","default":true,"title":"Enable Interrogative Upspeak"},"description":"疑問系のテキストが与えられたら語尾を自動調整する"},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudioQuery"}}}},"responses":{"200":{"description":"Successful Response","content":{"audio/wav":{"schema":{"type":"string","format":"binary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/cancellable_synthesis":{"post":{"tags":["音声合成"],"summary":"音声合成する(キャンセル可能)","operationId":"cancellable_synthesis_cancellable_synthesis_post","parameters":[{"name":"speaker","in":"query","required":true,"schema":{"type":"integer","title":"Speaker"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudioQuery"}}}},"responses":{"200":{"description":"Successful Response","content":{"audio/wav":{"schema":{"type":"string","format":"binary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/multi_synthesis":{"post":{"tags":["音声合成"],"summary":"複数まとめて音声合成する","operationId":"multi_synthesis_multi_synthesis_post","parameters":[{"name":"speaker","in":"query","required":true,"schema":{"type":"integer","title":"Speaker"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AudioQuery"},"title":"Queries"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/zip":{"schema":{"type":"string","format":"binary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sing_frame_audio_query":{"post":{"tags":["クエリ作成"],"summary":"歌唱音声合成用のクエリを作成する","description":"歌唱音声合成用のクエリの初期値を得ます。ここで得られたクエリはそのまま歌唱音声合成に利用できます。各値の意味は`Schemas`を参照してください。","operationId":"sing_frame_audio_query_sing_frame_audio_query_post","parameters":[{"name":"speaker","in":"query","required":true,"schema":{"type":"integer","title":"Speaker"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Score"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FrameAudioQuery"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sing_frame_volume":{"post":{"tags":["クエリ編集"],"summary":"スコア・歌唱音声合成用のクエリからフレームごとの音量を得る","operationId":"sing_frame_volume_sing_frame_volume_post","parameters":[{"name":"speaker","in":"query","required":true,"schema":{"type":"integer","title":"Speaker"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_sing_frame_volume_sing_frame_volume_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"number"},"title":"Response Sing Frame Volume Sing Frame Volume Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/frame_synthesis":{"post":{"tags":["音声合成"],"summary":"Frame Synthesis","description":"歌唱音声合成を行います。","operationId":"frame_synthesis_frame_synthesis_post","parameters":[{"name":"speaker","in":"query","required":true,"schema":{"type":"integer","title":"Speaker"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FrameAudioQuery"}}}},"responses":{"200":{"description":"Successful Response","content":{"audio/wav":{"schema":{"type":"string","format":"binary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/connect_waves":{"post":{"tags":["その他"],"summary":"base64エンコードされた複数のwavデータを一つに結合する","description":"base64エンコードされたwavデータを一纏めにし、wavファイルで返します。","operationId":"connect_waves_connect_waves_post","requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array","title":"Waves"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"audio/wav":{"schema":{"type":"string","format":"binary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/validate_kana":{"post":{"tags":["その他"],"summary":"テキストがAquesTalk 風記法に従っているか判定する","description":"テキストがAquesTalk 風記法に従っているかどうかを判定します。\n従っていない場合はエラーが返ります。","operationId":"validate_kana_validate_kana_post","parameters":[{"name":"text","in":"query","required":true,"schema":{"type":"string","description":"判定する対象の文字列","title":"Text"},"description":"判定する対象の文字列"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"boolean","title":"Response Validate Kana Validate Kana Post"}}}},"400":{"description":"テキストが不正です","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParseKanaBadRequest"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/initialize_speaker":{"post":{"tags":["その他"],"summary":"Initialize Speaker","description":"指定されたスタイルを初期化します。\n実行しなくても他のAPIは使用できますが、初回実行時に時間がかかることがあります。","operationId":"initialize_speaker_initialize_speaker_post","parameters":[{"name":"speaker","in":"query","required":true,"schema":{"type":"integer","title":"Speaker"}},{"name":"skip_reinit","in":"query","required":false,"schema":{"type":"boolean","description":"既に初期化済みのスタイルの再初期化をスキップするかどうか","default":false,"title":"Skip Reinit"},"description":"既に初期化済みのスタイルの再初期化をスキップするかどうか"},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/is_initialized_speaker":{"get":{"tags":["その他"],"summary":"Is Initialized Speaker","description":"指定されたスタイルが初期化されているかどうかを返します。","operationId":"is_initialized_speaker_is_initialized_speaker_get","parameters":[{"name":"speaker","in":"query","required":true,"schema":{"type":"integer","title":"Speaker"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"boolean","title":"Response Is Initialized Speaker Is Initialized Speaker Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/supported_devices":{"get":{"tags":["その他"],"summary":"Supported Devices","description":"対応デバイスの一覧を取得します。","operationId":"supported_devices_supported_devices_get","parameters":[{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SupportedDevicesInfo"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/morphable_targets":{"post":{"tags":["音声合成"],"summary":"指定したスタイルに対してエンジン内のキャラクターがモーフィングが可能か判定する","description":"指定されたベーススタイルに対してエンジン内の各キャラクターがモーフィング機能を利用可能か返します。\nモーフィングの許可/禁止は`/speakers`の`speaker.supported_features.synthesis_morphing`に記載されています。\nプロパティが存在しない場合は、モーフィングが許可されているとみなします。\n返り値のスタイルIDはstring型なので注意。","operationId":"morphable_targets_morphable_targets_post","parameters":[{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"type":"integer"},"title":"Base Style Ids"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/MorphableTargetInfo"}},"title":"Response Morphable Targets Morphable Targets Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/synthesis_morphing":{"post":{"tags":["音声合成"],"summary":"2種類のスタイルでモーフィングした音声を合成する","description":"指定された2種類のスタイルで音声を合成、指定した割合でモーフィングした音声を得ます。\nモーフィングの割合は`morph_rate`で指定でき、0.0でベースのスタイル、1.0でターゲットのスタイルに近づきます。","operationId":"_synthesis_morphing_synthesis_morphing_post","parameters":[{"name":"base_speaker","in":"query","required":true,"schema":{"type":"integer","title":"Base Speaker"}},{"name":"target_speaker","in":"query","required":true,"schema":{"type":"integer","title":"Target Speaker"}},{"name":"morph_rate","in":"query","required":true,"schema":{"type":"number","maximum":1,"minimum":0,"title":"Morph Rate"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudioQuery"}}}},"responses":{"200":{"description":"Successful Response","content":{"audio/wav":{"schema":{"type":"string","format":"binary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/presets":{"get":{"tags":["その他"],"summary":"Get Presets","description":"エンジンが保持しているプリセットの設定を返します","operationId":"get_presets_presets_get","responses":{"200":{"description":"プリセットのリスト","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/Preset"},"type":"array","title":"Response Get Presets Presets Get"}}}}}}},"/add_preset":{"post":{"tags":["その他"],"summary":"Add Preset","description":"新しいプリセットを追加します","operationId":"add_preset_add_preset_post","requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Preset"}],"title":"Preset","description":"新しいプリセット。プリセットIDが既存のものと重複している場合は、新規のプリセットIDが採番されます。"}}},"required":true},"responses":{"200":{"description":"追加したプリセットのプリセットID","content":{"application/json":{"schema":{"type":"integer","title":"Response Add Preset Add Preset Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/update_preset":{"post":{"tags":["その他"],"summary":"Update Preset","description":"既存のプリセットを更新します","operationId":"update_preset_update_preset_post","requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Preset"}],"title":"Preset","description":"更新するプリセット。プリセットIDが更新対象と一致している必要があります。"}}},"required":true},"responses":{"200":{"description":"更新したプリセットのプリセットID","content":{"application/json":{"schema":{"type":"integer","title":"Response Update Preset Update Preset Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/delete_preset":{"post":{"tags":["その他"],"summary":"Delete Preset","description":"既存のプリセットを削除します","operationId":"delete_preset_delete_preset_post","parameters":[{"name":"id","in":"query","required":true,"schema":{"type":"integer","description":"削除するプリセットのプリセットID","title":"Id"},"description":"削除するプリセットのプリセットID"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/speakers":{"get":{"tags":["その他"],"summary":"Speakers","description":"喋れるキャラクターの情報の一覧を返します。","operationId":"speakers_speakers_get","parameters":[{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Speaker"},"title":"Response Speakers Speakers Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/speaker_info":{"get":{"tags":["その他"],"summary":"Speaker Info","description":"UUID で指定された喋れるキャラクターの情報を返します。\n画像や音声はresource_formatで指定した形式で返されます。","operationId":"speaker_info_speaker_info_get","parameters":[{"name":"speaker_uuid","in":"query","required":true,"schema":{"type":"string","title":"Speaker Uuid"}},{"name":"resource_format","in":"query","required":false,"schema":{"enum":["base64","url"],"type":"string","default":"base64","title":"Resource Format"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpeakerInfo"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/singers":{"get":{"tags":["その他"],"summary":"Singers","description":"歌えるキャラクターの情報の一覧を返します。","operationId":"singers_singers_get","parameters":[{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Speaker"},"title":"Response Singers Singers Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/singer_info":{"get":{"tags":["その他"],"summary":"Singer Info","description":"UUID で指定された歌えるキャラクターの情報を返します。\n画像や音声はresource_formatで指定した形式で返されます。","operationId":"singer_info_singer_info_get","parameters":[{"name":"speaker_uuid","in":"query","required":true,"schema":{"type":"string","title":"Speaker Uuid"}},{"name":"resource_format","in":"query","required":false,"schema":{"enum":["base64","url"],"type":"string","default":"base64","title":"Resource Format"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpeakerInfo"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/downloadable_libraries":{"get":{"tags":["音声ライブラリ管理"],"summary":"Downloadable Libraries","description":"ダウンロード可能な音声ライブラリの情報を返します。","operationId":"downloadable_libraries_downloadable_libraries_get","responses":{"200":{"description":"ダウンロード可能な音声ライブラリの情報リスト","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/DownloadableLibraryInfo"},"type":"array","title":"Response Downloadable Libraries Downloadable Libraries Get"}}}}}}},"/installed_libraries":{"get":{"tags":["音声ライブラリ管理"],"summary":"Installed Libraries","description":"インストールした音声ライブラリの情報を返します。","operationId":"installed_libraries_installed_libraries_get","responses":{"200":{"description":"インストールした音声ライブラリの情報","content":{"application/json":{"schema":{"additionalProperties":{"$ref":"#/components/schemas/InstalledLibraryInfo"},"type":"object","title":"Response Installed Libraries Installed Libraries Get"}}}}}}},"/install_library/{library_uuid}":{"post":{"tags":["音声ライブラリ管理"],"summary":"Install Library","description":"音声ライブラリをインストールします。\n音声ライブラリのZIPファイルをリクエストボディとして送信してください。","operationId":"install_library_install_library__library_uuid__post","parameters":[{"name":"library_uuid","in":"path","required":true,"schema":{"type":"string","description":"音声ライブラリのID","title":"Library Uuid"},"description":"音声ライブラリのID"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/uninstall_library/{library_uuid}":{"post":{"tags":["音声ライブラリ管理"],"summary":"Uninstall Library","description":"音声ライブラリをアンインストールします。","operationId":"uninstall_library_uninstall_library__library_uuid__post","parameters":[{"name":"library_uuid","in":"path","required":true,"schema":{"type":"string","description":"音声ライブラリのID","title":"Library Uuid"},"description":"音声ライブラリのID"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/user_dict":{"get":{"tags":["ユーザー辞書"],"summary":"Get User Dict Words","description":"ユーザー辞書に登録されている単語の一覧を返します。\n単語の表層形(surface)は正規化済みの物を返します。","operationId":"get_user_dict_words_user_dict_get","responses":{"200":{"description":"単語のUUIDとその詳細","content":{"application/json":{"schema":{"additionalProperties":{"$ref":"#/components/schemas/UserDictWord"},"type":"object","title":"Response Get User Dict Words User Dict Get"}}}}}}},"/user_dict_word":{"post":{"tags":["ユーザー辞書"],"summary":"Add User Dict Word","description":"ユーザー辞書に言葉を追加します。","operationId":"add_user_dict_word_user_dict_word_post","parameters":[{"name":"surface","in":"query","required":true,"schema":{"type":"string","description":"言葉の表層形","title":"Surface"},"description":"言葉の表層形"},{"name":"pronunciation","in":"query","required":true,"schema":{"type":"string","description":"言葉の発音(カタカナ)","title":"Pronunciation"},"description":"言葉の発音(カタカナ)"},{"name":"accent_type","in":"query","required":true,"schema":{"type":"integer","description":"アクセント型(音が下がる場所を指す)","title":"Accent Type"},"description":"アクセント型(音が下がる場所を指す)"},{"name":"word_type","in":"query","required":false,"schema":{"allOf":[{"$ref":"#/components/schemas/WordTypes"}],"description":"PROPER_NOUN(固有名詞)、COMMON_NOUN(普通名詞)、VERB(動詞)、ADJECTIVE(形容詞)、SUFFIX(語尾)のいずれか","title":"Word Type"},"description":"PROPER_NOUN(固有名詞)、COMMON_NOUN(普通名詞)、VERB(動詞)、ADJECTIVE(形容詞)、SUFFIX(語尾)のいずれか"},{"name":"priority","in":"query","required":false,"schema":{"type":"integer","description":"単語の優先度(0から10までの整数)。数字が大きいほど優先度が高くなる。1から9までの値を指定することを推奨","maximum":10,"minimum":0,"title":"Priority"},"description":"単語の優先度(0から10までの整数)。数字が大きいほど優先度が高くなる。1から9までの値を指定することを推奨"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"string","title":"Response Add User Dict Word User Dict Word Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/user_dict_word/{word_uuid}":{"put":{"tags":["ユーザー辞書"],"summary":"Rewrite User Dict Word","description":"ユーザー辞書に登録されている言葉を更新します。","operationId":"rewrite_user_dict_word_user_dict_word__word_uuid__put","parameters":[{"name":"word_uuid","in":"path","required":true,"schema":{"type":"string","description":"更新する言葉のUUID","title":"Word Uuid"},"description":"更新する言葉のUUID"},{"name":"surface","in":"query","required":true,"schema":{"type":"string","description":"言葉の表層形","title":"Surface"},"description":"言葉の表層形"},{"name":"pronunciation","in":"query","required":true,"schema":{"type":"string","description":"言葉の発音(カタカナ)","title":"Pronunciation"},"description":"言葉の発音(カタカナ)"},{"name":"accent_type","in":"query","required":true,"schema":{"type":"integer","description":"アクセント型(音が下がる場所を指す)","title":"Accent Type"},"description":"アクセント型(音が下がる場所を指す)"},{"name":"word_type","in":"query","required":false,"schema":{"allOf":[{"$ref":"#/components/schemas/WordTypes"}],"description":"PROPER_NOUN(固有名詞)、COMMON_NOUN(普通名詞)、VERB(動詞)、ADJECTIVE(形容詞)、SUFFIX(語尾)のいずれか","title":"Word Type"},"description":"PROPER_NOUN(固有名詞)、COMMON_NOUN(普通名詞)、VERB(動詞)、ADJECTIVE(形容詞)、SUFFIX(語尾)のいずれか"},{"name":"priority","in":"query","required":false,"schema":{"type":"integer","description":"単語の優先度(0から10までの整数)。数字が大きいほど優先度が高くなる。1から9までの値を指定することを推奨。","maximum":10,"minimum":0,"title":"Priority"},"description":"単語の優先度(0から10までの整数)。数字が大きいほど優先度が高くなる。1から9までの値を指定することを推奨。"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["ユーザー辞書"],"summary":"Delete User Dict Word","description":"ユーザー辞書に登録されている言葉を削除します。","operationId":"delete_user_dict_word_user_dict_word__word_uuid__delete","parameters":[{"name":"word_uuid","in":"path","required":true,"schema":{"type":"string","description":"削除する言葉のUUID","title":"Word Uuid"},"description":"削除する言葉のUUID"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/import_user_dict":{"post":{"tags":["ユーザー辞書"],"summary":"Import User Dict Words","description":"他のユーザー辞書をインポートします。","operationId":"import_user_dict_words_import_user_dict_post","parameters":[{"name":"override","in":"query","required":true,"schema":{"type":"boolean","description":"重複したエントリがあった場合、上書きするかどうか","title":"Override"},"description":"重複したエントリがあった場合、上書きするかどうか"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/UserDictWord"},"description":"インポートするユーザー辞書のデータ","title":"Import Dict Data"}}}},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/version":{"get":{"tags":["その他"],"summary":"Version","description":"エンジンのバージョンを取得します。","operationId":"version_version_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"string","title":"Response Version Version Get"}}}}}}},"/core_versions":{"get":{"tags":["その他"],"summary":"Core Versions","description":"利用可能なコアのバージョン一覧を取得します。","operationId":"core_versions_core_versions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array","title":"Response Core Versions Core Versions Get"}}}}}}},"/engine_manifest":{"get":{"tags":["その他"],"summary":"Engine Manifest","description":"エンジンマニフェストを取得します。","operationId":"engine_manifest_engine_manifest_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EngineManifest"}}}}}}},"/setting":{"get":{"tags":["設定"],"summary":"Setting Get","description":"設定ページを返します。","operationId":"setting_get_setting_get","responses":{"200":{"description":"Successful Response"}}},"post":{"tags":["設定"],"summary":"Setting Post","description":"設定を更新します。","operationId":"setting_post_setting_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_setting_post_setting_post"}}},"required":true},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/":{"get":{"tags":["その他"],"summary":"Get Portal Page","description":"ポータルページを返します。","operationId":"get_portal_page__get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}}},"components":{"schemas":{"AccentPhrase":{"properties":{"moras":{"items":{"$ref":"#/components/schemas/Mora"},"type":"array","title":"Moras","description":"モーラのリスト"},"accent":{"type":"integer","title":"Accent","description":"アクセント箇所"},"pause_mora":{"allOf":[{"$ref":"#/components/schemas/Mora"}],"title":"Pause Mora","description":"後ろに無音を付けるかどうか"},"is_interrogative":{"type":"boolean","title":"Is Interrogative","description":"疑問系かどうか","default":false}},"type":"object","required":["moras","accent"],"title":"AccentPhrase","description":"アクセント句ごとの情報"},"AudioQuery":{"properties":{"accent_phrases":{"items":{"$ref":"#/components/schemas/AccentPhrase"},"type":"array","title":"Accent Phrases","description":"アクセント句のリスト"},"speedScale":{"type":"number","title":"Speedscale","description":"全体の話速"},"pitchScale":{"type":"number","title":"Pitchscale","description":"全体の音高"},"intonationScale":{"type":"number","title":"Intonationscale","description":"全体の抑揚"},"volumeScale":{"type":"number","title":"Volumescale","description":"全体の音量"},"pauseLengthScale":{"type":"number","title":"Pauselengthscale","description":"句読点などの無音時間(倍率)。デフォルト値は1","default":1},"prePhonemeLength":{"type":"number","title":"Prephonemelength","description":"音声の前の無音時間"},"postPhonemeLength":{"type":"number","title":"Postphonemelength","description":"音声の後の無音時間"},"pauseLength":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Pauselength","description":"句読点などの無音時間。nullのときは無視される。デフォルト値はnull"},"outputSamplingRate":{"type":"integer","title":"Outputsamplingrate","description":"音声データの出力サンプリングレート"},"outputStereo":{"type":"boolean","title":"Outputstereo","description":"音声データをステレオ出力するか否か"},"kana":{"type":"string","title":"Kana","description":"[読み取り専用]AquesTalk 風記法によるテキスト。音声合成用のクエリとしては無視される"}},"type":"object","required":["accent_phrases","speedScale","pitchScale","intonationScale","volumeScale","prePhonemeLength","postPhonemeLength","outputSamplingRate","outputStereo"],"title":"AudioQuery","description":"音声合成用のクエリ"},"Body_setting_post_setting_post":{"properties":{"cors_policy_mode":{"$ref":"#/components/schemas/CorsPolicyMode"},"allow_origin":{"type":"string","title":"Allow Origin"}},"type":"object","required":["cors_policy_mode"],"title":"Body_setting_post_setting_post"},"Body_sing_frame_volume_sing_frame_volume_post":{"properties":{"score":{"$ref":"#/components/schemas/Score"},"frame_audio_query":{"$ref":"#/components/schemas/FrameAudioQuery"}},"type":"object","required":["score","frame_audio_query"],"title":"Body_sing_frame_volume_sing_frame_volume_post"},"CorsPolicyMode":{"type":"string","enum":["all","localapps"],"title":"CorsPolicyMode","description":"CORSの許可モード"},"DownloadableLibraryInfo":{"properties":{"name":{"type":"string","title":"Name","description":"音声ライブラリの名前"},"uuid":{"type":"string","title":"Uuid","description":"音声ライブラリのUUID"},"version":{"type":"string","title":"Version","description":"音声ライブラリのバージョン"},"download_url":{"type":"string","title":"Download Url","description":"音声ライブラリのダウンロードURL"},"bytes":{"type":"integer","title":"Bytes","description":"音声ライブラリのバイト数"},"speakers":{"items":{"$ref":"#/components/schemas/LibrarySpeaker"},"type":"array","title":"Speakers","description":"音声ライブラリに含まれるキャラクターのリスト"}},"type":"object","required":["name","uuid","version","download_url","bytes","speakers"],"title":"DownloadableLibraryInfo","description":"ダウンロード可能な音声ライブラリの情報"},"EngineManifest":{"properties":{"manifest_version":{"type":"string","title":"Manifest Version","description":"マニフェストのバージョン"},"name":{"type":"string","title":"Name","description":"エンジン名"},"brand_name":{"type":"string","title":"Brand Name","description":"ブランド名"},"uuid":{"type":"string","title":"Uuid","description":"エンジンのUUID"},"url":{"type":"string","title":"Url","description":"エンジンのURL"},"icon":{"type":"string","title":"Icon","description":"エンジンのアイコンをBASE64エンコードしたもの"},"default_sampling_rate":{"type":"integer","title":"Default Sampling Rate","description":"デフォルトのサンプリング周波数"},"frame_rate":{"type":"number","title":"Frame Rate","description":"エンジンのフレームレート"},"terms_of_service":{"type":"string","title":"Terms Of Service","description":"エンジンの利用規約"},"update_infos":{"items":{"$ref":"#/components/schemas/UpdateInfo"},"type":"array","title":"Update Infos","description":"エンジンのアップデート情報"},"dependency_licenses":{"items":{"$ref":"#/components/schemas/LicenseInfo"},"type":"array","title":"Dependency Licenses","description":"依存関係のライセンス情報"},"supported_vvlib_manifest_version":{"type":"string","title":"Supported Vvlib Manifest Version","description":"エンジンが対応するvvlibのバージョン"},"supported_features":{"allOf":[{"$ref":"#/components/schemas/SupportedFeatures"}],"description":"エンジンが持つ機能"}},"type":"object","required":["manifest_version","name","brand_name","uuid","url","icon","default_sampling_rate","frame_rate","terms_of_service","update_infos","dependency_licenses","supported_features"],"title":"EngineManifest","description":"エンジン自体に関する情報"},"FrameAudioQuery":{"properties":{"f0":{"items":{"type":"number"},"type":"array","title":"F0","description":"フレームごとの基本周波数"},"volume":{"items":{"type":"number"},"type":"array","title":"Volume","description":"フレームごとの音量"},"phonemes":{"items":{"$ref":"#/components/schemas/FramePhoneme"},"type":"array","title":"Phonemes","description":"音素のリスト"},"volumeScale":{"type":"number","title":"Volumescale","description":"全体の音量"},"outputSamplingRate":{"type":"integer","title":"Outputsamplingrate","description":"音声データの出力サンプリングレート"},"outputStereo":{"type":"boolean","title":"Outputstereo","description":"音声データをステレオ出力するか否か"}},"type":"object","required":["f0","volume","phonemes","volumeScale","outputSamplingRate","outputStereo"],"title":"FrameAudioQuery","description":"フレームごとの音声合成用のクエリ"},"FramePhoneme":{"properties":{"phoneme":{"type":"string","title":"Phoneme","description":"音素"},"frame_length":{"type":"integer","title":"Frame Length","description":"音素のフレーム長"},"note_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note Id","description":"音符のID"}},"type":"object","required":["phoneme","frame_length"],"title":"FramePhoneme","description":"音素の情報"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"InstalledLibraryInfo":{"properties":{"name":{"type":"string","title":"Name","description":"音声ライブラリの名前"},"uuid":{"type":"string","title":"Uuid","description":"音声ライブラリのUUID"},"version":{"type":"string","title":"Version","description":"音声ライブラリのバージョン"},"download_url":{"type":"string","title":"Download Url","description":"音声ライブラリのダウンロードURL"},"bytes":{"type":"integer","title":"Bytes","description":"音声ライブラリのバイト数"},"speakers":{"items":{"$ref":"#/components/schemas/LibrarySpeaker"},"type":"array","title":"Speakers","description":"音声ライブラリに含まれるキャラクターのリスト"},"uninstallable":{"type":"boolean","title":"Uninstallable","description":"アンインストール可能かどうか"}},"type":"object","required":["name","uuid","version","download_url","bytes","speakers","uninstallable"],"title":"InstalledLibraryInfo","description":"インストール済み音声ライブラリの情報"},"LibrarySpeaker":{"properties":{"speaker":{"$ref":"#/components/schemas/Speaker"},"speaker_info":{"$ref":"#/components/schemas/SpeakerInfo"}},"type":"object","required":["speaker","speaker_info"],"title":"LibrarySpeaker","description":"音声ライブラリに含まれるキャラクターの情報"},"LicenseInfo":{"properties":{"name":{"type":"string","title":"Name","description":"依存ライブラリ名"},"version":{"type":"string","title":"Version","description":"依存ライブラリのバージョン"},"license":{"type":"string","title":"License","description":"依存ライブラリのライセンス名"},"text":{"type":"string","title":"Text","description":"依存ライブラリのライセンス本文"}},"type":"object","required":["name","text"],"title":"LicenseInfo","description":"依存ライブラリのライセンス情報"},"Mora":{"properties":{"text":{"type":"string","title":"Text","description":"文字"},"consonant":{"type":"string","title":"Consonant","description":"子音の音素"},"consonant_length":{"type":"number","title":"Consonant Length","description":"子音の音長"},"vowel":{"type":"string","title":"Vowel","description":"母音の音素"},"vowel_length":{"type":"number","title":"Vowel Length","description":"母音の音長"},"pitch":{"type":"number","title":"Pitch","description":"音高"}},"type":"object","required":["text","vowel","vowel_length","pitch"],"title":"Mora","description":"モーラ(子音+母音)ごとの情報"},"MorphableTargetInfo":{"properties":{"is_morphable":{"type":"boolean","title":"Is Morphable","description":"指定したキャラクターに対してモーフィングの可否"}},"type":"object","required":["is_morphable"],"title":"MorphableTargetInfo"},"Note":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id","description":"ID"},"key":{"type":"integer","title":"Key","description":"音階"},"frame_length":{"type":"integer","title":"Frame Length","description":"音符のフレーム長"},"lyric":{"type":"string","title":"Lyric","description":"音符の歌詞"}},"type":"object","required":["frame_length","lyric"],"title":"Note","description":"音符ごとの情報"},"ParseKanaBadRequest":{"properties":{"text":{"type":"string","title":"Text","description":"エラーメッセージ"},"error_name":{"type":"string","title":"Error Name","description":"エラー名\n\n|name|description|\n|---|---|\n| UNKNOWN_TEXT | 判別できない読み仮名があります: {text} |\n| ACCENT_TOP | 句頭にアクセントは置けません: {text} |\n| ACCENT_TWICE | 1つのアクセント句に二つ以上のアクセントは置けません: {text} |\n| ACCENT_NOTFOUND | アクセントを指定していないアクセント句があります: {text} |\n| EMPTY_PHRASE | {position}番目のアクセント句が空白です |\n| INTERROGATION_MARK_NOT_AT_END | アクセント句末以外に「?」は置けません: {text} |\n| INFINITE_LOOP | 処理時に無限ループになってしまいました...バグ報告をお願いします。 |"},"error_args":{"additionalProperties":{"type":"string"},"type":"object","title":"Error Args","description":"エラーを起こした箇所"}},"type":"object","required":["text","error_name","error_args"],"title":"ParseKanaBadRequest"},"Preset":{"properties":{"id":{"type":"integer","title":"Id","description":"プリセットID"},"name":{"type":"string","title":"Name","description":"プリセット名"},"speaker_uuid":{"type":"string","title":"Speaker Uuid","description":"キャラクターのUUID"},"style_id":{"type":"integer","title":"Style Id","description":"スタイルID"},"speedScale":{"type":"number","title":"Speedscale","description":"全体の話速"},"pitchScale":{"type":"number","title":"Pitchscale","description":"全体の音高"},"intonationScale":{"type":"number","title":"Intonationscale","description":"全体の抑揚"},"volumeScale":{"type":"number","title":"Volumescale","description":"全体の音量"},"pauseLengthScale":{"type":"number","title":"Pauselengthscale","description":"句読点などの無音時間(倍率)","default":1},"prePhonemeLength":{"type":"number","title":"Prephonemelength","description":"音声の前の無音時間"},"postPhonemeLength":{"type":"number","title":"Postphonemelength","description":"音声の後の無音時間"},"pauseLength":{"type":"number","title":"Pauselength","description":"句読点などの無音時間"}},"type":"object","required":["id","name","speaker_uuid","style_id","speedScale","pitchScale","intonationScale","volumeScale","prePhonemeLength","postPhonemeLength"],"title":"Preset","description":"プリセット情報"},"Score":{"properties":{"notes":{"items":{"$ref":"#/components/schemas/Note"},"type":"array","title":"Notes","description":"音符のリスト"}},"type":"object","required":["notes"],"title":"Score","description":"楽譜情報"},"Speaker":{"properties":{"name":{"type":"string","title":"Name","description":"名前"},"speaker_uuid":{"type":"string","title":"Speaker Uuid","description":"キャラクターのUUID"},"styles":{"items":{"$ref":"#/components/schemas/SpeakerStyle"},"type":"array","title":"Styles","description":"スタイルの一覧"},"version":{"type":"string","title":"Version","description":"キャラクターのバージョン"},"supported_features":{"allOf":[{"$ref":"#/components/schemas/SpeakerSupportedFeatures"}],"description":"キャラクターの対応機能"}},"type":"object","required":["name","speaker_uuid","styles","version"],"title":"Speaker","description":"キャラクター情報"},"SpeakerInfo":{"properties":{"policy":{"type":"string","title":"Policy","description":"policy.md"},"portrait":{"type":"string","title":"Portrait","description":"立ち絵画像をbase64エンコードしたもの、あるいはURL"},"style_infos":{"items":{"$ref":"#/components/schemas/StyleInfo"},"type":"array","title":"Style Infos","description":"スタイルの追加情報"}},"type":"object","required":["policy","portrait","style_infos"],"title":"SpeakerInfo","description":"キャラクターの追加情報"},"SpeakerStyle":{"properties":{"name":{"type":"string","title":"Name","description":"スタイル名"},"id":{"type":"integer","title":"Id","description":"スタイルID"},"type":{"type":"string","enum":["talk","singing_teacher","frame_decode","sing"],"title":"Type","description":"スタイルの種類。talk:音声合成クエリの作成と音声合成が可能。singing_teacher:歌唱音声合成用のクエリの作成が可能。frame_decode:歌唱音声合成が可能。sing:歌唱音声合成用のクエリの作成と歌唱音声合成が可能。","default":"talk"}},"type":"object","required":["name","id"],"title":"SpeakerStyle","description":"キャラクターのスタイル情報"},"SpeakerSupportedFeatures":{"properties":{"permitted_synthesis_morphing":{"type":"string","enum":["ALL","SELF_ONLY","NOTHING"],"title":"Permitted Synthesis Morphing","description":"モーフィング機能への対応。'ALL' は「全て許可」、'SELF_ONLY' は「同じキャラクター内でのみ許可」、'NOTHING' は「全て禁止」","default":"ALL"}},"type":"object","title":"SpeakerSupportedFeatures","description":"キャラクターの対応機能の情報"},"StyleInfo":{"properties":{"id":{"type":"integer","title":"Id","description":"スタイルID"},"icon":{"type":"string","title":"Icon","description":"このスタイルのアイコンをbase64エンコードしたもの、あるいはURL"},"portrait":{"type":"string","title":"Portrait","description":"このスタイルの立ち絵画像をbase64エンコードしたもの、あるいはURL"},"voice_samples":{"items":{"type":"string"},"type":"array","title":"Voice Samples","description":"サンプル音声をbase64エンコードしたもの、あるいはURL"}},"type":"object","required":["id","icon","voice_samples"],"title":"StyleInfo","description":"スタイルの追加情報"},"SupportedDevicesInfo":{"properties":{"cpu":{"type":"boolean","title":"Cpu","description":"CPUに対応しているか"},"cuda":{"type":"boolean","title":"Cuda","description":"CUDA(Nvidia GPU)に対応しているか"},"dml":{"type":"boolean","title":"Dml","description":"DirectML(Nvidia GPU/Radeon GPU等)に対応しているか"}},"type":"object","required":["cpu","cuda","dml"],"title":"SupportedDevicesInfo","description":"対応しているデバイスの情報"},"SupportedFeatures":{"properties":{"adjust_mora_pitch":{"type":"boolean","title":"Adjust Mora Pitch","description":"モーラごとの音高の調整"},"adjust_phoneme_length":{"type":"boolean","title":"Adjust Phoneme Length","description":"音素ごとの長さの調整"},"adjust_speed_scale":{"type":"boolean","title":"Adjust Speed Scale","description":"全体の話速の調整"},"adjust_pitch_scale":{"type":"boolean","title":"Adjust Pitch Scale","description":"全体の音高の調整"},"adjust_intonation_scale":{"type":"boolean","title":"Adjust Intonation Scale","description":"全体の抑揚の調整"},"adjust_volume_scale":{"type":"boolean","title":"Adjust Volume Scale","description":"全体の音量の調整"},"adjust_pause_length":{"type":"boolean","title":"Adjust Pause Length","description":"句読点などの無音時間の調整"},"interrogative_upspeak":{"type":"boolean","title":"Interrogative Upspeak","description":"疑問文の自動調整"},"synthesis_morphing":{"type":"boolean","title":"Synthesis Morphing","description":"2種類のスタイルでモーフィングした音声を合成"},"sing":{"type":"boolean","title":"Sing","description":"歌唱音声合成"},"manage_library":{"type":"boolean","title":"Manage Library","description":"音声ライブラリのインストール・アンインストール"},"return_resource_url":{"type":"boolean","title":"Return Resource Url","description":"キャラクター情報のリソースをURLで返送"}},"type":"object","required":["adjust_mora_pitch","adjust_phoneme_length","adjust_speed_scale","adjust_pitch_scale","adjust_intonation_scale","adjust_volume_scale","interrogative_upspeak","synthesis_morphing"],"title":"SupportedFeatures","description":"エンジンが持つ機能の一覧"},"UpdateInfo":{"properties":{"version":{"type":"string","title":"Version","description":"エンジンのバージョン名"},"descriptions":{"items":{"type":"string"},"type":"array","title":"Descriptions","description":"アップデートの詳細についての説明"},"contributors":{"items":{"type":"string"},"type":"array","title":"Contributors","description":"貢献者名"}},"type":"object","required":["version","descriptions"],"title":"UpdateInfo","description":"エンジンのアップデート情報"},"UserDictWord":{"properties":{"surface":{"type":"string","title":"Surface","description":"表層形"},"priority":{"type":"integer","maximum":10,"minimum":0,"title":"Priority","description":"優先度"},"context_id":{"type":"integer","title":"Context Id","description":"文脈ID","default":1348},"part_of_speech":{"type":"string","title":"Part Of Speech","description":"品詞"},"part_of_speech_detail_1":{"type":"string","title":"Part Of Speech Detail 1","description":"品詞細分類1"},"part_of_speech_detail_2":{"type":"string","title":"Part Of Speech Detail 2","description":"品詞細分類2"},"part_of_speech_detail_3":{"type":"string","title":"Part Of Speech Detail 3","description":"品詞細分類3"},"inflectional_type":{"type":"string","title":"Inflectional Type","description":"活用型"},"inflectional_form":{"type":"string","title":"Inflectional Form","description":"活用形"},"stem":{"type":"string","title":"Stem","description":"原形"},"yomi":{"type":"string","title":"Yomi","description":"読み"},"pronunciation":{"type":"string","title":"Pronunciation","description":"発音"},"accent_type":{"type":"integer","title":"Accent Type","description":"アクセント型"},"mora_count":{"type":"integer","title":"Mora Count","description":"モーラ数"},"accent_associative_rule":{"type":"string","title":"Accent Associative Rule","description":"アクセント結合規則"}},"type":"object","required":["surface","priority","part_of_speech","part_of_speech_detail_1","part_of_speech_detail_2","part_of_speech_detail_3","inflectional_type","inflectional_form","stem","yomi","pronunciation","accent_type","accent_associative_rule"],"title":"UserDictWord","description":"辞書のコンパイルに使われる情報"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WordTypes":{"type":"string","enum":["PROPER_NOUN","COMMON_NOUN","VERB","ADJECTIVE","SUFFIX"],"title":"WordTypes","description":"品詞"},"BaseLibraryInfo":{"description":"音声ライブラリの情報","properties":{"name":{"description":"音声ライブラリの名前","title":"Name","type":"string"},"uuid":{"description":"音声ライブラリのUUID","title":"Uuid","type":"string"},"version":{"description":"音声ライブラリのバージョン","title":"Version","type":"string"},"download_url":{"description":"音声ライブラリのダウンロードURL","title":"Download Url","type":"string"},"bytes":{"description":"音声ライブラリのバイト数","title":"Bytes","type":"integer"},"speakers":{"description":"音声ライブラリに含まれるキャラクターのリスト","items":{"$ref":"#/components/schemas/LibrarySpeaker"},"title":"Speakers","type":"array"}},"required":["name","uuid","version","download_url","bytes","speakers"],"title":"BaseLibraryInfo","type":"object"},"VvlibManifest":{"description":"vvlib(VOICEVOX Library)に関する情報","properties":{"manifest_version":{"description":"マニフェストバージョン","title":"Manifest Version","type":"string"},"name":{"description":"音声ライブラリ名","title":"Name","type":"string"},"version":{"description":"音声ライブラリバージョン","title":"Version","type":"string"},"uuid":{"description":"音声ライブラリのUUID","title":"Uuid","type":"string"},"brand_name":{"description":"エンジンのブランド名","title":"Brand Name","type":"string"},"engine_name":{"description":"エンジン名","title":"Engine Name","type":"string"},"engine_uuid":{"description":"エンジンのUUID","title":"Engine Uuid","type":"string"}},"required":["manifest_version","name","version","uuid","brand_name","engine_name","engine_uuid"],"title":"VvlibManifest","type":"object"}}}} \ No newline at end of file +{"openapi":"3.1.0","info":{"title":"VOICEVOX Engine","description":"VOICEVOX の音声合成エンジンです。","version":"latest"},"paths":{"/audio_query":{"post":{"tags":["クエリ作成"],"summary":"音声合成用のクエリを作成する","description":"音声合成用のクエリの初期値を得ます。ここで得られたクエリはそのまま音声合成に利用できます。各値の意味は`Schemas`を参照してください。","operationId":"audio_query_audio_query_post","parameters":[{"name":"text","in":"query","required":true,"schema":{"type":"string","title":"Text"}},{"name":"speaker","in":"query","required":true,"schema":{"type":"integer","title":"Speaker"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudioQuery"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/audio_query_from_preset":{"post":{"tags":["クエリ作成"],"summary":"音声合成用のクエリをプリセットを用いて作成する","description":"音声合成用のクエリの初期値を得ます。ここで得られたクエリはそのまま音声合成に利用できます。各値の意味は`Schemas`を参照してください。","operationId":"audio_query_from_preset_audio_query_from_preset_post","parameters":[{"name":"text","in":"query","required":true,"schema":{"type":"string","title":"Text"}},{"name":"preset_id","in":"query","required":true,"schema":{"type":"integer","title":"Preset Id"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudioQuery"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/accent_phrases":{"post":{"tags":["クエリ編集"],"summary":"テキストからアクセント句を得る","description":"テキストからアクセント句を得ます。\nis_kanaが`true`のとき、テキストは次のAquesTalk 風記法で解釈されます。デフォルトは`false`です。\n* 全てのカナはカタカナで記述される\n* アクセント句は`/`または`、`で区切る。`、`で区切った場合に限り無音区間が挿入される。\n* カナの手前に`_`を入れるとそのカナは無声化される\n* アクセント位置を`'`で指定する。全てのアクセント句にはアクセント位置を1つ指定する必要がある。\n* アクセント句末に`?`(全角)を入れることにより疑問文の発音ができる。","operationId":"accent_phrases_accent_phrases_post","parameters":[{"name":"text","in":"query","required":true,"schema":{"type":"string","title":"Text"}},{"name":"speaker","in":"query","required":true,"schema":{"type":"integer","title":"Speaker"}},{"name":"is_kana","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Is Kana"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AccentPhrase"},"title":"Response Accent Phrases Accent Phrases Post"}}}},"400":{"description":"読み仮名のパースに失敗","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParseKanaBadRequest"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mora_data":{"post":{"tags":["クエリ編集"],"summary":"アクセント句から音高・音素長を得る","operationId":"mora_data_mora_data_post","parameters":[{"name":"speaker","in":"query","required":true,"schema":{"type":"integer","title":"Speaker"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AccentPhrase"},"title":"Accent Phrases"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AccentPhrase"},"title":"Response Mora Data Mora Data Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mora_length":{"post":{"tags":["クエリ編集"],"summary":"アクセント句から音素長を得る","operationId":"mora_length_mora_length_post","parameters":[{"name":"speaker","in":"query","required":true,"schema":{"type":"integer","title":"Speaker"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AccentPhrase"},"title":"Accent Phrases"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AccentPhrase"},"title":"Response Mora Length Mora Length Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mora_pitch":{"post":{"tags":["クエリ編集"],"summary":"アクセント句から音高を得る","operationId":"mora_pitch_mora_pitch_post","parameters":[{"name":"speaker","in":"query","required":true,"schema":{"type":"integer","title":"Speaker"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AccentPhrase"},"title":"Accent Phrases"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AccentPhrase"},"title":"Response Mora Pitch Mora Pitch Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/synthesis":{"post":{"tags":["音声合成"],"summary":"音声合成する","operationId":"synthesis_synthesis_post","parameters":[{"name":"speaker","in":"query","required":true,"schema":{"type":"integer","title":"Speaker"}},{"name":"enable_interrogative_upspeak","in":"query","required":false,"schema":{"type":"boolean","description":"疑問系のテキストが与えられたら語尾を自動調整する","default":true,"title":"Enable Interrogative Upspeak"},"description":"疑問系のテキストが与えられたら語尾を自動調整する"},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudioQuery"}}}},"responses":{"200":{"description":"Successful Response","content":{"audio/wav":{"schema":{"type":"string","format":"binary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/cancellable_synthesis":{"post":{"tags":["音声合成"],"summary":"音声合成する(キャンセル可能)","operationId":"cancellable_synthesis_cancellable_synthesis_post","parameters":[{"name":"speaker","in":"query","required":true,"schema":{"type":"integer","title":"Speaker"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudioQuery"}}}},"responses":{"200":{"description":"Successful Response","content":{"audio/wav":{"schema":{"type":"string","format":"binary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/multi_synthesis":{"post":{"tags":["音声合成"],"summary":"複数まとめて音声合成する","operationId":"multi_synthesis_multi_synthesis_post","parameters":[{"name":"speaker","in":"query","required":true,"schema":{"type":"integer","title":"Speaker"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AudioQuery"},"title":"Queries"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/zip":{"schema":{"type":"string","format":"binary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sing_frame_audio_query":{"post":{"tags":["クエリ作成"],"summary":"歌唱音声合成用のクエリを作成する","description":"歌唱音声合成用のクエリの初期値を得ます。ここで得られたクエリはそのまま歌唱音声合成に利用できます。各値の意味は`Schemas`を参照してください。","operationId":"sing_frame_audio_query_sing_frame_audio_query_post","parameters":[{"name":"speaker","in":"query","required":true,"schema":{"type":"integer","title":"Speaker"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Score"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FrameAudioQuery"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sing_frame_volume":{"post":{"tags":["クエリ編集"],"summary":"スコア・歌唱音声合成用のクエリからフレームごとの音量を得る","operationId":"sing_frame_volume_sing_frame_volume_post","parameters":[{"name":"speaker","in":"query","required":true,"schema":{"type":"integer","title":"Speaker"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_sing_frame_volume_sing_frame_volume_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"number"},"title":"Response Sing Frame Volume Sing Frame Volume Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/frame_synthesis":{"post":{"tags":["音声合成"],"summary":"Frame Synthesis","description":"歌唱音声合成を行います。","operationId":"frame_synthesis_frame_synthesis_post","parameters":[{"name":"speaker","in":"query","required":true,"schema":{"type":"integer","title":"Speaker"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FrameAudioQuery"}}}},"responses":{"200":{"description":"Successful Response","content":{"audio/wav":{"schema":{"type":"string","format":"binary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/connect_waves":{"post":{"tags":["その他"],"summary":"base64エンコードされた複数のwavデータを一つに結合する","description":"base64エンコードされたwavデータを一纏めにし、wavファイルで返します。","operationId":"connect_waves_connect_waves_post","requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array","title":"Waves"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"audio/wav":{"schema":{"type":"string","format":"binary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/validate_kana":{"post":{"tags":["その他"],"summary":"テキストがAquesTalk 風記法に従っているか判定する","description":"テキストがAquesTalk 風記法に従っているかどうかを判定します。\n従っていない場合はエラーが返ります。","operationId":"validate_kana_validate_kana_post","parameters":[{"name":"text","in":"query","required":true,"schema":{"type":"string","description":"判定する対象の文字列","title":"Text"},"description":"判定する対象の文字列"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"boolean","title":"Response Validate Kana Validate Kana Post"}}}},"400":{"description":"テキストが不正です","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParseKanaBadRequest"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/initialize_speaker":{"post":{"tags":["その他"],"summary":"Initialize Speaker","description":"指定されたスタイルを初期化します。\n実行しなくても他のAPIは使用できますが、初回実行時に時間がかかることがあります。","operationId":"initialize_speaker_initialize_speaker_post","parameters":[{"name":"speaker","in":"query","required":true,"schema":{"type":"integer","title":"Speaker"}},{"name":"skip_reinit","in":"query","required":false,"schema":{"type":"boolean","description":"既に初期化済みのスタイルの再初期化をスキップするかどうか","default":false,"title":"Skip Reinit"},"description":"既に初期化済みのスタイルの再初期化をスキップするかどうか"},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/is_initialized_speaker":{"get":{"tags":["その他"],"summary":"Is Initialized Speaker","description":"指定されたスタイルが初期化されているかどうかを返します。","operationId":"is_initialized_speaker_is_initialized_speaker_get","parameters":[{"name":"speaker","in":"query","required":true,"schema":{"type":"integer","title":"Speaker"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"boolean","title":"Response Is Initialized Speaker Is Initialized Speaker Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/supported_devices":{"get":{"tags":["その他"],"summary":"Supported Devices","description":"対応デバイスの一覧を取得します。","operationId":"supported_devices_supported_devices_get","parameters":[{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SupportedDevicesInfo"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/morphable_targets":{"post":{"tags":["音声合成"],"summary":"指定したスタイルに対してエンジン内のキャラクターがモーフィングが可能か判定する","description":"指定されたベーススタイルに対してエンジン内の各キャラクターがモーフィング機能を利用可能か返します。\nモーフィングの許可/禁止は`/speakers`の`speaker.supported_features.synthesis_morphing`に記載されています。\nプロパティが存在しない場合は、モーフィングが許可されているとみなします。\n返り値のスタイルIDはstring型なので注意。","operationId":"morphable_targets_morphable_targets_post","parameters":[{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"type":"integer"},"title":"Base Style Ids"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/MorphableTargetInfo"}},"title":"Response Morphable Targets Morphable Targets Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/synthesis_morphing":{"post":{"tags":["音声合成"],"summary":"2種類のスタイルでモーフィングした音声を合成する","description":"指定された2種類のスタイルで音声を合成、指定した割合でモーフィングした音声を得ます。\nモーフィングの割合は`morph_rate`で指定でき、0.0でベースのスタイル、1.0でターゲットのスタイルに近づきます。","operationId":"_synthesis_morphing_synthesis_morphing_post","parameters":[{"name":"base_speaker","in":"query","required":true,"schema":{"type":"integer","title":"Base Speaker"}},{"name":"target_speaker","in":"query","required":true,"schema":{"type":"integer","title":"Target Speaker"}},{"name":"morph_rate","in":"query","required":true,"schema":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Morph Rate"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudioQuery"}}}},"responses":{"200":{"description":"Successful Response","content":{"audio/wav":{"schema":{"type":"string","format":"binary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/presets":{"get":{"tags":["その他"],"summary":"Get Presets","description":"エンジンが保持しているプリセットの設定を返します","operationId":"get_presets_presets_get","responses":{"200":{"description":"プリセットのリスト","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/Preset"},"type":"array","title":"Response Get Presets Presets Get"}}}}}}},"/add_preset":{"post":{"tags":["その他"],"summary":"Add Preset","description":"新しいプリセットを追加します","operationId":"add_preset_add_preset_post","requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Preset"}],"title":"Preset","description":"新しいプリセット。プリセットIDが既存のものと重複している場合は、新規のプリセットIDが採番されます。"}}},"required":true},"responses":{"200":{"description":"追加したプリセットのプリセットID","content":{"application/json":{"schema":{"type":"integer","title":"Response Add Preset Add Preset Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/update_preset":{"post":{"tags":["その他"],"summary":"Update Preset","description":"既存のプリセットを更新します","operationId":"update_preset_update_preset_post","requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Preset"}],"title":"Preset","description":"更新するプリセット。プリセットIDが更新対象と一致している必要があります。"}}},"required":true},"responses":{"200":{"description":"更新したプリセットのプリセットID","content":{"application/json":{"schema":{"type":"integer","title":"Response Update Preset Update Preset Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/delete_preset":{"post":{"tags":["その他"],"summary":"Delete Preset","description":"既存のプリセットを削除します","operationId":"delete_preset_delete_preset_post","parameters":[{"name":"id","in":"query","required":true,"schema":{"type":"integer","description":"削除するプリセットのプリセットID","title":"Id"},"description":"削除するプリセットのプリセットID"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/speakers":{"get":{"tags":["その他"],"summary":"Speakers","description":"喋れるキャラクターの情報の一覧を返します。","operationId":"speakers_speakers_get","parameters":[{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Speaker"},"title":"Response Speakers Speakers Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/speaker_info":{"get":{"tags":["その他"],"summary":"Speaker Info","description":"UUID で指定された喋れるキャラクターの情報を返します。\n画像や音声はresource_formatで指定した形式で返されます。","operationId":"speaker_info_speaker_info_get","parameters":[{"name":"speaker_uuid","in":"query","required":true,"schema":{"type":"string","title":"Speaker Uuid"}},{"name":"resource_format","in":"query","required":false,"schema":{"enum":["base64","url"],"type":"string","default":"base64","title":"Resource Format"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpeakerInfo"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/singers":{"get":{"tags":["その他"],"summary":"Singers","description":"歌えるキャラクターの情報の一覧を返します。","operationId":"singers_singers_get","parameters":[{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Speaker"},"title":"Response Singers Singers Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/singer_info":{"get":{"tags":["その他"],"summary":"Singer Info","description":"UUID で指定された歌えるキャラクターの情報を返します。\n画像や音声はresource_formatで指定した形式で返されます。","operationId":"singer_info_singer_info_get","parameters":[{"name":"speaker_uuid","in":"query","required":true,"schema":{"type":"string","title":"Speaker Uuid"}},{"name":"resource_format","in":"query","required":false,"schema":{"enum":["base64","url"],"type":"string","default":"base64","title":"Resource Format"}},{"name":"core_version","in":"query","required":false,"schema":{"type":"string","title":"Core Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpeakerInfo"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/downloadable_libraries":{"get":{"tags":["音声ライブラリ管理"],"summary":"Downloadable Libraries","description":"ダウンロード可能な音声ライブラリの情報を返します。","operationId":"downloadable_libraries_downloadable_libraries_get","responses":{"200":{"description":"ダウンロード可能な音声ライブラリの情報リスト","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/DownloadableLibraryInfo"},"type":"array","title":"Response Downloadable Libraries Downloadable Libraries Get"}}}}}}},"/installed_libraries":{"get":{"tags":["音声ライブラリ管理"],"summary":"Installed Libraries","description":"インストールした音声ライブラリの情報を返します。","operationId":"installed_libraries_installed_libraries_get","responses":{"200":{"description":"インストールした音声ライブラリの情報","content":{"application/json":{"schema":{"additionalProperties":{"$ref":"#/components/schemas/InstalledLibraryInfo"},"type":"object","title":"Response Installed Libraries Installed Libraries Get"}}}}}}},"/install_library/{library_uuid}":{"post":{"tags":["音声ライブラリ管理"],"summary":"Install Library","description":"音声ライブラリをインストールします。\n音声ライブラリのZIPファイルをリクエストボディとして送信してください。","operationId":"install_library_install_library__library_uuid__post","parameters":[{"name":"library_uuid","in":"path","required":true,"schema":{"type":"string","description":"音声ライブラリのID","title":"Library Uuid"},"description":"音声ライブラリのID"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/uninstall_library/{library_uuid}":{"post":{"tags":["音声ライブラリ管理"],"summary":"Uninstall Library","description":"音声ライブラリをアンインストールします。","operationId":"uninstall_library_uninstall_library__library_uuid__post","parameters":[{"name":"library_uuid","in":"path","required":true,"schema":{"type":"string","description":"音声ライブラリのID","title":"Library Uuid"},"description":"音声ライブラリのID"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/user_dict":{"get":{"tags":["ユーザー辞書"],"summary":"Get User Dict Words","description":"ユーザー辞書に登録されている単語の一覧を返します。\n単語の表層形(surface)は正規化済みの物を返します。","operationId":"get_user_dict_words_user_dict_get","responses":{"200":{"description":"単語のUUIDとその詳細","content":{"application/json":{"schema":{"additionalProperties":{"$ref":"#/components/schemas/UserDictWord"},"type":"object","title":"Response Get User Dict Words User Dict Get"}}}}}}},"/user_dict_word":{"post":{"tags":["ユーザー辞書"],"summary":"Add User Dict Word","description":"ユーザー辞書に言葉を追加します。","operationId":"add_user_dict_word_user_dict_word_post","parameters":[{"name":"surface","in":"query","required":true,"schema":{"type":"string","description":"言葉の表層形","title":"Surface"},"description":"言葉の表層形"},{"name":"pronunciation","in":"query","required":true,"schema":{"type":"string","description":"言葉の発音(カタカナ)","title":"Pronunciation"},"description":"言葉の発音(カタカナ)"},{"name":"accent_type","in":"query","required":true,"schema":{"type":"integer","description":"アクセント型(音が下がる場所を指す)","title":"Accent Type"},"description":"アクセント型(音が下がる場所を指す)"},{"name":"word_type","in":"query","required":false,"schema":{"allOf":[{"$ref":"#/components/schemas/WordTypes"}],"description":"PROPER_NOUN(固有名詞)、COMMON_NOUN(普通名詞)、VERB(動詞)、ADJECTIVE(形容詞)、SUFFIX(語尾)のいずれか","title":"Word Type"},"description":"PROPER_NOUN(固有名詞)、COMMON_NOUN(普通名詞)、VERB(動詞)、ADJECTIVE(形容詞)、SUFFIX(語尾)のいずれか"},{"name":"priority","in":"query","required":false,"schema":{"type":"integer","description":"単語の優先度(0から10までの整数)。数字が大きいほど優先度が高くなる。1から9までの値を指定することを推奨","maximum":10,"minimum":0,"title":"Priority"},"description":"単語の優先度(0から10までの整数)。数字が大きいほど優先度が高くなる。1から9までの値を指定することを推奨"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"string","title":"Response Add User Dict Word User Dict Word Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/user_dict_word/{word_uuid}":{"put":{"tags":["ユーザー辞書"],"summary":"Rewrite User Dict Word","description":"ユーザー辞書に登録されている言葉を更新します。","operationId":"rewrite_user_dict_word_user_dict_word__word_uuid__put","parameters":[{"name":"word_uuid","in":"path","required":true,"schema":{"type":"string","description":"更新する言葉のUUID","title":"Word Uuid"},"description":"更新する言葉のUUID"},{"name":"surface","in":"query","required":true,"schema":{"type":"string","description":"言葉の表層形","title":"Surface"},"description":"言葉の表層形"},{"name":"pronunciation","in":"query","required":true,"schema":{"type":"string","description":"言葉の発音(カタカナ)","title":"Pronunciation"},"description":"言葉の発音(カタカナ)"},{"name":"accent_type","in":"query","required":true,"schema":{"type":"integer","description":"アクセント型(音が下がる場所を指す)","title":"Accent Type"},"description":"アクセント型(音が下がる場所を指す)"},{"name":"word_type","in":"query","required":false,"schema":{"allOf":[{"$ref":"#/components/schemas/WordTypes"}],"description":"PROPER_NOUN(固有名詞)、COMMON_NOUN(普通名詞)、VERB(動詞)、ADJECTIVE(形容詞)、SUFFIX(語尾)のいずれか","title":"Word Type"},"description":"PROPER_NOUN(固有名詞)、COMMON_NOUN(普通名詞)、VERB(動詞)、ADJECTIVE(形容詞)、SUFFIX(語尾)のいずれか"},{"name":"priority","in":"query","required":false,"schema":{"type":"integer","description":"単語の優先度(0から10までの整数)。数字が大きいほど優先度が高くなる。1から9までの値を指定することを推奨。","maximum":10,"minimum":0,"title":"Priority"},"description":"単語の優先度(0から10までの整数)。数字が大きいほど優先度が高くなる。1から9までの値を指定することを推奨。"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["ユーザー辞書"],"summary":"Delete User Dict Word","description":"ユーザー辞書に登録されている言葉を削除します。","operationId":"delete_user_dict_word_user_dict_word__word_uuid__delete","parameters":[{"name":"word_uuid","in":"path","required":true,"schema":{"type":"string","description":"削除する言葉のUUID","title":"Word Uuid"},"description":"削除する言葉のUUID"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/import_user_dict":{"post":{"tags":["ユーザー辞書"],"summary":"Import User Dict Words","description":"他のユーザー辞書をインポートします。","operationId":"import_user_dict_words_import_user_dict_post","parameters":[{"name":"override","in":"query","required":true,"schema":{"type":"boolean","description":"重複したエントリがあった場合、上書きするかどうか","title":"Override"},"description":"重複したエントリがあった場合、上書きするかどうか"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/UserDictWord"},"description":"インポートするユーザー辞書のデータ","title":"Import Dict Data"}}}},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/version":{"get":{"tags":["その他"],"summary":"Version","description":"エンジンのバージョンを取得します。","operationId":"version_version_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"string","title":"Response Version Version Get"}}}}}}},"/core_versions":{"get":{"tags":["その他"],"summary":"Core Versions","description":"利用可能なコアのバージョン一覧を取得します。","operationId":"core_versions_core_versions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array","title":"Response Core Versions Core Versions Get"}}}}}}},"/engine_manifest":{"get":{"tags":["その他"],"summary":"Engine Manifest","description":"エンジンマニフェストを取得します。","operationId":"engine_manifest_engine_manifest_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EngineManifest"}}}}}}},"/setting":{"get":{"tags":["設定"],"summary":"Setting Get","description":"設定ページを返します。","operationId":"setting_get_setting_get","responses":{"200":{"description":"Successful Response"}}},"post":{"tags":["設定"],"summary":"Setting Post","description":"設定を更新します。","operationId":"setting_post_setting_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_setting_post_setting_post"}}},"required":true},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/":{"get":{"tags":["その他"],"summary":"Get Portal Page","description":"ポータルページを返します。","operationId":"get_portal_page__get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}}},"components":{"schemas":{"AccentPhrase":{"properties":{"moras":{"items":{"$ref":"#/components/schemas/Mora"},"type":"array","title":"Moras","description":"モーラのリスト"},"accent":{"type":"integer","title":"Accent","description":"アクセント箇所"},"pause_mora":{"allOf":[{"$ref":"#/components/schemas/Mora"}],"title":"Pause Mora","description":"後ろに無音を付けるかどうか"},"is_interrogative":{"type":"boolean","title":"Is Interrogative","description":"疑問系かどうか","default":false}},"type":"object","required":["moras","accent"],"title":"AccentPhrase","description":"アクセント句ごとの情報"},"AudioQuery":{"properties":{"accent_phrases":{"items":{"$ref":"#/components/schemas/AccentPhrase"},"type":"array","title":"Accent Phrases","description":"アクセント句のリスト"},"speedScale":{"type":"number","title":"Speedscale","description":"全体の話速"},"pitchScale":{"type":"number","title":"Pitchscale","description":"全体の音高"},"intonationScale":{"type":"number","title":"Intonationscale","description":"全体の抑揚"},"volumeScale":{"type":"number","title":"Volumescale","description":"全体の音量"},"prePhonemeLength":{"type":"number","title":"Prephonemelength","description":"音声の前の無音時間"},"postPhonemeLength":{"type":"number","title":"Postphonemelength","description":"音声の後の無音時間"},"pauseLength":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Pauselength","description":"句読点などの無音時間。nullのときは無視される。デフォルト値はnull"},"pauseLengthScale":{"type":"number","title":"Pauselengthscale","description":"句読点などの無音時間(倍率)。デフォルト値は1","default":1},"outputSamplingRate":{"type":"integer","title":"Outputsamplingrate","description":"音声データの出力サンプリングレート"},"outputStereo":{"type":"boolean","title":"Outputstereo","description":"音声データをステレオ出力するか否か"},"kana":{"type":"string","title":"Kana","description":"[読み取り専用]AquesTalk 風記法によるテキスト。音声合成用のクエリとしては無視される"}},"type":"object","required":["accent_phrases","speedScale","pitchScale","intonationScale","volumeScale","prePhonemeLength","postPhonemeLength","outputSamplingRate","outputStereo"],"title":"AudioQuery","description":"音声合成用のクエリ"},"Body_setting_post_setting_post":{"properties":{"cors_policy_mode":{"$ref":"#/components/schemas/CorsPolicyMode"},"allow_origin":{"type":"string","title":"Allow Origin"}},"type":"object","required":["cors_policy_mode"],"title":"Body_setting_post_setting_post"},"Body_sing_frame_volume_sing_frame_volume_post":{"properties":{"score":{"$ref":"#/components/schemas/Score"},"frame_audio_query":{"$ref":"#/components/schemas/FrameAudioQuery"}},"type":"object","required":["score","frame_audio_query"],"title":"Body_sing_frame_volume_sing_frame_volume_post"},"CorsPolicyMode":{"type":"string","enum":["all","localapps"],"title":"CorsPolicyMode","description":"CORSの許可モード"},"DownloadableLibraryInfo":{"properties":{"name":{"type":"string","title":"Name","description":"音声ライブラリの名前"},"uuid":{"type":"string","title":"Uuid","description":"音声ライブラリのUUID"},"version":{"type":"string","title":"Version","description":"音声ライブラリのバージョン"},"download_url":{"type":"string","title":"Download Url","description":"音声ライブラリのダウンロードURL"},"bytes":{"type":"integer","title":"Bytes","description":"音声ライブラリのバイト数"},"speakers":{"items":{"$ref":"#/components/schemas/LibrarySpeaker"},"type":"array","title":"Speakers","description":"音声ライブラリに含まれるキャラクターのリスト"}},"type":"object","required":["name","uuid","version","download_url","bytes","speakers"],"title":"DownloadableLibraryInfo","description":"ダウンロード可能な音声ライブラリの情報"},"EngineManifest":{"properties":{"manifest_version":{"type":"string","title":"Manifest Version","description":"マニフェストのバージョン"},"name":{"type":"string","title":"Name","description":"エンジン名"},"brand_name":{"type":"string","title":"Brand Name","description":"ブランド名"},"uuid":{"type":"string","title":"Uuid","description":"エンジンのUUID"},"url":{"type":"string","title":"Url","description":"エンジンのURL"},"icon":{"type":"string","title":"Icon","description":"エンジンのアイコンをBASE64エンコードしたもの"},"default_sampling_rate":{"type":"integer","title":"Default Sampling Rate","description":"デフォルトのサンプリング周波数"},"frame_rate":{"type":"number","title":"Frame Rate","description":"エンジンのフレームレート"},"terms_of_service":{"type":"string","title":"Terms Of Service","description":"エンジンの利用規約"},"update_infos":{"items":{"$ref":"#/components/schemas/UpdateInfo"},"type":"array","title":"Update Infos","description":"エンジンのアップデート情報"},"dependency_licenses":{"items":{"$ref":"#/components/schemas/LicenseInfo"},"type":"array","title":"Dependency Licenses","description":"依存関係のライセンス情報"},"supported_vvlib_manifest_version":{"type":"string","title":"Supported Vvlib Manifest Version","description":"エンジンが対応するvvlibのバージョン"},"supported_features":{"allOf":[{"$ref":"#/components/schemas/SupportedFeatures"}],"description":"エンジンが持つ機能"}},"type":"object","required":["manifest_version","name","brand_name","uuid","url","icon","default_sampling_rate","frame_rate","terms_of_service","update_infos","dependency_licenses","supported_features"],"title":"EngineManifest","description":"エンジン自体に関する情報"},"FrameAudioQuery":{"properties":{"f0":{"items":{"type":"number"},"type":"array","title":"F0","description":"フレームごとの基本周波数"},"volume":{"items":{"type":"number"},"type":"array","title":"Volume","description":"フレームごとの音量"},"phonemes":{"items":{"$ref":"#/components/schemas/FramePhoneme"},"type":"array","title":"Phonemes","description":"音素のリスト"},"volumeScale":{"type":"number","title":"Volumescale","description":"全体の音量"},"outputSamplingRate":{"type":"integer","title":"Outputsamplingrate","description":"音声データの出力サンプリングレート"},"outputStereo":{"type":"boolean","title":"Outputstereo","description":"音声データをステレオ出力するか否か"}},"type":"object","required":["f0","volume","phonemes","volumeScale","outputSamplingRate","outputStereo"],"title":"FrameAudioQuery","description":"フレームごとの音声合成用のクエリ"},"FramePhoneme":{"properties":{"phoneme":{"type":"string","title":"Phoneme","description":"音素"},"frame_length":{"type":"integer","title":"Frame Length","description":"音素のフレーム長"},"note_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note Id","description":"音符のID"}},"type":"object","required":["phoneme","frame_length"],"title":"FramePhoneme","description":"音素の情報"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"InstalledLibraryInfo":{"properties":{"name":{"type":"string","title":"Name","description":"音声ライブラリの名前"},"uuid":{"type":"string","title":"Uuid","description":"音声ライブラリのUUID"},"version":{"type":"string","title":"Version","description":"音声ライブラリのバージョン"},"download_url":{"type":"string","title":"Download Url","description":"音声ライブラリのダウンロードURL"},"bytes":{"type":"integer","title":"Bytes","description":"音声ライブラリのバイト数"},"speakers":{"items":{"$ref":"#/components/schemas/LibrarySpeaker"},"type":"array","title":"Speakers","description":"音声ライブラリに含まれるキャラクターのリスト"},"uninstallable":{"type":"boolean","title":"Uninstallable","description":"アンインストール可能かどうか"}},"type":"object","required":["name","uuid","version","download_url","bytes","speakers","uninstallable"],"title":"InstalledLibraryInfo","description":"インストール済み音声ライブラリの情報"},"LibrarySpeaker":{"properties":{"speaker":{"$ref":"#/components/schemas/Speaker"},"speaker_info":{"$ref":"#/components/schemas/SpeakerInfo"}},"type":"object","required":["speaker","speaker_info"],"title":"LibrarySpeaker","description":"音声ライブラリに含まれるキャラクターの情報"},"LicenseInfo":{"properties":{"name":{"type":"string","title":"Name","description":"依存ライブラリ名"},"version":{"type":"string","title":"Version","description":"依存ライブラリのバージョン"},"license":{"type":"string","title":"License","description":"依存ライブラリのライセンス名"},"text":{"type":"string","title":"Text","description":"依存ライブラリのライセンス本文"}},"type":"object","required":["name","text"],"title":"LicenseInfo","description":"依存ライブラリのライセンス情報"},"Mora":{"properties":{"text":{"type":"string","title":"Text","description":"文字"},"consonant":{"type":"string","title":"Consonant","description":"子音の音素"},"consonant_length":{"type":"number","title":"Consonant Length","description":"子音の音長"},"vowel":{"type":"string","title":"Vowel","description":"母音の音素"},"vowel_length":{"type":"number","title":"Vowel Length","description":"母音の音長"},"pitch":{"type":"number","title":"Pitch","description":"音高"}},"type":"object","required":["text","vowel","vowel_length","pitch"],"title":"Mora","description":"モーラ(子音+母音)ごとの情報"},"MorphableTargetInfo":{"properties":{"is_morphable":{"type":"boolean","title":"Is Morphable","description":"指定したキャラクターに対してモーフィングの可否"}},"type":"object","required":["is_morphable"],"title":"MorphableTargetInfo"},"Note":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id","description":"ID"},"key":{"type":"integer","title":"Key","description":"音階"},"frame_length":{"type":"integer","title":"Frame Length","description":"音符のフレーム長"},"lyric":{"type":"string","title":"Lyric","description":"音符の歌詞"}},"type":"object","required":["frame_length","lyric"],"title":"Note","description":"音符ごとの情報"},"ParseKanaBadRequest":{"properties":{"text":{"type":"string","title":"Text","description":"エラーメッセージ"},"error_name":{"type":"string","title":"Error Name","description":"エラー名\n\n|name|description|\n|---|---|\n| UNKNOWN_TEXT | 判別できない読み仮名があります: {text} |\n| ACCENT_TOP | 句頭にアクセントは置けません: {text} |\n| ACCENT_TWICE | 1つのアクセント句に二つ以上のアクセントは置けません: {text} |\n| ACCENT_NOTFOUND | アクセントを指定していないアクセント句があります: {text} |\n| EMPTY_PHRASE | {position}番目のアクセント句が空白です |\n| INTERROGATION_MARK_NOT_AT_END | アクセント句末以外に「?」は置けません: {text} |\n| INFINITE_LOOP | 処理時に無限ループになってしまいました...バグ報告をお願いします。 |"},"error_args":{"additionalProperties":{"type":"string"},"type":"object","title":"Error Args","description":"エラーを起こした箇所"}},"type":"object","required":["text","error_name","error_args"],"title":"ParseKanaBadRequest"},"Preset":{"properties":{"id":{"type":"integer","title":"Id","description":"プリセットID"},"name":{"type":"string","title":"Name","description":"プリセット名"},"speaker_uuid":{"type":"string","title":"Speaker Uuid","description":"キャラクターのUUID"},"style_id":{"type":"integer","title":"Style Id","description":"スタイルID"},"speedScale":{"type":"number","title":"Speedscale","description":"全体の話速"},"pitchScale":{"type":"number","title":"Pitchscale","description":"全体の音高"},"intonationScale":{"type":"number","title":"Intonationscale","description":"全体の抑揚"},"volumeScale":{"type":"number","title":"Volumescale","description":"全体の音量"},"prePhonemeLength":{"type":"number","title":"Prephonemelength","description":"音声の前の無音時間"},"postPhonemeLength":{"type":"number","title":"Postphonemelength","description":"音声の後の無音時間"},"pauseLength":{"type":"number","title":"Pauselength","description":"句読点などの無音時間"},"pauseLengthScale":{"type":"number","title":"Pauselengthscale","description":"句読点などの無音時間(倍率)","default":1}},"type":"object","required":["id","name","speaker_uuid","style_id","speedScale","pitchScale","intonationScale","volumeScale","prePhonemeLength","postPhonemeLength"],"title":"Preset","description":"プリセット情報"},"Score":{"properties":{"notes":{"items":{"$ref":"#/components/schemas/Note"},"type":"array","title":"Notes","description":"音符のリスト"}},"type":"object","required":["notes"],"title":"Score","description":"楽譜情報"},"Speaker":{"properties":{"name":{"type":"string","title":"Name","description":"名前"},"speaker_uuid":{"type":"string","title":"Speaker Uuid","description":"キャラクターのUUID"},"styles":{"items":{"$ref":"#/components/schemas/SpeakerStyle"},"type":"array","title":"Styles","description":"スタイルの一覧"},"version":{"type":"string","title":"Version","description":"キャラクターのバージョン"},"supported_features":{"allOf":[{"$ref":"#/components/schemas/SpeakerSupportedFeatures"}],"description":"キャラクターの対応機能"}},"type":"object","required":["name","speaker_uuid","styles","version"],"title":"Speaker","description":"キャラクター情報"},"SpeakerInfo":{"properties":{"policy":{"type":"string","title":"Policy","description":"policy.md"},"portrait":{"type":"string","title":"Portrait","description":"立ち絵画像をbase64エンコードしたもの、あるいはURL"},"style_infos":{"items":{"$ref":"#/components/schemas/StyleInfo"},"type":"array","title":"Style Infos","description":"スタイルの追加情報"}},"type":"object","required":["policy","portrait","style_infos"],"title":"SpeakerInfo","description":"キャラクターの追加情報"},"SpeakerStyle":{"properties":{"name":{"type":"string","title":"Name","description":"スタイル名"},"id":{"type":"integer","title":"Id","description":"スタイルID"},"type":{"type":"string","enum":["talk","singing_teacher","frame_decode","sing"],"title":"Type","description":"スタイルの種類。talk:音声合成クエリの作成と音声合成が可能。singing_teacher:歌唱音声合成用のクエリの作成が可能。frame_decode:歌唱音声合成が可能。sing:歌唱音声合成用のクエリの作成と歌唱音声合成が可能。","default":"talk"}},"type":"object","required":["name","id"],"title":"SpeakerStyle","description":"キャラクターのスタイル情報"},"SpeakerSupportedFeatures":{"properties":{"permitted_synthesis_morphing":{"type":"string","enum":["ALL","SELF_ONLY","NOTHING"],"title":"Permitted Synthesis Morphing","description":"モーフィング機能への対応。'ALL' は「全て許可」、'SELF_ONLY' は「同じキャラクター内でのみ許可」、'NOTHING' は「全て禁止」","default":"ALL"}},"type":"object","title":"SpeakerSupportedFeatures","description":"キャラクターの対応機能の情報"},"StyleInfo":{"properties":{"id":{"type":"integer","title":"Id","description":"スタイルID"},"icon":{"type":"string","title":"Icon","description":"このスタイルのアイコンをbase64エンコードしたもの、あるいはURL"},"portrait":{"type":"string","title":"Portrait","description":"このスタイルの立ち絵画像をbase64エンコードしたもの、あるいはURL"},"voice_samples":{"items":{"type":"string"},"type":"array","title":"Voice Samples","description":"サンプル音声をbase64エンコードしたもの、あるいはURL"}},"type":"object","required":["id","icon","voice_samples"],"title":"StyleInfo","description":"スタイルの追加情報"},"SupportedDevicesInfo":{"properties":{"cpu":{"type":"boolean","title":"Cpu","description":"CPUに対応しているか"},"cuda":{"type":"boolean","title":"Cuda","description":"CUDA(Nvidia GPU)に対応しているか"},"dml":{"type":"boolean","title":"Dml","description":"DirectML(Nvidia GPU/Radeon GPU等)に対応しているか"}},"type":"object","required":["cpu","cuda","dml"],"title":"SupportedDevicesInfo","description":"対応しているデバイスの情報"},"SupportedFeatures":{"properties":{"adjust_mora_pitch":{"type":"boolean","title":"Adjust Mora Pitch","description":"モーラごとの音高の調整"},"adjust_phoneme_length":{"type":"boolean","title":"Adjust Phoneme Length","description":"音素ごとの長さの調整"},"adjust_speed_scale":{"type":"boolean","title":"Adjust Speed Scale","description":"全体の話速の調整"},"adjust_pitch_scale":{"type":"boolean","title":"Adjust Pitch Scale","description":"全体の音高の調整"},"adjust_intonation_scale":{"type":"boolean","title":"Adjust Intonation Scale","description":"全体の抑揚の調整"},"adjust_volume_scale":{"type":"boolean","title":"Adjust Volume Scale","description":"全体の音量の調整"},"adjust_pause_length":{"type":"boolean","title":"Adjust Pause Length","description":"句読点などの無音時間の調整"},"interrogative_upspeak":{"type":"boolean","title":"Interrogative Upspeak","description":"疑問文の自動調整"},"synthesis_morphing":{"type":"boolean","title":"Synthesis Morphing","description":"2種類のスタイルでモーフィングした音声を合成"},"sing":{"type":"boolean","title":"Sing","description":"歌唱音声合成"},"manage_library":{"type":"boolean","title":"Manage Library","description":"音声ライブラリのインストール・アンインストール"},"return_resource_url":{"type":"boolean","title":"Return Resource Url","description":"キャラクター情報のリソースをURLで返送"}},"type":"object","required":["adjust_mora_pitch","adjust_phoneme_length","adjust_speed_scale","adjust_pitch_scale","adjust_intonation_scale","adjust_volume_scale","interrogative_upspeak","synthesis_morphing"],"title":"SupportedFeatures","description":"エンジンが持つ機能の一覧"},"UpdateInfo":{"properties":{"version":{"type":"string","title":"Version","description":"エンジンのバージョン名"},"descriptions":{"items":{"type":"string"},"type":"array","title":"Descriptions","description":"アップデートの詳細についての説明"},"contributors":{"items":{"type":"string"},"type":"array","title":"Contributors","description":"貢献者名"}},"type":"object","required":["version","descriptions"],"title":"UpdateInfo","description":"エンジンのアップデート情報"},"UserDictWord":{"properties":{"surface":{"type":"string","title":"Surface","description":"表層形"},"priority":{"type":"integer","maximum":10.0,"minimum":0.0,"title":"Priority","description":"優先度"},"context_id":{"type":"integer","title":"Context Id","description":"文脈ID","default":1348},"part_of_speech":{"type":"string","title":"Part Of Speech","description":"品詞"},"part_of_speech_detail_1":{"type":"string","title":"Part Of Speech Detail 1","description":"品詞細分類1"},"part_of_speech_detail_2":{"type":"string","title":"Part Of Speech Detail 2","description":"品詞細分類2"},"part_of_speech_detail_3":{"type":"string","title":"Part Of Speech Detail 3","description":"品詞細分類3"},"inflectional_type":{"type":"string","title":"Inflectional Type","description":"活用型"},"inflectional_form":{"type":"string","title":"Inflectional Form","description":"活用形"},"stem":{"type":"string","title":"Stem","description":"原形"},"yomi":{"type":"string","title":"Yomi","description":"読み"},"pronunciation":{"type":"string","title":"Pronunciation","description":"発音"},"accent_type":{"type":"integer","title":"Accent Type","description":"アクセント型"},"mora_count":{"type":"integer","title":"Mora Count","description":"モーラ数"},"accent_associative_rule":{"type":"string","title":"Accent Associative Rule","description":"アクセント結合規則"}},"type":"object","required":["surface","priority","part_of_speech","part_of_speech_detail_1","part_of_speech_detail_2","part_of_speech_detail_3","inflectional_type","inflectional_form","stem","yomi","pronunciation","accent_type","accent_associative_rule"],"title":"UserDictWord","description":"辞書のコンパイルに使われる情報"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WordTypes":{"type":"string","enum":["PROPER_NOUN","COMMON_NOUN","VERB","ADJECTIVE","SUFFIX"],"title":"WordTypes","description":"品詞"},"BaseLibraryInfo":{"description":"音声ライブラリの情報","properties":{"name":{"description":"音声ライブラリの名前","title":"Name","type":"string"},"uuid":{"description":"音声ライブラリのUUID","title":"Uuid","type":"string"},"version":{"description":"音声ライブラリのバージョン","title":"Version","type":"string"},"download_url":{"description":"音声ライブラリのダウンロードURL","title":"Download Url","type":"string"},"bytes":{"description":"音声ライブラリのバイト数","title":"Bytes","type":"integer"},"speakers":{"description":"音声ライブラリに含まれるキャラクターのリスト","items":{"$ref":"#/components/schemas/LibrarySpeaker"},"title":"Speakers","type":"array"}},"required":["name","uuid","version","download_url","bytes","speakers"],"title":"BaseLibraryInfo","type":"object"},"VvlibManifest":{"description":"vvlib(VOICEVOX Library)に関する情報","properties":{"manifest_version":{"description":"マニフェストバージョン","title":"Manifest Version","type":"string"},"name":{"description":"音声ライブラリ名","title":"Name","type":"string"},"version":{"description":"音声ライブラリバージョン","title":"Version","type":"string"},"uuid":{"description":"音声ライブラリのUUID","title":"Uuid","type":"string"},"brand_name":{"description":"エンジンのブランド名","title":"Brand Name","type":"string"},"engine_name":{"description":"エンジン名","title":"Engine Name","type":"string"},"engine_uuid":{"description":"エンジンのUUID","title":"Engine Uuid","type":"string"}},"required":["manifest_version","name","version","uuid","brand_name","engine_name","engine_uuid"],"title":"VvlibManifest","type":"object"}}}} \ No newline at end of file diff --git a/src/openapi/models/AudioQuery.ts b/src/openapi/models/AudioQuery.ts index 65628945e7..8eeecebf6a 100644 --- a/src/openapi/models/AudioQuery.ts +++ b/src/openapi/models/AudioQuery.ts @@ -56,12 +56,6 @@ export interface AudioQuery { * @memberof AudioQuery */ volumeScale: number; - /** - * 句読点などの無音時間(倍率)。デフォルト値は1 - * @type {number} - * @memberof AudioQuery - */ - pauseLengthScale: number; /** * 音声の前の無音時間 * @type {number} @@ -80,6 +74,12 @@ export interface AudioQuery { * @memberof AudioQuery */ pauseLength?: number | null; + /** + * 句読点などの無音時間(倍率)。デフォルト値は1 + * @type {number} + * @memberof AudioQuery + */ + pauseLengthScale?: number; /** * 音声データの出力サンプリングレート * @type {number} @@ -133,10 +133,10 @@ export function AudioQueryFromJSONTyped(json: any, ignoreDiscriminator: boolean) 'pitchScale': json['pitchScale'], 'intonationScale': json['intonationScale'], 'volumeScale': json['volumeScale'], - 'pauseLengthScale': !exists(json, 'pauseLengthScale') ? undefined : json['pauseLengthScale'], 'prePhonemeLength': json['prePhonemeLength'], 'postPhonemeLength': json['postPhonemeLength'], 'pauseLength': !exists(json, 'pauseLength') ? undefined : json['pauseLength'], + 'pauseLengthScale': !exists(json, 'pauseLengthScale') ? undefined : json['pauseLengthScale'], 'outputSamplingRate': json['outputSamplingRate'], 'outputStereo': json['outputStereo'], 'kana': !exists(json, 'kana') ? undefined : json['kana'], @@ -157,10 +157,10 @@ export function AudioQueryToJSON(value?: AudioQuery | null): any { 'pitchScale': value.pitchScale, 'intonationScale': value.intonationScale, 'volumeScale': value.volumeScale, - 'pauseLengthScale': value.pauseLengthScale, 'prePhonemeLength': value.prePhonemeLength, 'postPhonemeLength': value.postPhonemeLength, 'pauseLength': value.pauseLength, + 'pauseLengthScale': value.pauseLengthScale, 'outputSamplingRate': value.outputSamplingRate, 'outputStereo': value.outputStereo, 'kana': value.kana, diff --git a/src/openapi/models/Preset.ts b/src/openapi/models/Preset.ts index 78162cce8c..78af2e078d 100644 --- a/src/openapi/models/Preset.ts +++ b/src/openapi/models/Preset.ts @@ -67,12 +67,6 @@ export interface Preset { * @memberof Preset */ volumeScale: number; - /** - * 句読点などの無音時間(倍率) - * @type {number} - * @memberof Preset - */ - pauseLengthScale: number; /** * 音声の前の無音時間 * @type {number} @@ -91,6 +85,12 @@ export interface Preset { * @memberof Preset */ pauseLength?: number; + /** + * 句読点などの無音時間(倍率) + * @type {number} + * @memberof Preset + */ + pauseLengthScale?: number; } /** @@ -130,10 +130,10 @@ export function PresetFromJSONTyped(json: any, ignoreDiscriminator: boolean): Pr 'pitchScale': json['pitchScale'], 'intonationScale': json['intonationScale'], 'volumeScale': json['volumeScale'], - 'pauseLengthScale': !exists(json, 'pauseLengthScale') ? undefined : json['pauseLengthScale'], 'prePhonemeLength': json['prePhonemeLength'], 'postPhonemeLength': json['postPhonemeLength'], 'pauseLength': !exists(json, 'pauseLength') ? undefined : json['pauseLength'], + 'pauseLengthScale': !exists(json, 'pauseLengthScale') ? undefined : json['pauseLengthScale'], }; } @@ -154,10 +154,10 @@ export function PresetToJSON(value?: Preset | null): any { 'pitchScale': value.pitchScale, 'intonationScale': value.intonationScale, 'volumeScale': value.volumeScale, - 'pauseLengthScale': value.pauseLengthScale, 'prePhonemeLength': value.prePhonemeLength, 'postPhonemeLength': value.postPhonemeLength, 'pauseLength': value.pauseLength, + 'pauseLengthScale': value.pauseLengthScale, }; } diff --git a/src/store/audio.ts b/src/store/audio.ts index 3b17c88d38..2d802665ee 100644 --- a/src/store/audio.ts +++ b/src/store/audio.ts @@ -1297,10 +1297,9 @@ export const audioStore = createPartialStore({ length += m.consonantLength != undefined ? m.consonantLength : 0; length += m.vowelLength; }); - if (phrase.pauseMora != null && query.pauseLengthScale != undefined) { - const pauseLength = phrase.pauseMora.vowelLength; - length += pauseLength * query.pauseLengthScale; - } + length += phrase.pauseMora + ? phrase.pauseMora.vowelLength * query.pauseLengthScale + : 0; // post phoneme lengthは最後のアクセント句の一部として扱う if (i === accentPhrases.length - 1) { length += query.postPhonemeLength; diff --git a/src/store/audioGenerate.ts b/src/store/audioGenerate.ts index 7d9ca52b74..d50790674e 100644 --- a/src/store/audioGenerate.ts +++ b/src/store/audioGenerate.ts @@ -100,7 +100,11 @@ export async function generateLabFromAudioQuery( }); if (accentPhrase.pauseMora != undefined) { labString += timestamp.toFixed() + " "; - timestamp += (accentPhrase.pauseMora.vowelLength * 10000000) / speedScale; + timestamp += + (accentPhrase.pauseMora.vowelLength * + audioQuery.pauseLengthScale * + 10000000) / + speedScale; labString += timestamp.toFixed() + " "; labString += accentPhrase.pauseMora.vowel + "\n"; } From 827b06e2b8dfb641a7e20cfdbe997b801b32c935 Mon Sep 17 00:00:00 2001 From: X-20A <155217226+X-20A@users.noreply.github.com> Date: Fri, 15 Nov 2024 22:22:46 +0900 Subject: [PATCH 10/11] [update snapshots] From bec79568c74654b71728cda6b4ca9c5f379634a4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 15 Nov 2024 13:30:37 +0000 Subject: [PATCH 11/11] =?UTF-8?q?=EF=BC=88=E3=82=B9=E3=83=8A=E3=83=83?= =?UTF-8?q?=E3=83=97=E3=82=B7=E3=83=A7=E3=83=83=E3=83=88=E3=82=92=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...347\224\273\351\235\242-browser-win32.png" | Bin 54233 -> 49175 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git "a/tests/e2e/browser/\343\202\271\343\202\257\343\203\252\343\203\274\343\203\263\343\202\267\343\203\247\343\203\203\343\203\210.spec.ts-snapshots/\343\203\210\343\203\274\343\202\257\347\224\273\351\235\242-browser-win32.png" "b/tests/e2e/browser/\343\202\271\343\202\257\343\203\252\343\203\274\343\203\263\343\202\267\343\203\247\343\203\203\343\203\210.spec.ts-snapshots/\343\203\210\343\203\274\343\202\257\347\224\273\351\235\242-browser-win32.png" index 538d4153c366f8bd74711f73d708fa99ad3f8955..0ac99a015756f00ad24ee3b4e2d2f07f86e3a1e3 100644 GIT binary patch literal 49175 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

H_7nbEMhv%0#vw>Lyc^QvGW`mW7l9eirRGdP%- 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