Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[WIP] .envで指定されているVVPPがなかったら確認後にインストールし、使えるようにするようにする #2270

Draft
wants to merge 23 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
f1bc063
stash
Hiroshiba Sep 7, 2024
3310c6f
Merge remote-tracking branch 'upstream/main' into 指定されているVVPPがなかったら確認…
Hiroshiba Sep 20, 2024
06ac776
stash
Hiroshiba Sep 25, 2024
8237c8f
Merge remote-tracking branch 'upstream/main' into pr/Hiroshiba/2270
Hiroshiba Oct 6, 2024
674d116
とりあえずデフォルトエンジンをダウンロードできるようにした
Hiroshiba Oct 6, 2024
f5f705d
typo
Hiroshiba Oct 6, 2024
e2e3b88
docsを移動
Hiroshiba Oct 7, 2024
3b642aa
リファクタリング
Hiroshiba Oct 7, 2024
f6a51da
コントローラーに移す
Hiroshiba Oct 7, 2024
87e666f
fetchInfosToInstall
Hiroshiba Oct 7, 2024
2c6a974
typos
Hiroshiba Oct 7, 2024
187cc8a
Merge remote-tracking branch 'upstream/main' into 指定されているVVPPがなかったら確認…
Hiroshiba Oct 29, 2024
8884110
.envのデフォルトエンジン情報を読み出す部分を共通化する
Hiroshiba Oct 29, 2024
6e637ad
.
Hiroshiba Oct 29, 2024
1627f00
Merge branch 'loadEnvEngineInfosに切り出し' into 指定されているVVPPがなかったら確認後にインスト…
Hiroshiba Oct 29, 2024
6d56d0b
m
Hiroshiba Oct 29, 2024
a198568
typing
Hiroshiba Oct 29, 2024
51e6461
a
Hiroshiba Oct 29, 2024
c9d4edf
微調整
Hiroshiba Oct 30, 2024
e179306
Merge remote-tracking branch 'upstream/main' into 指定されているVVPPがなかったら確認…
Hiroshiba Oct 30, 2024
692f001
戻す
Hiroshiba Oct 30, 2024
ad41881
名称変更とか
Hiroshiba Oct 30, 2024
016e142
fetchAdditionalEngineInfosをfetchVvppEngineInfosとfetchRegisteredEngine…
Hiroshiba Oct 30, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions docs/エンジン周りについて.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# エンジン周りについて

VOICEVOXはマルチエンジン機能を介して複数のVOICEVOX API準拠エンジンを扱うことができます。
それ以外にも多様な概念が存在するため、ここでまとめてドキュメント化しています。

## 用語説明

| 用語 | 説明 |
| ------------------------- | -------------------------------------------------------------------------------------------- |
| VOICEVOX API 準拠エンジン | VOICEVOX API に準拠したエンジンのこと。 |
| マルチエンジン | エディタ内で複数のエンジンを扱う機能のこと。 |
| デフォルトエンジン | エディタに付属しているエンジンのこと。<br>デフォルトエンジンがないとエディタが起動しない。 |
| VVPP | VOICEVOXにインストールできるエンジンのパッケージファイル。<br>エンジンやエンジン情報を含む。 |

<!--
TODO: 以下の内容を`細かい設計方針.md`から移動する

## マルチエンジン
## デフォルトエンジンの更新情報
-->
103 changes: 103 additions & 0 deletions src/backend/electron/engineAndVvppController.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import path from "path";
import fs from "fs";
import log from "electron-log/main";
import { BrowserWindow, dialog } from "electron";

Expand All @@ -12,6 +14,15 @@ import {
engineSettingSchema,
EngineSettingType,
} from "@/type/preload";
import {
EnginePackage,
fetchLatestDefaultEngineInfo,
getSuitablePackage,
} from "@/domain/defaultEngine/latetDefaultEngine";
import {
EnvEngineInfoType,
loadEnvEngineInfos,
} from "@/domain/defaultEngine/envEngineInfo";

/**
* エンジンとVVPP周りの処理の流れを制御するクラス。
Expand Down Expand Up @@ -123,6 +134,98 @@ export class EngineAndVvppController {
}
}

/**
* インストールが必要なデフォルトエンジンの情報とパッケージの情報を取得する。
*/
async fetchEngineAndPackageInfosToInstall(): Promise<
{
envEngineInfo: EnvEngineInfoType;
packageInfo: EnginePackage;
}[]
> {
// .envのデフォルトエンジン情報のうち、downloadVvppなものを集める
const targetInfos = [];
for (const envEngineInfo of loadEnvEngineInfos()) {
if (envEngineInfo.type != "downloadVvpp") {
continue;
}

// 更新情報を取得
const latestUrl = envEngineInfo.latestUrl;
if (latestUrl == undefined) throw new Error("latestUrl is undefined");

const latestInfo = await fetchLatestDefaultEngineInfo(latestUrl);
if (latestInfo.formatVersion != 1) {
log.error(`Unsupported format version: ${latestInfo.formatVersion}`);
continue;
}

const packageInfo = getSuitablePackage(latestInfo);
log.info(`Latest default engine version: ${packageInfo.version}`);

// インストール済みだった場合はスキップ
// FIXME: より新しいバージョンであれば更新する
if (this.engineInfoManager.hasEngineInfo(envEngineInfo.uuid)) {
log.info(`Default engine ${envEngineInfo.uuid} is already installed.`);

// vvppとしてインストールされていない場合は警告を出す
const engineInfo = this.engineInfoManager.fetchEngineInfo(
envEngineInfo.uuid,
);
if (engineInfo.type != "vvpp") {
log.warn(
`Default engine ${envEngineInfo.uuid} is already installed as "${engineInfo.type}", not "vvpp"`,
);
}
continue;
}

targetInfos.push({
envEngineInfo,
packageInfo,
});
}

return targetInfos;
}

/** VVPPパッケージをダウンロードし、インストールする */
async downloadAndInstallVvppEngine(
downloadDir: string,
packageInfo: EnginePackage,
) {
// ダウンロード
const downloadedPaths = new Array<string>(packageInfo.packages.length);
await Promise.all(
packageInfo.packages.map(async (p, index) => {
const { url, name, size } = p;

log.info(`Download ${name} from ${url}, size: ${size}`);
const res = await fetch(url);
const buffer = await res.arrayBuffer();

const downloadPath = path.join(downloadDir, name);
await fs.promises.writeFile(downloadPath, Buffer.from(buffer));
log.info(`Downloaded ${name} to ${downloadPath}`);

downloadedPaths[index] = downloadPath;

// TODO: ハッシュチェック
}),
);

// インストール
await this.installVvppEngine(downloadedPaths[0]);

// ダウンロードしたファイルを削除
await Promise.all(
downloadedPaths.map(async (path) => {
log.info(`Delete downloaded file: ${path}`);
await fs.promises.unlink(path);
}),
);
}

/** エンジンの設定を更新し、保存する */
updateEngineSetting(engineId: EngineId, engineSetting: EngineSettingType) {
const engineSettings = this.configManager.get("engineSettings");
Expand Down
25 changes: 25 additions & 0 deletions src/backend/electron/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -939,6 +939,31 @@ app.on("ready", async () => {
}
}

// VVPPがデフォルトエンジンに指定されていたらインストールする
// NOTE: 工事中。参照: https://github.com/VOICEVOX/voicevox/issues/1194
const engineAndPackageInfosToInstall =
await engineAndVvppController.fetchEngineAndPackageInfosToInstall();
for (const { envEngineInfo, packageInfo } of engineAndPackageInfosToInstall) {
// インストールするか確認
// FIXME: 案内文をよりユーザーフレンドリーにする
const result = dialog.showMessageBoxSync(win, {
type: "info",
title: "デフォルトエンジンのインストール",
message: `デフォルトエンジン ${envEngineInfo.name} をインストールしますか?`,
buttons: ["インストール", "キャンセル"],
cancelId: 1,
});
if (result == 1) {
continue;
}

// ダウンロードしてインストールする
await engineAndVvppController.downloadAndInstallVvppEngine(
app.getPath("downloads"),
packageInfo,
);
}

// runEngineAllの前にVVPPを読み込む
let filePath: string | undefined;
if (process.platform === "darwin") {
Expand Down
Loading
Loading