diff --git "a/docs/\343\202\250\343\203\263\343\202\270\343\203\263\345\221\250\343\202\212\343\201\253\343\201\244\343\201\204\343\201\246.md" "b/docs/\343\202\250\343\203\263\343\202\270\343\203\263\345\221\250\343\202\212\343\201\253\343\201\244\343\201\204\343\201\246.md" new file mode 100644 index 0000000000..8283a2ed37 --- /dev/null +++ "b/docs/\343\202\250\343\203\263\343\202\270\343\203\263\345\221\250\343\202\212\343\201\253\343\201\244\343\201\204\343\201\246.md" @@ -0,0 +1,84 @@ +# エンジン周りについて + +VOICEVOXはマルチエンジン機能を介して複数のVOICEVOX AIP準拠エンジンを扱うことができます。 +それ以外にも多様な概念が存在するため、ここでまとめてドキュメント化しています。 + +## 用語説明 + +| 用語 | 説明 | +| ------------------------- | -------------------------------------------------------------------------------------------- | +| VOICEVOX API 準拠エンジン | VOICEVOX API に準拠したエンジンのこと。 | +| マルチエンジン | エディタ内で複数のエンジンを扱う機能のこと。 | +| デフォルトエンジン | エディタに付属しているエンジンのこと。
デフォルトエンジンがないとエディタが起動しない。 | +| VVPP | VOICEVOXにインストールできるエンジンのパッケージファイル。
エンジンやエンジン情報を含む。 | + +## マルチエンジン + +エンジンの追加は VVPP ファイルをインストールする形と、エンジンディレクトリのパスを指定する形があります。 + +| | VVPP | パス | +| -------------------- | ------------------------------------ | ----------------------------------- | +| `EngineInfo`の`type` | `"vvpp"` | `"path"` | +| 追加時の処理 | zipファイルを所定のフォルダに展開 | エンジンのパスを`config.json`に保存 | +| 読み込み時の処理 | 所定のフォルダ内にあるものを読む | `config.json`に保存されたパスを読む | +| 削除時の処理 | 所定のフォルダ内のディレクトリを削除 | `config.json`からパスを削除 | + +## デフォルトエンジンの更新情報 + +デフォルトエンジンの更新情報をjson形式で管理しています。 +更新情報には最新のパッケージ(VVPP・VVPPPファイル)のURLやバージョンなどを記載しています。 +パッケージの情報はOS・アーキテクチャ・デバイスごとに分けています。 + +ファイルフォーマットは以下の通りです。 + +```JSONC +{ + //[number] ファイル構造バージョン(仕様変更毎にインクリメントされる) + "formatVersion": 1, + + // Windowsの情報 + "windows": { + "x64": { + "CPU": { + //[string] バージョン + "version": "x.x.x", + + // vvppやvvpppの情報 + "packages": [ + { + //[string] ダウンロードURL + "url": "https://example.com/example.vvpp", + + //[string] ファイル名 + "name": "example.vvpp", + + //[number] バイト数 + "size": 123456, + + //[string(Optional)] ハッシュ値 + "hash": "xxxxxxx", + }, + //... + ] + }, + "GPU/CPU": { /* 同上 */ } + } + }, + + "macos": { + "x64": { + "CPU": { /* 同上 */ } + }, + "arm64": { + "CPU": { /* 同上 */ } + } + }, + + "linux": { + "x64": { + "CPU": { /* 同上 */ }, + "GPU/CPU": { /* 同上 */ } + } + } +} +``` diff --git "a/docs/\347\264\260\343\201\213\343\201\204\350\250\255\350\250\210\346\226\271\351\207\235.md" "b/docs/\347\264\260\343\201\213\343\201\204\350\250\255\350\250\210\346\226\271\351\207\235.md" index 5647b95a5d..3c999d57b6 100644 --- "a/docs/\347\264\260\343\201\213\343\201\204\350\250\255\350\250\210\346\226\271\351\207\235.md" +++ "b/docs/\347\264\260\343\201\213\343\201\204\350\250\255\350\250\210\346\226\271\351\207\235.md" @@ -38,74 +38,3 @@ export const hogeFugaSchema = z.object({ export type HogeFugaType = z.infer; ``` - -## マルチエンジン - -エンジンの追加は VVPP ファイルをインストールする形と、エンジンディレクトリのパスを指定する形があります。 - -| | VVPP | パス | -| -------------------- | ------------------------------------ | ----------------------------------- | -| `EngineInfo`の`type` | `"vvpp"` | `"path"` | -| 追加時の処理 | zipファイルを所定のフォルダに展開 | エンジンのパスを`config.json`に保存 | -| 読み込み時の処理 | 所定のフォルダ内にあるものを読む | `config.json`に保存されたパスを読む | -| 削除時の処理 | 所定のフォルダ内のディレクトリを削除 | `config.json`からパスを削除 | - -## デフォルトエンジンの更新情報 - -デフォルトエンジンの更新情報をjson形式で管理しています。 -更新情報には最新のパッケージ(VVPP・VVPPPファイル)のURLやバージョンなどを記載しています。 -パッケージの情報はOS・アーキテクチャ・デバイスごとに分けています。 - -ファイルフォーマットは以下の通りです。 - -```JSONC -{ - //[number] ファイル構造バージョン(仕様変更毎にインクリメントされる) - "formatVersion": 1, - - // Windowsの情報 - "windows": { - "x64": { - "CPU": { - //[string] バージョン - "version": "x.x.x", - - // vvppやvvpppの情報 - "packages": [ - { - //[string] ダウンロードURL - "url": "https://example.com/example.vvpp", - - //[string] ファイル名 - "name": "example.vvpp", - - //[number] バイト数 - "size": 123456, - - //[string(Optional)] ハッシュ値 - "hash": "xxxxxxx", - }, - //... - ] - }, - "GPU/CPU": { /* 同上 */ } - } - }, - - "macos": { - "x64": { - "CPU": { /* 同上 */ } - }, - "arm64": { - "CPU": { /* 同上 */ } - } - }, - - "linux": { - "x64": { - "CPU": { /* 同上 */ }, - "GPU/CPU": { /* 同上 */ } - } - } -} -``` diff --git a/src/backend/common/envEngineInfoSchema.ts b/src/backend/common/envEngineInfoSchema.ts new file mode 100644 index 0000000000..3a9f3b91ad --- /dev/null +++ b/src/backend/common/envEngineInfoSchema.ts @@ -0,0 +1,16 @@ +import { z } from "zod"; + +import { engineIdSchema } from "@/type/preload"; + +/** .envに書くエンジン情報のスキーマ */ +export const envEngineInfoSchema = z.object({ + uuid: engineIdSchema, + host: z.string(), + name: z.string(), + executionEnabled: z.boolean(), + executionFilePath: z.string(), + executionArgs: z.array(z.string()), + path: z.string().optional(), // FIXME: typeがpathのときは必須 + type: z.union([z.literal("path"), z.literal("vvpp")]).default("path"), + latestDefaultEngineInfosUrl: z.string().optional(), // FIXME: typeがvvppのときは必須 +}); diff --git a/src/backend/electron/manager/engineManager.ts b/src/backend/electron/manager/engineManager.ts index 6c32171316..daae2b9ad7 100644 --- a/src/backend/electron/manager/engineManager.ts +++ b/src/backend/electron/manager/engineManager.ts @@ -39,6 +39,13 @@ function createDefaultEngineInfos(defaultEngineDir: string): EngineInfo[] { const defaultEngineInfosEnv = import.meta.env.VITE_DEFAULT_ENGINE_INFOS ?? "[]"; + /* + 先リファクタリング入れたほうが良いかも。 + 2. エンジン情報マネージャーとエンジンプロセスマネージャーを分ける? + 3. ついでにelectronへの依存をなくしてもよい + 4. .envの情報から、エラー情報を返す関数作っても良いかも、あとでも良いかも(エンジンが見つからないとか、vvppが未インストールとか) + */ + const envSchema = envEngineInfoSchema.array(); const engines = envSchema.parse(JSON.parse(defaultEngineInfosEnv)); diff --git a/src/type/preload.ts b/src/type/preload.ts index 6b0d7e6826..d925f0f7af 100644 --- a/src/type/preload.ts +++ b/src/type/preload.ts @@ -700,17 +700,6 @@ export const configSchema = z .merge(rootMiscSettingSchema); export type ConfigType = z.infer; -export const envEngineInfoSchema = z.object({ - uuid: engineIdSchema, - host: z.string(), - name: z.string(), - executionEnabled: z.boolean(), - executionFilePath: z.string(), - executionArgs: z.array(z.string()), - path: z.string().optional(), -}); -export type EnvEngineInfoType = z.infer; - // workaround. SystemError(https://nodejs.org/api/errors.html#class-systemerror)が2022/05/19時点ではNodeJSの型定義に記述されていないためこれを追加しています。 export class SystemError extends Error { code?: string | undefined;