@kajidog/voicevox-client 0.4.1 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +14 -14
- package/dist/accent-utils.d.ts +93 -0
- package/dist/accent-utils.d.ts.map +1 -0
- package/dist/accent-utils.js +211 -0
- package/dist/accent-utils.js.map +1 -0
- package/dist/api.d.ts +40 -2
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +90 -0
- package/dist/api.js.map +1 -1
- package/dist/cache-policy.d.ts +21 -0
- package/dist/cache-policy.d.ts.map +1 -0
- package/dist/cache-policy.js +31 -0
- package/dist/cache-policy.js.map +1 -0
- package/dist/client.d.ts +28 -119
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +48 -417
- package/dist/client.js.map +1 -1
- package/dist/effect/config.d.ts +43 -0
- package/dist/effect/config.d.ts.map +1 -0
- package/dist/effect/config.js +45 -0
- package/dist/effect/config.js.map +1 -0
- package/dist/effect/context.d.ts +33 -0
- package/dist/effect/context.d.ts.map +1 -0
- package/dist/effect/context.js +10 -0
- package/dist/effect/context.js.map +1 -0
- package/dist/effect/errors.d.ts +130 -0
- package/dist/effect/errors.d.ts.map +1 -0
- package/dist/effect/errors.js +121 -0
- package/dist/effect/errors.js.map +1 -0
- package/dist/effect/index.d.ts +34 -0
- package/dist/effect/index.d.ts.map +1 -0
- package/dist/effect/index.js +67 -0
- package/dist/effect/index.js.map +1 -0
- package/dist/effect/queue-manager.d.ts +34 -0
- package/dist/effect/queue-manager.d.ts.map +1 -0
- package/dist/effect/queue-manager.js +59 -0
- package/dist/effect/queue-manager.js.map +1 -0
- package/dist/effect/services/api-service.d.ts +58 -0
- package/dist/effect/services/api-service.d.ts.map +1 -0
- package/dist/effect/services/api-service.js +90 -0
- package/dist/effect/services/api-service.js.map +1 -0
- package/dist/effect/services/audio-generator-service.d.ts +78 -0
- package/dist/effect/services/audio-generator-service.d.ts.map +1 -0
- package/dist/effect/services/audio-generator-service.js +187 -0
- package/dist/effect/services/audio-generator-service.js.map +1 -0
- package/dist/effect/services/audio-player-service.d.ts +101 -0
- package/dist/effect/services/audio-player-service.d.ts.map +1 -0
- package/dist/effect/services/audio-player-service.js +297 -0
- package/dist/effect/services/audio-player-service.js.map +1 -0
- package/dist/effect/services/event-manager-service.d.ts +96 -0
- package/dist/effect/services/event-manager-service.d.ts.map +1 -0
- package/dist/effect/services/event-manager-service.js +208 -0
- package/dist/effect/services/event-manager-service.js.map +1 -0
- package/dist/effect/services/file-manager-service.d.ts +91 -0
- package/dist/effect/services/file-manager-service.d.ts.map +1 -0
- package/dist/effect/services/file-manager-service.js +215 -0
- package/dist/effect/services/file-manager-service.js.map +1 -0
- package/dist/effect/utils.d.ts +118 -0
- package/dist/effect/utils.d.ts.map +1 -0
- package/dist/effect/utils.js +186 -0
- package/dist/effect/utils.js.map +1 -0
- package/dist/error.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/playback/node-playback-strategy.d.ts.map +1 -1
- package/dist/playback/node-playback-strategy.js +2 -6
- package/dist/playback/node-playback-strategy.js.map +1 -1
- package/dist/player.d.ts +110 -0
- package/dist/player.d.ts.map +1 -0
- package/dist/player.js +183 -0
- package/dist/player.js.map +1 -0
- package/dist/queue/audio-player.d.ts +44 -0
- package/dist/queue/audio-player.d.ts.map +1 -0
- package/dist/queue/audio-player.js +344 -0
- package/dist/queue/audio-player.js.map +1 -0
- package/dist/queue/file-manager.js +9 -9
- package/dist/queue/file-manager.js.map +1 -1
- package/dist/queue/manager.d.ts +134 -0
- package/dist/queue/manager.d.ts.map +1 -0
- package/dist/queue/manager.js +564 -0
- package/dist/queue/manager.js.map +1 -0
- package/dist/queue/queue-service.d.ts.map +1 -1
- package/dist/queue/queue-service.js +20 -6
- package/dist/queue/queue-service.js.map +1 -1
- package/dist/queue/types.d.ts +3 -1
- package/dist/queue/types.d.ts.map +1 -1
- package/dist/queue/types.js.map +1 -1
- package/dist/services/dictionary-service.d.ts +35 -0
- package/dist/services/dictionary-service.d.ts.map +1 -0
- package/dist/services/dictionary-service.js +188 -0
- package/dist/services/dictionary-service.js.map +1 -0
- package/dist/services/speech-service.d.ts +43 -0
- package/dist/services/speech-service.d.ts.map +1 -0
- package/dist/services/speech-service.js +236 -0
- package/dist/services/speech-service.js.map +1 -0
- package/dist/shared-queue-manager.d.ts +119 -0
- package/dist/shared-queue-manager.d.ts.map +1 -0
- package/dist/shared-queue-manager.js +487 -0
- package/dist/shared-queue-manager.js.map +1 -0
- package/dist/state/queue-state-machine.d.ts.map +1 -1
- package/dist/state/queue-state-machine.js +13 -0
- package/dist/state/queue-state-machine.js.map +1 -1
- package/dist/state/types.d.ts +2 -0
- package/dist/state/types.d.ts.map +1 -1
- package/dist/state/types.js.map +1 -1
- package/dist/types.d.ts +28 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils.d.ts +16 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +36 -0
- package/dist/utils.js.map +1 -1
- package/package.json +1 -1
package/LICENSE
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
ISC License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2024 kajidog
|
|
4
|
-
|
|
5
|
-
Permission to use, copy, modify, and/or distribute this software for any
|
|
6
|
-
purpose with or without fee is hereby granted, provided that the above
|
|
7
|
-
copyright notice and this permission notice appear in all copies.
|
|
8
|
-
|
|
9
|
-
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
10
|
-
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
11
|
-
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
12
|
-
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
13
|
-
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
14
|
-
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
1
|
+
ISC License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024 kajidog
|
|
4
|
+
|
|
5
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
|
6
|
+
purpose with or without fee is hereby granted, provided that the above
|
|
7
|
+
copyright notice and this permission notice appear in all copies.
|
|
8
|
+
|
|
9
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
10
|
+
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
11
|
+
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
12
|
+
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
13
|
+
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
14
|
+
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
15
15
|
PERFORMANCE OF THIS SOFTWARE.
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import type { AccentPhrase, Mora } from './types.js';
|
|
2
|
+
// ---------------------------------------------------------------------------
|
|
3
|
+
// phrase-utils: AccentPhrase 操作
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
/**
|
|
6
|
+
* AccentPhrase[] から AI 向けの簡略フレーズ配列を生成。
|
|
7
|
+
* 各 AccentPhrase の mora.text を連結してフレーズテキストを作り、
|
|
8
|
+
* accent 位置はそのまま返す。
|
|
9
|
+
*/
|
|
10
|
+
export declare function accentPhrasesToSimplifiedPhrases(accentPhrases: AccentPhrase[]): Array<{
|
|
11
|
+
text: string;
|
|
12
|
+
accent: number;
|
|
13
|
+
}>;
|
|
14
|
+
/**
|
|
15
|
+
* accent 数値配列を既存の AccentPhrase[] にマージする。
|
|
16
|
+
* インデックスで照合し、accent 値のみ更新する。
|
|
17
|
+
* accents が既存より少ない場合は残りはそのまま、多い場合は無視する。
|
|
18
|
+
*/
|
|
19
|
+
export declare function applyAccentsToAccentPhrases(existing: AccentPhrase[], accents: number[]): AccentPhrase[];
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
// インライン表記方式
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
export interface ParsedPhrase {
|
|
24
|
+
cleanText: string;
|
|
25
|
+
bracketCharIndex: number | null;
|
|
26
|
+
bracketLength: number;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* AccentPhrase[] → インライン表記文字列に変換。
|
|
30
|
+
* 例: "コン[ニ]チワ,セ[カ]イ"
|
|
31
|
+
* accent === 0 (平板型) → [] なし
|
|
32
|
+
*/
|
|
33
|
+
export declare function accentPhrasesToNotation(accentPhrases: AccentPhrase[]): string;
|
|
34
|
+
/**
|
|
35
|
+
* インライン表記文字列 → ParsedPhrase[] にパース。
|
|
36
|
+
* 例: "コン[ニ]チワ,セカイ" → [{cleanText:"コンニチワ", bracketCharIndex:2, bracketLength:1}, ...]
|
|
37
|
+
*/
|
|
38
|
+
export declare function parseNotation(notation: string): ParsedPhrase[];
|
|
39
|
+
/**
|
|
40
|
+
* VOICEVOXのモーラ配列内で bracketCharIndex に該当するモーラの accent 値(1-based)を返す。
|
|
41
|
+
* bracketLength がモーラの text.length と一致することを検証する。
|
|
42
|
+
*/
|
|
43
|
+
export declare function resolveAccentFromMoras(moras: Mora[], bracketCharIndex: number, bracketLength: number): number;
|
|
44
|
+
/**
|
|
45
|
+
* ParsedPhrase[] のアクセント指定を AccentPhrase[] に適用する。
|
|
46
|
+
* 左から1:1で対応。数が合わない場合、余分は無視/デフォルト維持。
|
|
47
|
+
*
|
|
48
|
+
* bracketCharIndex === null([] 省略)のフレーズ:
|
|
49
|
+
* - defaultAccentPhrases が渡された場合 → そのアクセント値(VOICEVOX自動判定)を使用
|
|
50
|
+
* - defaultAccentPhrases が未指定の場合 → accentPhrases のアクセント値をそのまま維持
|
|
51
|
+
*/
|
|
52
|
+
export declare function applyNotationAccents(parsedPhrases: ParsedPhrase[], accentPhrases: AccentPhrase[], defaultAccentPhrases?: AccentPhrase[]): AccentPhrase[];
|
|
53
|
+
// ---------------------------------------------------------------------------
|
|
54
|
+
// dictionary-utils: 辞書ユーティリティ
|
|
55
|
+
// ---------------------------------------------------------------------------
|
|
56
|
+
export declare function isKatakana(input: string): boolean;
|
|
57
|
+
/**
|
|
58
|
+
* カタカナ文字列をモーラ単位に分割する。
|
|
59
|
+
* 拗音(ャュョ等)や小書き文字は前の文字と結合して1モーラとする。
|
|
60
|
+
* 長音符「ー」は独立した1モーラとして扱う。
|
|
61
|
+
*/
|
|
62
|
+
export declare function splitToMoras(katakana: string): string[];
|
|
63
|
+
export declare function estimateAccentType(pronunciation: string): number;
|
|
64
|
+
/**
|
|
65
|
+
* pronunciation と accentType からインライン表記を生成する。
|
|
66
|
+
* 例: insertAccentBrackets("ボイスボックス", 4) → "ボイスボッ[ク]ス"
|
|
67
|
+
* accentType === 0 (平板型) → [] なし
|
|
68
|
+
*/
|
|
69
|
+
export declare function insertAccentBrackets(pronunciation: string, accentType: number): string;
|
|
70
|
+
/**
|
|
71
|
+
* インライン表記 (例: "ボイス[ボッ]クス") をパースして
|
|
72
|
+
* pronunciation (純カタカナ) と accentType (1-based) を返す。
|
|
73
|
+
* `[]` 省略時は estimateAccentType で推定する。
|
|
74
|
+
*/
|
|
75
|
+
export declare function parseAccentNotation(notation: string): {
|
|
76
|
+
pronunciation: string;
|
|
77
|
+
accentType: number;
|
|
78
|
+
};
|
|
79
|
+
export interface NormalizedDictionaryWord {
|
|
80
|
+
wordUuid: string;
|
|
81
|
+
surface: string;
|
|
82
|
+
pronunciation: string;
|
|
83
|
+
accentType: number;
|
|
84
|
+
notation: string;
|
|
85
|
+
priority: number;
|
|
86
|
+
}
|
|
87
|
+
export declare function normalizeUserDictionaryWords(dictionary: Record<string, {
|
|
88
|
+
surface: string;
|
|
89
|
+
pronunciation: string;
|
|
90
|
+
accent_type: number;
|
|
91
|
+
priority: number;
|
|
92
|
+
}>): NormalizedDictionaryWord[];
|
|
93
|
+
//# sourceMappingURL=accent-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accent-utils.d.ts","sourceRoot":"","sources":["../src/accent-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAEpD,8EAA8E;AAC9E,oCAAgC;AAChC,8EAA8E;AAE9E;;;;GAIG;AACH,wBAAgB,gCAAgC,CAC9C,aAAa,EAAE,YAAY,EAAE,GAC5B,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAKzC;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,YAAY,EAAE,CAOvG;AAED,8EAA8E;AAC9E,8BAAY;AACZ,8EAA8E;AAE9E,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAA;IACjB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,aAAa,EAAE,MAAM,CAAA;CACtB;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,aAAa,EAAE,YAAY,EAAE,GAAG,MAAM,CAe7E;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,EAAE,CA8C9D;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,gBAAgB,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAiB7G;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,aAAa,EAAE,YAAY,EAAE,EAC7B,aAAa,EAAE,YAAY,EAAE,EAC7B,oBAAoB,CAAC,EAAE,YAAY,EAAE,GACpC,YAAY,EAAE,CAahB;AAED,8EAA8E;AAC9E,gDAA8B;AAC9B,8EAA8E;AAE9E,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEjD;AAID;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAWvD;AAED,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAKtF;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAwBnG;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,aAAa,EAAE,MAAM,CAAA;IACrB,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,wBAAgB,4BAA4B,CAC1C,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,GAC5G,wBAAwB,EAAE,CAS5B"}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// phrase-utils: AccentPhrase 操作
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
/**
|
|
5
|
+
* AccentPhrase[] から AI 向けの簡略フレーズ配列を生成。
|
|
6
|
+
* 各 AccentPhrase の mora.text を連結してフレーズテキストを作り、
|
|
7
|
+
* accent 位置はそのまま返す。
|
|
8
|
+
*/
|
|
9
|
+
export function accentPhrasesToSimplifiedPhrases(accentPhrases) {
|
|
10
|
+
return accentPhrases.map((phrase) => ({
|
|
11
|
+
text: phrase.moras.map((m) => m.text).join(''),
|
|
12
|
+
accent: phrase.accent,
|
|
13
|
+
}));
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* accent 数値配列を既存の AccentPhrase[] にマージする。
|
|
17
|
+
* インデックスで照合し、accent 値のみ更新する。
|
|
18
|
+
* accents が既存より少ない場合は残りはそのまま、多い場合は無視する。
|
|
19
|
+
*/
|
|
20
|
+
export function applyAccentsToAccentPhrases(existing, accents) {
|
|
21
|
+
return existing.map((phrase, i) => {
|
|
22
|
+
if (i < accents.length) {
|
|
23
|
+
return { ...phrase, accent: accents[i] };
|
|
24
|
+
}
|
|
25
|
+
return phrase;
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* AccentPhrase[] → インライン表記文字列に変換。
|
|
30
|
+
* 例: "コン[ニ]チワ,セ[カ]イ"
|
|
31
|
+
* accent === 0 (平板型) → [] なし
|
|
32
|
+
*/
|
|
33
|
+
export function accentPhrasesToNotation(accentPhrases) {
|
|
34
|
+
return accentPhrases
|
|
35
|
+
.map((phrase) => {
|
|
36
|
+
const moraTexts = phrase.moras.map((m) => m.text);
|
|
37
|
+
if (phrase.accent === 0) {
|
|
38
|
+
return moraTexts.join('');
|
|
39
|
+
}
|
|
40
|
+
return moraTexts
|
|
41
|
+
.map((t, i) => {
|
|
42
|
+
const moraIndex = i + 1; // 1-based
|
|
43
|
+
return moraIndex === phrase.accent ? `[${t}]` : t;
|
|
44
|
+
})
|
|
45
|
+
.join('');
|
|
46
|
+
})
|
|
47
|
+
.join(',');
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* インライン表記文字列 → ParsedPhrase[] にパース。
|
|
51
|
+
* 例: "コン[ニ]チワ,セカイ" → [{cleanText:"コンニチワ", bracketCharIndex:2, bracketLength:1}, ...]
|
|
52
|
+
*/
|
|
53
|
+
export function parseNotation(notation) {
|
|
54
|
+
if (!notation.trim())
|
|
55
|
+
return [];
|
|
56
|
+
const rawPhrases = notation.split(',');
|
|
57
|
+
const result = [];
|
|
58
|
+
for (const raw of rawPhrases) {
|
|
59
|
+
const trimmed = raw.trim();
|
|
60
|
+
if (!trimmed)
|
|
61
|
+
continue;
|
|
62
|
+
// バリデーション: 予約文字チェック(ネスト、不正な括弧)
|
|
63
|
+
const openCount = (trimmed.match(/\[/g) || []).length;
|
|
64
|
+
const closeCount = (trimmed.match(/\]/g) || []).length;
|
|
65
|
+
if (openCount > 1) {
|
|
66
|
+
throw new Error(`Invalid notation: multiple '[' in phrase "${trimmed}"`);
|
|
67
|
+
}
|
|
68
|
+
if (openCount !== closeCount) {
|
|
69
|
+
throw new Error(`Invalid notation: mismatched brackets in phrase "${trimmed}"`);
|
|
70
|
+
}
|
|
71
|
+
if (openCount === 0) {
|
|
72
|
+
result.push({ cleanText: trimmed, bracketCharIndex: null, bracketLength: 0 });
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
// [ ] の位置を検出
|
|
76
|
+
const openIdx = trimmed.indexOf('[');
|
|
77
|
+
const closeIdx = trimmed.indexOf(']');
|
|
78
|
+
if (closeIdx < openIdx) {
|
|
79
|
+
throw new Error(`Invalid notation: ']' before '[' in phrase "${trimmed}"`);
|
|
80
|
+
}
|
|
81
|
+
const bracketContent = trimmed.substring(openIdx + 1, closeIdx);
|
|
82
|
+
if (bracketContent.length === 0) {
|
|
83
|
+
throw new Error(`Invalid notation: empty brackets in phrase "${trimmed}"`);
|
|
84
|
+
}
|
|
85
|
+
const cleanText = trimmed.substring(0, openIdx) + bracketContent + trimmed.substring(closeIdx + 1);
|
|
86
|
+
const bracketCharIndex = openIdx;
|
|
87
|
+
result.push({ cleanText, bracketCharIndex, bracketLength: bracketContent.length });
|
|
88
|
+
}
|
|
89
|
+
return result;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* VOICEVOXのモーラ配列内で bracketCharIndex に該当するモーラの accent 値(1-based)を返す。
|
|
93
|
+
* bracketLength がモーラの text.length と一致することを検証する。
|
|
94
|
+
*/
|
|
95
|
+
export function resolveAccentFromMoras(moras, bracketCharIndex, bracketLength) {
|
|
96
|
+
let charPos = 0;
|
|
97
|
+
for (let i = 0; i < moras.length; i++) {
|
|
98
|
+
const mora = moras[i];
|
|
99
|
+
if (charPos === bracketCharIndex) {
|
|
100
|
+
if (mora.text.length !== bracketLength) {
|
|
101
|
+
throw new Error(`Bracket content length (${bracketLength}) does not match mora text length (${mora.text.length}) at mora "${mora.text}". Brackets must enclose exactly one mora.`);
|
|
102
|
+
}
|
|
103
|
+
return i + 1; // 1-based
|
|
104
|
+
}
|
|
105
|
+
charPos += mora.text.length;
|
|
106
|
+
}
|
|
107
|
+
throw new Error(`Bracket position ${bracketCharIndex} does not align with any mora boundary. Check that brackets enclose exactly one mora.`);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* ParsedPhrase[] のアクセント指定を AccentPhrase[] に適用する。
|
|
111
|
+
* 左から1:1で対応。数が合わない場合、余分は無視/デフォルト維持。
|
|
112
|
+
*
|
|
113
|
+
* bracketCharIndex === null([] 省略)のフレーズ:
|
|
114
|
+
* - defaultAccentPhrases が渡された場合 → そのアクセント値(VOICEVOX自動判定)を使用
|
|
115
|
+
* - defaultAccentPhrases が未指定の場合 → accentPhrases のアクセント値をそのまま維持
|
|
116
|
+
*/
|
|
117
|
+
export function applyNotationAccents(parsedPhrases, accentPhrases, defaultAccentPhrases) {
|
|
118
|
+
return accentPhrases.map((phrase, i) => {
|
|
119
|
+
if (i >= parsedPhrases.length)
|
|
120
|
+
return phrase;
|
|
121
|
+
const parsed = parsedPhrases[i];
|
|
122
|
+
if (parsed.bracketCharIndex === null) {
|
|
123
|
+
if (defaultAccentPhrases && i < defaultAccentPhrases.length) {
|
|
124
|
+
return { ...phrase, accent: defaultAccentPhrases[i].accent };
|
|
125
|
+
}
|
|
126
|
+
return phrase;
|
|
127
|
+
}
|
|
128
|
+
const newAccent = resolveAccentFromMoras(phrase.moras, parsed.bracketCharIndex, parsed.bracketLength);
|
|
129
|
+
return { ...phrase, accent: newAccent };
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
// ---------------------------------------------------------------------------
|
|
133
|
+
// dictionary-utils: 辞書ユーティリティ
|
|
134
|
+
// ---------------------------------------------------------------------------
|
|
135
|
+
export function isKatakana(input) {
|
|
136
|
+
return /^[ァ-ヶー]+$/.test(input);
|
|
137
|
+
}
|
|
138
|
+
const SMALL_KANA = new Set(['ャ', 'ュ', 'ョ', 'ァ', 'ィ', 'ゥ', 'ェ', 'ォ', 'ヮ']);
|
|
139
|
+
/**
|
|
140
|
+
* カタカナ文字列をモーラ単位に分割する。
|
|
141
|
+
* 拗音(ャュョ等)や小書き文字は前の文字と結合して1モーラとする。
|
|
142
|
+
* 長音符「ー」は独立した1モーラとして扱う。
|
|
143
|
+
*/
|
|
144
|
+
export function splitToMoras(katakana) {
|
|
145
|
+
const moras = [];
|
|
146
|
+
for (let i = 0; i < katakana.length; i++) {
|
|
147
|
+
const char = katakana[i];
|
|
148
|
+
if (SMALL_KANA.has(char) && moras.length > 0) {
|
|
149
|
+
moras[moras.length - 1] += char;
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
moras.push(char);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return moras;
|
|
156
|
+
}
|
|
157
|
+
export function estimateAccentType(pronunciation) {
|
|
158
|
+
return Math.max(1, splitToMoras(pronunciation).length);
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* pronunciation と accentType からインライン表記を生成する。
|
|
162
|
+
* 例: insertAccentBrackets("ボイスボックス", 4) → "ボイスボッ[ク]ス"
|
|
163
|
+
* accentType === 0 (平板型) → [] なし
|
|
164
|
+
*/
|
|
165
|
+
export function insertAccentBrackets(pronunciation, accentType) {
|
|
166
|
+
if (accentType === 0)
|
|
167
|
+
return pronunciation;
|
|
168
|
+
const moras = splitToMoras(pronunciation);
|
|
169
|
+
if (accentType < 1 || accentType > moras.length)
|
|
170
|
+
return pronunciation;
|
|
171
|
+
return moras.map((m, i) => (i + 1 === accentType ? `[${m}]` : m)).join('');
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* インライン表記 (例: "ボイス[ボッ]クス") をパースして
|
|
175
|
+
* pronunciation (純カタカナ) と accentType (1-based) を返す。
|
|
176
|
+
* `[]` 省略時は estimateAccentType で推定する。
|
|
177
|
+
*/
|
|
178
|
+
export function parseAccentNotation(notation) {
|
|
179
|
+
const parsed = parseNotation(notation);
|
|
180
|
+
if (parsed.length !== 1) {
|
|
181
|
+
throw new Error(`Expected single phrase, got ${parsed.length}. Do not use commas in pronunciation.`);
|
|
182
|
+
}
|
|
183
|
+
const { cleanText, bracketCharIndex, bracketLength } = parsed[0];
|
|
184
|
+
if (bracketCharIndex === null) {
|
|
185
|
+
return { pronunciation: cleanText, accentType: estimateAccentType(cleanText) };
|
|
186
|
+
}
|
|
187
|
+
// bracketCharIndex は文字位置 → モーラ位置に変換
|
|
188
|
+
const moras = splitToMoras(cleanText);
|
|
189
|
+
let charPos = 0;
|
|
190
|
+
for (let i = 0; i < moras.length; i++) {
|
|
191
|
+
if (charPos === bracketCharIndex) {
|
|
192
|
+
if (moras[i].length !== bracketLength) {
|
|
193
|
+
throw new Error(`Bracket content length (${bracketLength}) does not match mora "${moras[i]}" length (${moras[i].length}). Brackets must enclose exactly one mora.`);
|
|
194
|
+
}
|
|
195
|
+
return { pronunciation: cleanText, accentType: i + 1 };
|
|
196
|
+
}
|
|
197
|
+
charPos += moras[i].length;
|
|
198
|
+
}
|
|
199
|
+
throw new Error('Bracket position does not align with any mora boundary.');
|
|
200
|
+
}
|
|
201
|
+
export function normalizeUserDictionaryWords(dictionary) {
|
|
202
|
+
return Object.entries(dictionary).map(([wordUuid, word]) => ({
|
|
203
|
+
wordUuid,
|
|
204
|
+
surface: word.surface,
|
|
205
|
+
pronunciation: word.pronunciation,
|
|
206
|
+
accentType: word.accent_type,
|
|
207
|
+
notation: insertAccentBrackets(word.pronunciation, word.accent_type),
|
|
208
|
+
priority: word.priority,
|
|
209
|
+
}));
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=accent-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accent-utils.js","sourceRoot":"","sources":["../src/accent-utils.ts"],"names":[],"mappings":"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"}
|
package/dist/api.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AudioQuery, Speaker } from './types.js';
|
|
1
|
+
import type { AccentPhrase, AudioQuery, Speaker, SpeakerInfo, UserDictionaryWord } from './types.js';
|
|
2
2
|
export declare class VoicevoxApi {
|
|
3
3
|
private readonly baseUrl;
|
|
4
4
|
constructor(baseUrl: string);
|
|
@@ -21,7 +21,7 @@ export declare class VoicevoxApi {
|
|
|
21
21
|
/**
|
|
22
22
|
* スピーカーの情報を取得
|
|
23
23
|
*/
|
|
24
|
-
getSpeakerInfo(uuid: string): Promise<
|
|
24
|
+
getSpeakerInfo(uuid: string): Promise<SpeakerInfo>;
|
|
25
25
|
/**
|
|
26
26
|
* VOICEVOX Engine の接続状態をチェック
|
|
27
27
|
* @returns 接続情報(connected, version, url)
|
|
@@ -31,6 +31,44 @@ export declare class VoicevoxApi {
|
|
|
31
31
|
version?: string;
|
|
32
32
|
url: string;
|
|
33
33
|
}>;
|
|
34
|
+
/**
|
|
35
|
+
* テキストからアクセント句を取得(audio_queryより軽量)
|
|
36
|
+
*/
|
|
37
|
+
getAccentPhrases(text: string, speaker?: number): Promise<AccentPhrase[]>;
|
|
38
|
+
/**
|
|
39
|
+
* アクセント句のモーラデータ(音素長・ピッチ)を再計算
|
|
40
|
+
* UIでアクセント位置(accent整数)を変更した後、mora.pitch値を更新するために使用
|
|
41
|
+
*/
|
|
42
|
+
updateMoraData(accentPhrases: AccentPhrase[], speaker: number): Promise<AccentPhrase[]>;
|
|
43
|
+
/**
|
|
44
|
+
* ユーザー辞書一覧を取得
|
|
45
|
+
*/
|
|
46
|
+
getUserDictionary(): Promise<Record<string, UserDictionaryWord>>;
|
|
47
|
+
/**
|
|
48
|
+
* ユーザー辞書単語を追加
|
|
49
|
+
*/
|
|
50
|
+
addUserDictionaryWord(input: {
|
|
51
|
+
surface: string;
|
|
52
|
+
pronunciation: string;
|
|
53
|
+
accentType: number;
|
|
54
|
+
priority: number;
|
|
55
|
+
wordType?: string;
|
|
56
|
+
}): Promise<void>;
|
|
57
|
+
/**
|
|
58
|
+
* ユーザー辞書単語を更新
|
|
59
|
+
*/
|
|
60
|
+
updateUserDictionaryWord(input: {
|
|
61
|
+
wordUuid: string;
|
|
62
|
+
surface: string;
|
|
63
|
+
pronunciation: string;
|
|
64
|
+
accentType: number;
|
|
65
|
+
priority: number;
|
|
66
|
+
wordType?: string;
|
|
67
|
+
}): Promise<void>;
|
|
68
|
+
/**
|
|
69
|
+
* ユーザー辞書単語を削除
|
|
70
|
+
*/
|
|
71
|
+
deleteUserDictionaryWord(wordUuid: string): Promise<void>;
|
|
34
72
|
private makeRequest;
|
|
35
73
|
/**
|
|
36
74
|
* URLの正規化
|
package/dist/api.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAEpG,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAQ;IAEhC,YAAY,OAAO,EAAE,MAAM,EAE1B;IAED;;OAEG;IACU,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,SAAI,GAAG,OAAO,CAAC,UAAU,CAAC,CAWzE;IAED;;OAEG;IACU,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,SAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CAe5E;IAED;;OAEG;IACU,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAkB9G;IAED;;OAEG;IACU,WAAW,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAW7C;IAED;;OAEG;IACU,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAW9D;IAED;;;OAGG;IACU,WAAW,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAezF;IAED;;OAEG;IACU,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,SAAI,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAShF;IAED;;;OAGG;IACU,cAAc,CAAC,aAAa,EAAE,YAAY,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAWnG;IAED;;OAEG;IACU,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAM5E;IAED;;OAEG;IACU,qBAAqB,CAAC,KAAK,EAAE;QACxC,OAAO,EAAE,MAAM,CAAA;QACf,aAAa,EAAE,MAAM,CAAA;QACrB,UAAU,EAAE,MAAM,CAAA;QAClB,QAAQ,EAAE,MAAM,CAAA;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;KAClB,GAAG,OAAO,CAAC,IAAI,CAAC,CAahB;IAED;;OAEG;IACU,wBAAwB,CAAC,KAAK,EAAE;QAC3C,QAAQ,EAAE,MAAM,CAAA;QAChB,OAAO,EAAE,MAAM,CAAA;QACf,aAAa,EAAE,MAAM,CAAA;QACrB,UAAU,EAAE,MAAM,CAAA;QAClB,QAAQ,EAAE,MAAM,CAAA;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;KAClB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBhB;IAED;;OAEG;IACU,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMrE;YAMa,WAAW;IAiDzB;;;OAGG;IACH,OAAO,CAAC,YAAY;CAGrB"}
|
package/dist/api.js
CHANGED
|
@@ -102,6 +102,90 @@ export class VoicevoxApi {
|
|
|
102
102
|
};
|
|
103
103
|
}
|
|
104
104
|
}
|
|
105
|
+
/**
|
|
106
|
+
* テキストからアクセント句を取得(audio_queryより軽量)
|
|
107
|
+
*/
|
|
108
|
+
async getAccentPhrases(text, speaker = 1) {
|
|
109
|
+
try {
|
|
110
|
+
const endpoint = `/accent_phrases?text=${encodeURIComponent(text)}&speaker=${encodeURIComponent(speaker.toString())}`;
|
|
111
|
+
return await this.makeRequest('post', endpoint, null, {
|
|
112
|
+
'Content-Type': 'application/json',
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
throw handleError('アクセント句取得中にエラーが発生しました', error);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* アクセント句のモーラデータ(音素長・ピッチ)を再計算
|
|
121
|
+
* UIでアクセント位置(accent整数)を変更した後、mora.pitch値を更新するために使用
|
|
122
|
+
*/
|
|
123
|
+
async updateMoraData(accentPhrases, speaker) {
|
|
124
|
+
try {
|
|
125
|
+
return await this.makeRequest('post', `/mora_data?speaker=${encodeURIComponent(speaker.toString())}`, accentPhrases, { 'Content-Type': 'application/json' });
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
throw handleError('モーラデータ更新中にエラーが発生しました', error);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* ユーザー辞書一覧を取得
|
|
133
|
+
*/
|
|
134
|
+
async getUserDictionary() {
|
|
135
|
+
try {
|
|
136
|
+
return await this.makeRequest('get', '/user_dict');
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
throw handleError('ユーザー辞書取得中にエラーが発生しました', error);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* ユーザー辞書単語を追加
|
|
144
|
+
*/
|
|
145
|
+
async addUserDictionaryWord(input) {
|
|
146
|
+
try {
|
|
147
|
+
const params = new URLSearchParams({
|
|
148
|
+
surface: input.surface,
|
|
149
|
+
pronunciation: input.pronunciation,
|
|
150
|
+
accent_type: input.accentType.toString(),
|
|
151
|
+
word_type: input.wordType ?? 'PROPER_NOUN',
|
|
152
|
+
priority: input.priority.toString(),
|
|
153
|
+
});
|
|
154
|
+
await this.makeRequest('post', `/user_dict_word?${params.toString()}`, null, {}, 'text');
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
throw handleError('ユーザー辞書追加中にエラーが発生しました', error);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* ユーザー辞書単語を更新
|
|
162
|
+
*/
|
|
163
|
+
async updateUserDictionaryWord(input) {
|
|
164
|
+
try {
|
|
165
|
+
const params = new URLSearchParams({
|
|
166
|
+
surface: input.surface,
|
|
167
|
+
pronunciation: input.pronunciation,
|
|
168
|
+
accent_type: input.accentType.toString(),
|
|
169
|
+
word_type: input.wordType ?? 'PROPER_NOUN',
|
|
170
|
+
priority: input.priority.toString(),
|
|
171
|
+
});
|
|
172
|
+
await this.makeRequest('put', `/user_dict_word/${encodeURIComponent(input.wordUuid)}?${params.toString()}`, null, {}, 'text');
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
throw handleError('ユーザー辞書更新中にエラーが発生しました', error);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* ユーザー辞書単語を削除
|
|
180
|
+
*/
|
|
181
|
+
async deleteUserDictionaryWord(wordUuid) {
|
|
182
|
+
try {
|
|
183
|
+
await this.makeRequest('delete', `/user_dict_word/${encodeURIComponent(wordUuid)}`, null, {}, 'text');
|
|
184
|
+
}
|
|
185
|
+
catch (error) {
|
|
186
|
+
throw handleError('ユーザー辞書削除中にエラーが発生しました', error);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
105
189
|
/**
|
|
106
190
|
* APIリクエストを実行
|
|
107
191
|
* @private
|
|
@@ -124,6 +208,12 @@ export class VoicevoxApi {
|
|
|
124
208
|
if (responseType === 'arraybuffer') {
|
|
125
209
|
return (await response.arrayBuffer());
|
|
126
210
|
}
|
|
211
|
+
if (responseType === 'text') {
|
|
212
|
+
return (await response.text());
|
|
213
|
+
}
|
|
214
|
+
if (response.status === 204) {
|
|
215
|
+
return null;
|
|
216
|
+
}
|
|
127
217
|
return (await response.json());
|
|
128
218
|
}
|
|
129
219
|
catch (error) {
|
package/dist/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAG1E,MAAM,OAAO,WAAW;IACL,OAAO,CAAQ;IAEhC,YAAY,OAAe,EAAE;QAC3B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAA;IAAA,CAC1C;IAED;;OAEG;IACI,KAAK,CAAC,aAAa,CAAC,IAAY,EAAE,OAAO,GAAG,CAAC,EAAuB;QACzE,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,qBAAqB,kBAAkB,CAAC,IAAI,CAAC,YAAY,kBAAkB,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAA;YAClH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,WAAW,CAAa,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;gBACvE,cAAc,EAAE,kBAAkB;aACnC,CAAC,CAAA;YAEF,OAAO,KAAK,CAAA;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,WAAW,CAAC,2DAAqB,EAAE,KAAK,CAAC,CAAA;QACjD,CAAC;IAAA,CACF;IAED;;OAEG;IACI,KAAK,CAAC,UAAU,CAAC,KAAiB,EAAE,OAAO,GAAG,CAAC,EAAwB;QAC5E,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,WAAW,CAC3B,MAAM,EACN,sBAAsB,kBAAkB,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,EAAE,EAC9D,KAAK,EACL;gBACE,cAAc,EAAE,kBAAkB;gBAClC,MAAM,EAAE,WAAW;aACpB,EACD,aAAa,CACd,CAAA;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,WAAW,CAAC,kDAAkB,EAAE,KAAK,CAAC,CAAA;QAC9C,CAAC;IAAA,CACF;IAED;;OAEG;IACI,KAAK,CAAC,uBAAuB,CAAC,IAAY,EAAE,QAAgB,EAAE,WAAoB,EAAuB;QAC9G,IAAI,CAAC;YACH,IAAI,QAAQ,GAAG,iCAAiC,kBAAkB,CAChE,IAAI,CACL,cAAc,kBAAkB,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAA;YAExD,IAAI,WAAW,EAAE,CAAC;gBAChB,QAAQ,IAAI,iBAAiB,kBAAkB,CAAC,WAAW,CAAC,EAAE,CAAA;YAChE,CAAC;YAED,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,WAAW,CAAa,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;gBACvE,cAAc,EAAE,kBAAkB;aACnC,CAAC,CAAA;YAEF,OAAO,KAAK,CAAA;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,WAAW,CAAC,yFAA+B,EAAE,KAAK,CAAC,CAAA;QAC3D,CAAC;IAAA,CACF;IAED;;OAEG;IACI,KAAK,CAAC,WAAW,GAAuB;QAC7C,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,WAAW,CAAA;YAC5B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAY,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE;gBACxE,cAAc,EAAE,kBAAkB;aACnC,CAAC,CAAA;YAEF,OAAO,QAAQ,CAAA;QACjB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,WAAW,CAAC,iEAAuB,EAAE,KAAK,CAAC,CAAA;QACnD,CAAC;IAAA,CACF;IAED;;OAEG;IACI,KAAK,CAAC,cAAc,CAAC,IAAY,
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface AudioCachePolicy {
|
|
2
|
+
isDiskCacheEnabled: boolean;
|
|
3
|
+
ttlMs: number | null;
|
|
4
|
+
maxBytes: number | null;
|
|
5
|
+
}
|
|
6
|
+
export declare function resolveAudioCachePolicy(input: {
|
|
7
|
+
enabledFlag: boolean;
|
|
8
|
+
ttlDays: number;
|
|
9
|
+
maxMb: number;
|
|
10
|
+
}): AudioCachePolicy;
|
|
11
|
+
export declare function planAudioCacheCleanup(input: {
|
|
12
|
+
entries: Array<{
|
|
13
|
+
path: string;
|
|
14
|
+
size: number;
|
|
15
|
+
mtimeMs: number;
|
|
16
|
+
}>;
|
|
17
|
+
now: number;
|
|
18
|
+
ttlMs: number | null;
|
|
19
|
+
maxBytes: number | null;
|
|
20
|
+
}): Set<string>;
|
|
21
|
+
//# sourceMappingURL=cache-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache-policy.d.ts","sourceRoot":"","sources":["../src/cache-policy.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,kBAAkB,EAAE,OAAO,CAAA;IAC3B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CACxB;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE;IAC7C,WAAW,EAAE,OAAO,CAAA;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;CACd,GAAG,gBAAgB,CAKnB;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE;IAC3C,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC/D,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CACxB,GAAG,GAAG,CAAC,MAAM,CAAC,CAyBd"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export function resolveAudioCachePolicy(input) {
|
|
2
|
+
const isDiskCacheEnabled = input.enabledFlag && input.ttlDays !== 0 && input.maxMb !== 0;
|
|
3
|
+
const ttlMs = input.ttlDays < 0 ? null : input.ttlDays * 24 * 60 * 60 * 1000;
|
|
4
|
+
const maxBytes = input.maxMb < 0 ? null : input.maxMb * 1024 * 1024;
|
|
5
|
+
return { isDiskCacheEnabled, ttlMs, maxBytes };
|
|
6
|
+
}
|
|
7
|
+
export function planAudioCacheCleanup(input) {
|
|
8
|
+
const toDelete = new Set();
|
|
9
|
+
if (input.ttlMs !== null) {
|
|
10
|
+
for (const entry of input.entries) {
|
|
11
|
+
if (input.now - entry.mtimeMs > input.ttlMs) {
|
|
12
|
+
toDelete.add(entry.path);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
if (input.maxBytes !== null) {
|
|
17
|
+
const kept = input.entries.filter((entry) => !toDelete.has(entry.path));
|
|
18
|
+
let totalBytes = kept.reduce((sum, entry) => sum + entry.size, 0);
|
|
19
|
+
if (totalBytes > input.maxBytes) {
|
|
20
|
+
const byOldestFirst = [...kept].sort((a, b) => a.mtimeMs - b.mtimeMs);
|
|
21
|
+
for (const entry of byOldestFirst) {
|
|
22
|
+
if (totalBytes <= input.maxBytes)
|
|
23
|
+
break;
|
|
24
|
+
toDelete.add(entry.path);
|
|
25
|
+
totalBytes -= entry.size;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return toDelete;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=cache-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache-policy.js","sourceRoot":"","sources":["../src/cache-policy.ts"],"names":[],"mappings":"AAMA,MAAM,UAAU,uBAAuB,CAAC,KAIvC,EAAoB;IACnB,MAAM,kBAAkB,GAAG,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,OAAO,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,KAAK,CAAC,CAAA;IACxF,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA;IAC5E,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,GAAG,IAAI,CAAA;IACnE,OAAO,EAAE,kBAAkB,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAA;AAAA,CAC/C;AAED,MAAM,UAAU,qBAAqB,CAAC,KAKrC,EAAe;IACd,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAA;IAElC,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;QACzB,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAClC,IAAI,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;gBAC5C,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YAC1B,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;QACvE,IAAI,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;QACjE,IAAI,UAAU,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;YAChC,MAAM,aAAa,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,CAAA;YACrE,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;gBAClC,IAAI,UAAU,IAAI,KAAK,CAAC,QAAQ;oBAAE,MAAK;gBACvC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;gBACxB,UAAU,IAAI,KAAK,CAAC,IAAI,CAAA;YAC1B,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAA;AAAA,CAChB"}
|