diff --git a/src/mock/engineMock/index.ts b/src/mock/engineMock/index.ts index 19142fa1c4..e85f1a646f 100644 --- a/src/mock/engineMock/index.ts +++ b/src/mock/engineMock/index.ts @@ -107,6 +107,8 @@ export function createOpenAPIEngineMock(): DefaultApiInterface { volumeScale: 1.0, prePhonemeLength: 0.1, postPhonemeLength: 0.1, + pauseLength: null, + pauseLengthScale: 1.0, outputSamplingRate: getEngineManifestMock().defaultSamplingRate, outputStereo: false, }; diff --git a/src/mock/engineMock/manifestMock.ts b/src/mock/engineMock/manifestMock.ts index 4a32cf957b..a4e4d7437c 100644 --- a/src/mock/engineMock/manifestMock.ts +++ b/src/mock/engineMock/manifestMock.ts @@ -26,7 +26,8 @@ export function getEngineManifestMock() { adjustPitchScale: true, adjustIntonationScale: true, adjustVolumeScale: true, - interrogativeUpspeak: false, + adjustPauseLength: true, + interrogativeUpspeak: true, synthesisMorphing: false, sing: true, manageLibrary: false, diff --git a/src/mock/engineMock/talkModelMock.ts b/src/mock/engineMock/talkModelMock.ts index ed17bd62db..85ceb87126 100644 --- a/src/mock/engineMock/talkModelMock.ts +++ b/src/mock/engineMock/talkModelMock.ts @@ -178,7 +178,7 @@ export async function textToActtentPhrasesMock(text: string, styleId: number) { const pauseMora = { text: "、", vowel: "pau", - vowelLength: 1 - 1 / (accentPhrases.length + 1), + vowelLength: 1 - 1 / (accentPhrases.length + 2), pitch: 0, }; diff --git a/tests/e2e/browser/utility.ts b/tests/e2e/browser/utility.ts new file mode 100644 index 0000000000..b00bf3fcc0 --- /dev/null +++ b/tests/e2e/browser/utility.ts @@ -0,0 +1,81 @@ +import { Page } from "@playwright/test"; +import { Brand } from "@/type/utility"; +import { success } from "@/type/result"; + +type TestFileId = Brand; + +/** ファイル書き出し選択ダイアログをモックにする */ +// TODO: モックを戻せるようにする +export async function mockShowSaveFileDialog(page: Page): Promise<{ + getFileIds: () => Promise; +}> { + type _Window = Window & { + _mockShowSaveFileDialog: { + returnValues: TestFileId[]; + }; + }; + + // モックを差し込む + await page.evaluate(() => { + const _window = window as unknown as _Window; + _window._mockShowSaveFileDialog = { + returnValues: [], + }; + + _window.backend.showSaveFileDialog = async () => { + const id = `${Date.now()}` as TestFileId; + _window._mockShowSaveFileDialog.returnValues.push(id); + return id; + }; + }); + + return { + getFileIds: async () => { + return page.evaluate(() => { + const _window = window as unknown as _Window; + return _window._mockShowSaveFileDialog.returnValues; + }); + }, + }; +} + +/** ファイル書き出しをモックにする */ +// TODO: モックを戻せるようにする +export async function mockWriteFile(page: Page): Promise<{ + getWrittenFileBuffers: () => Promise>; +}> { + type _Window = Window & { + _mockWriteFile: Record; + }; + + // モックを差し込む + await page.evaluate( + ({ sucecssResult }) => { + const _window = window as unknown as _Window; + _window._mockWriteFile = {}; + + _window.backend.writeFile = async ({ filePath, buffer }) => { + _window._mockWriteFile[filePath] = new Uint8Array(buffer); + return sucecssResult; + }; + }, + { sucecssResult: success(undefined) }, + ); + + return { + getWrittenFileBuffers: async () => { + const arrays = await page.evaluate(() => { + const _window = window as unknown as _Window; + return Object.fromEntries( + Object.entries(_window._mockWriteFile).map(([key, value]) => [ + key, + Array.from(value), + ]), + ); + }); + return Object.fromEntries( + Object.entries(arrays).map(([key, value]) => [key, Buffer.from(value)]), + ); + }, + }; +} 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 54332e013d..f2a6505843 100644 Binary files "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" and "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" differ diff --git "a/tests/e2e/browser/\351\237\263\345\243\260\346\233\270\343\201\215\345\207\272\343\201\227.spec.ts" "b/tests/e2e/browser/\351\237\263\345\243\260\346\233\270\343\201\215\345\207\272\343\201\227.spec.ts" new file mode 100644 index 0000000000..84a239a773 --- /dev/null +++ "b/tests/e2e/browser/\351\237\263\345\243\260\346\233\270\343\201\215\345\207\272\343\201\227.spec.ts" @@ -0,0 +1,80 @@ +import { test, expect, Page } from "@playwright/test"; +import { gotoHome, navigateToMain } from "../navigators"; +import { getQuasarMenu } from "../locators"; +import { mockShowSaveFileDialog, mockWriteFile } from "./utility"; + +test.beforeEach(gotoHome); + +async function exportSelectedAudioAndSnapshot(page: Page, name: string) { + const { getFileIds } = await mockShowSaveFileDialog(page); + const { getWrittenFileBuffers } = await mockWriteFile(page); + + await test.step("選択音声を書き出す", async () => { + await page.getByRole("button", { name: "ファイル" }).click(); + await getQuasarMenu(page, "選択音声を書き出し").click(); + }); + + await test.step("書き出し完了の通知を確認して閉じる", async () => { + const notify = page.locator("#q-notify"); + await expect(notify.getByText("音声を書き出しました")).toBeVisible(); + await notify.getByRole("button", { name: "閉じる" }).click(); + await expect(notify).not.toBeVisible(); + }); + + await test.step("音声ファイルのバイナリをスナップショット", async () => { + const fileId = (await getFileIds())[0]; + const buffer = (await getWrittenFileBuffers())[fileId]; + expect(buffer).toMatchSnapshot(`${name}.wav`); + }); +} + +test.describe("音声書き出し", () => { + test.skip(process.platform !== "win32", "Windows以外のためスキップします"); + + test.beforeEach(async ({ page }) => { + await navigateToMain(page); + + await test.step("テキスト欄にテキストを入力", async () => { + const audioCell = page.getByRole("textbox", { name: "1行目" }); + const accentPhrase = page.locator(".accent-phrase"); + + await audioCell.click(); + await audioCell.fill("こんにちは、テストです"); + await audioCell.press("Enter"); + await expect(accentPhrase).not.toHaveCount(0); + }); + }); + + test("各パラメータを変更して音声書き出し", async ({ page }) => { + await exportSelectedAudioAndSnapshot(page, "デフォルト"); + + const parameters = [ + ["話速", "1.5"], + ["音高", "0.5"], + ["抑揚", "1.5"], + ["音量", "1.5"], + ["間の長さ", "1.5"], + ["開始無音", "0.3"], + ["終了無音", "0.3"], + ] as const; + + for (const [name, newValue] of parameters) { + await test.step(`${name}変更`, async () => { + const input = page.getByLabel(name); + const originalValue = await input.inputValue(); + + await test.step("パラメータを変更", async () => { + await input.fill(newValue); + await input.press("Enter"); + }); + + await exportSelectedAudioAndSnapshot(page, `${name}変更`); + + await test.step("元の値に戻す", async () => { + await input.fill(originalValue); + await input.press("Enter"); + }); + }); + } + }); +}); diff --git "a/tests/e2e/browser/\351\237\263\345\243\260\346\233\270\343\201\215\345\207\272\343\201\227.spec.ts-snapshots/\343\203\207\343\203\225\343\202\251\343\203\253\343\203\210-browser-win32.wav" "b/tests/e2e/browser/\351\237\263\345\243\260\346\233\270\343\201\215\345\207\272\343\201\227.spec.ts-snapshots/\343\203\207\343\203\225\343\202\251\343\203\253\343\203\210-browser-win32.wav" new file mode 100644 index 0000000000..71a403630e Binary files /dev/null and "b/tests/e2e/browser/\351\237\263\345\243\260\346\233\270\343\201\215\345\207\272\343\201\227.spec.ts-snapshots/\343\203\207\343\203\225\343\202\251\343\203\253\343\203\210-browser-win32.wav" differ diff --git "a/tests/e2e/browser/\351\237\263\345\243\260\346\233\270\343\201\215\345\207\272\343\201\227.spec.ts-snapshots/\346\212\221\346\217\232\345\244\211\346\233\264-browser-win32.wav" "b/tests/e2e/browser/\351\237\263\345\243\260\346\233\270\343\201\215\345\207\272\343\201\227.spec.ts-snapshots/\346\212\221\346\217\232\345\244\211\346\233\264-browser-win32.wav" new file mode 100644 index 0000000000..c60a29e62e Binary files /dev/null and "b/tests/e2e/browser/\351\237\263\345\243\260\346\233\270\343\201\215\345\207\272\343\201\227.spec.ts-snapshots/\346\212\221\346\217\232\345\244\211\346\233\264-browser-win32.wav" differ diff --git "a/tests/e2e/browser/\351\237\263\345\243\260\346\233\270\343\201\215\345\207\272\343\201\227.spec.ts-snapshots/\347\265\202\344\272\206\347\204\241\351\237\263\345\244\211\346\233\264-browser-win32.wav" "b/tests/e2e/browser/\351\237\263\345\243\260\346\233\270\343\201\215\345\207\272\343\201\227.spec.ts-snapshots/\347\265\202\344\272\206\347\204\241\351\237\263\345\244\211\346\233\264-browser-win32.wav" new file mode 100644 index 0000000000..16c4946f5b Binary files /dev/null and "b/tests/e2e/browser/\351\237\263\345\243\260\346\233\270\343\201\215\345\207\272\343\201\227.spec.ts-snapshots/\347\265\202\344\272\206\347\204\241\351\237\263\345\244\211\346\233\264-browser-win32.wav" differ diff --git "a/tests/e2e/browser/\351\237\263\345\243\260\346\233\270\343\201\215\345\207\272\343\201\227.spec.ts-snapshots/\350\251\261\351\200\237\345\244\211\346\233\264-browser-win32.wav" "b/tests/e2e/browser/\351\237\263\345\243\260\346\233\270\343\201\215\345\207\272\343\201\227.spec.ts-snapshots/\350\251\261\351\200\237\345\244\211\346\233\264-browser-win32.wav" new file mode 100644 index 0000000000..beb3ff8616 Binary files /dev/null and "b/tests/e2e/browser/\351\237\263\345\243\260\346\233\270\343\201\215\345\207\272\343\201\227.spec.ts-snapshots/\350\251\261\351\200\237\345\244\211\346\233\264-browser-win32.wav" differ diff --git "a/tests/e2e/browser/\351\237\263\345\243\260\346\233\270\343\201\215\345\207\272\343\201\227.spec.ts-snapshots/\351\226\213\345\247\213\347\204\241\351\237\263\345\244\211\346\233\264-browser-win32.wav" "b/tests/e2e/browser/\351\237\263\345\243\260\346\233\270\343\201\215\345\207\272\343\201\227.spec.ts-snapshots/\351\226\213\345\247\213\347\204\241\351\237\263\345\244\211\346\233\264-browser-win32.wav" new file mode 100644 index 0000000000..2c78102fe2 Binary files /dev/null and "b/tests/e2e/browser/\351\237\263\345\243\260\346\233\270\343\201\215\345\207\272\343\201\227.spec.ts-snapshots/\351\226\213\345\247\213\347\204\241\351\237\263\345\244\211\346\233\264-browser-win32.wav" differ diff --git "a/tests/e2e/browser/\351\237\263\345\243\260\346\233\270\343\201\215\345\207\272\343\201\227.spec.ts-snapshots/\351\226\223\343\201\256\351\225\267\343\201\225\345\244\211\346\233\264-browser-win32.wav" "b/tests/e2e/browser/\351\237\263\345\243\260\346\233\270\343\201\215\345\207\272\343\201\227.spec.ts-snapshots/\351\226\223\343\201\256\351\225\267\343\201\225\345\244\211\346\233\264-browser-win32.wav" new file mode 100644 index 0000000000..f00d3ee2fc Binary files /dev/null and "b/tests/e2e/browser/\351\237\263\345\243\260\346\233\270\343\201\215\345\207\272\343\201\227.spec.ts-snapshots/\351\226\223\343\201\256\351\225\267\343\201\225\345\244\211\346\233\264-browser-win32.wav" differ diff --git "a/tests/e2e/browser/\351\237\263\345\243\260\346\233\270\343\201\215\345\207\272\343\201\227.spec.ts-snapshots/\351\237\263\351\207\217\345\244\211\346\233\264-browser-win32.wav" "b/tests/e2e/browser/\351\237\263\345\243\260\346\233\270\343\201\215\345\207\272\343\201\227.spec.ts-snapshots/\351\237\263\351\207\217\345\244\211\346\233\264-browser-win32.wav" new file mode 100644 index 0000000000..4c61a96973 Binary files /dev/null and "b/tests/e2e/browser/\351\237\263\345\243\260\346\233\270\343\201\215\345\207\272\343\201\227.spec.ts-snapshots/\351\237\263\351\207\217\345\244\211\346\233\264-browser-win32.wav" differ diff --git "a/tests/e2e/browser/\351\237\263\345\243\260\346\233\270\343\201\215\345\207\272\343\201\227.spec.ts-snapshots/\351\237\263\351\253\230\345\244\211\346\233\264-browser-win32.wav" "b/tests/e2e/browser/\351\237\263\345\243\260\346\233\270\343\201\215\345\207\272\343\201\227.spec.ts-snapshots/\351\237\263\351\253\230\345\244\211\346\233\264-browser-win32.wav" new file mode 100644 index 0000000000..ca59189825 Binary files /dev/null and "b/tests/e2e/browser/\351\237\263\345\243\260\346\233\270\343\201\215\345\207\272\343\201\227.spec.ts-snapshots/\351\237\263\351\253\230\345\244\211\346\233\264-browser-win32.wav" differ diff --git a/tests/unit/mock/engineMock/__snapshots__/index.spec.ts.snap b/tests/unit/mock/engineMock/__snapshots__/index.spec.ts.snap index 87315b839a..4c0dcf11de 100644 --- a/tests/unit/mock/engineMock/__snapshots__/index.spec.ts.snap +++ b/tests/unit/mock/engineMock/__snapshots__/index.spec.ts.snap @@ -53,6 +53,8 @@ exports[`createOpenAPIEngineMock > audioQueryAudioQueryPost 1`] = ` "intonationScale": 1, "outputSamplingRate": 24000, "outputStereo": false, + "pauseLength": null, + "pauseLengthScale": 1, "pitchScale": 0, "postPhonemeLength": 0.1, "prePhonemeLength": 0.1,