Skip to content

Commit

Permalink
「音声をつなげて書き出し」のファイルエラーメッセージを表示する (#2131)
Browse files Browse the repository at this point in the history
* generateWriteErrorMessage移動

* エラーメッセージを追加

* CONNECT_AND_EXPORT_TEXTも
  • Loading branch information
Hiroshiba authored Jul 6, 2024
1 parent 3ce6c7e commit cdb31d9
Show file tree
Hide file tree
Showing 2 changed files with 74 additions and 57 deletions.
24 changes: 24 additions & 0 deletions src/helpers/fileHelper.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import { ResultError } from "@/type/result";

/** ファイル書き込み時のエラーメッセージを生成する */
export function generateWriteErrorMessage(writeFileResult: ResultError) {
const code = writeFileResult.code?.toUpperCase();

if (code?.startsWith("ENOSPC")) {
return "空き容量が足りません。";
}

if (code?.startsWith("EACCES")) {
return "ファイルにアクセスする許可がありません。";
}

if (code?.startsWith("EBUSY")) {
return "ファイルが開かれています。";
}

if (code?.startsWith("ENOENT")) {
return "ファイルが見つかりません。";
}

return `何らかの理由で失敗しました。${writeFileResult.message}`;
}
107 changes: 50 additions & 57 deletions src/store/audio.ts
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ import {
import { AudioQuery, AccentPhrase, Speaker, SpeakerInfo } from "@/openapi";
import { base64ImageToUri, base64ToUri } from "@/helpers/base64Helper";
import { getValueOrThrow, ResultError } from "@/type/result";
import { generateWriteErrorMessage } from "@/helpers/fileHelper";

function generateAudioKey() {
return AudioKey(crypto.randomUUID());
Expand Down Expand Up @@ -166,25 +167,6 @@ export async function writeTextFile(obj: {
});
}

function generateWriteErrorMessage(writeFileResult: ResultError) {
if (!writeFileResult.code) {
return `何らかの理由で失敗しました。${writeFileResult.message}`;
}
const code = writeFileResult.code.toUpperCase();

if (code.startsWith("ENOSPC")) {
return "空き容量が足りません。";
}

if (code.startsWith("EACCES")) {
return "ファイルにアクセスする許可がありません。";
}

if (code.startsWith("EBUSY")) {
return "ファイルが開かれています。";
}
}

// TODO: GETTERに移動する。
export function getCharacterInfo(
state: State,
Expand Down Expand Up @@ -1522,8 +1504,6 @@ export const audioStore = createPartialStore<AudioStoreTypes>({
const labs: string[] = [];
const texts: string[] = [];

let labOffset = 0;

const base64Encoder = (blob: Blob): Promise<string | undefined> => {
return new Promise((resolve, reject) => {
const reader = new FileReader();
Expand All @@ -1544,6 +1524,7 @@ export const audioStore = createPartialStore<AudioStoreTypes>({
const totalCount = state.audioKeys.length;
let finishedCount = 0;

let labOffset = 0;
for (const audioKey of state.audioKeys) {
let fetchAudioResult: FetchAudioResult;
try {
Expand All @@ -1565,21 +1546,21 @@ export const audioStore = createPartialStore<AudioStoreTypes>({
return { result: "WRITE_ERROR", path: filePath };
}
encodedBlobs.push(encodedBlob);

// 大して処理能力を要しないので、生成設定のon/offにかかわらず生成してしまう
const lab = await generateLabFromAudioQuery(audioQuery, labOffset);
if (lab == undefined) {
return { result: "WRITE_ERROR", path: filePath };
}
labs.push(lab);

// 最終音素の終了時刻を取得する
const splitLab = lab.split(" ");
labOffset = Number(splitLab[splitLab.length - 2]);

texts.push(
extractExportText(state.audioItems[audioKey].text, {
enableMemoNotation: state.enableMemoNotation,
enableRubyNotation: state.enableRubyNotation,
}),
);
// 最終音素の終了時刻を取得する
const splitLab = lab.split(" ");
labOffset = Number(splitLab[splitLab.length - 2]);
}

const connectedWav = await dispatch("CONNECT_AUDIO", {
Expand All @@ -1589,40 +1570,48 @@ export const audioStore = createPartialStore<AudioStoreTypes>({
return { result: "ENGINE_ERROR", path: filePath };
}

const writeFileResult = await window.backend.writeFile({
filePath,
buffer: await connectedWav.arrayBuffer(),
});
if (!writeFileResult.ok) {
window.backend.logError(writeFileResult.error);
return { result: "WRITE_ERROR", path: filePath };
}
try {
await window.backend
.writeFile({
filePath,
buffer: await connectedWav.arrayBuffer(),
})
.then(getValueOrThrow);

if (state.savingSetting.exportLab) {
const labResult = await writeTextFile({
// `generateLabFromAudioQuery`で生成される文字列はすべて改行で終わるので、追加で改行を挟む必要はない
text: labs.join(""),
filePath: filePath.replace(/\.wav$/, ".lab"),
});
if (!labResult.ok) {
window.backend.logError(labResult.error);
return { result: "WRITE_ERROR", path: filePath };
if (state.savingSetting.exportLab) {
await writeTextFile({
// `generateLabFromAudioQuery`で生成される文字列はすべて改行で終わるので、追加で改行を挟む必要はない
text: labs.join(""),
filePath: filePath.replace(/\.wav$/, ".lab"),
}).then(getValueOrThrow);
}
}

if (state.savingSetting.exportText) {
const textResult = await writeTextFile({
text: texts.join("\n"),
filePath: filePath.replace(/\.wav$/, ".txt"),
encoding: state.savingSetting.fileEncoding,
});
if (!textResult.ok) {
window.backend.logError(textResult.error);
return { result: "WRITE_ERROR", path: filePath };
if (state.savingSetting.exportText) {
await writeTextFile({
text: texts.join("\n"),
filePath: filePath.replace(/\.wav$/, ".txt"),
encoding: state.savingSetting.fileEncoding,
}).then(getValueOrThrow);
}
}

return { result: "SUCCESS", path: filePath };
return { result: "SUCCESS", path: filePath };
} catch (e) {
window.backend.logError(e);
if (e instanceof ResultError) {
return {
result: "WRITE_ERROR",
path: filePath,
errorMessage: generateWriteErrorMessage(e),
};
}
return {
result: "UNKNOWN_ERROR",
path: filePath,
errorMessage:
(e instanceof Error ? e.message : String(e)) ||
"不明なエラーが発生しました。",
};
}
},
),
},
Expand Down Expand Up @@ -1701,7 +1690,11 @@ export const audioStore = createPartialStore<AudioStoreTypes>({
});
if (!result.ok) {
window.backend.logError(result.error);
return { result: "WRITE_ERROR", path: filePath };
return {
result: "WRITE_ERROR",
path: filePath,
errorMessage: generateWriteErrorMessage(new ResultError(result)),
};
}

return { result: "SUCCESS", path: filePath };
Expand Down

0 comments on commit cdb31d9

Please sign in to comment.