@kongyo2/kongyoroid 1.0.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.
Files changed (116) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +7 -0
  3. package/dist/cache.d.ts +36 -0
  4. package/dist/cache.d.ts.map +1 -0
  5. package/dist/cache.js +109 -0
  6. package/dist/cache.js.map +1 -0
  7. package/dist/cli.d.ts +3 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +502 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/concurrency.d.ts +14 -0
  12. package/dist/concurrency.d.ts.map +1 -0
  13. package/dist/concurrency.js +107 -0
  14. package/dist/concurrency.js.map +1 -0
  15. package/dist/errors.d.ts +35 -0
  16. package/dist/errors.d.ts.map +1 -0
  17. package/dist/errors.js +81 -0
  18. package/dist/errors.js.map +1 -0
  19. package/dist/formant.d.ts +34 -0
  20. package/dist/formant.d.ts.map +1 -0
  21. package/dist/formant.js +622 -0
  22. package/dist/formant.js.map +1 -0
  23. package/dist/index.d.ts +40 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +23 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/io.d.ts +6 -0
  28. package/dist/io.d.ts.map +1 -0
  29. package/dist/io.js +144 -0
  30. package/dist/io.js.map +1 -0
  31. package/dist/kongyoroid.d.ts +82 -0
  32. package/dist/kongyoroid.d.ts.map +1 -0
  33. package/dist/kongyoroid.js +275 -0
  34. package/dist/kongyoroid.js.map +1 -0
  35. package/dist/limits.d.ts +18 -0
  36. package/dist/limits.d.ts.map +1 -0
  37. package/dist/limits.js +15 -0
  38. package/dist/limits.js.map +1 -0
  39. package/dist/mora.d.ts +28 -0
  40. package/dist/mora.d.ts.map +1 -0
  41. package/dist/mora.js +295 -0
  42. package/dist/mora.js.map +1 -0
  43. package/dist/notation.d.ts +15 -0
  44. package/dist/notation.d.ts.map +1 -0
  45. package/dist/notation.js +114 -0
  46. package/dist/notation.js.map +1 -0
  47. package/dist/pitch.d.ts +5 -0
  48. package/dist/pitch.d.ts.map +1 -0
  49. package/dist/pitch.js +36 -0
  50. package/dist/pitch.js.map +1 -0
  51. package/dist/player.d.ts +9 -0
  52. package/dist/player.d.ts.map +1 -0
  53. package/dist/player.js +81 -0
  54. package/dist/player.js.map +1 -0
  55. package/dist/request.d.ts +12 -0
  56. package/dist/request.d.ts.map +1 -0
  57. package/dist/request.js +115 -0
  58. package/dist/request.js.map +1 -0
  59. package/dist/schema.d.ts +9 -0
  60. package/dist/schema.d.ts.map +1 -0
  61. package/dist/schema.js +267 -0
  62. package/dist/schema.js.map +1 -0
  63. package/dist/score.d.ts +37 -0
  64. package/dist/score.d.ts.map +1 -0
  65. package/dist/score.js +166 -0
  66. package/dist/score.js.map +1 -0
  67. package/dist/text.d.ts +3 -0
  68. package/dist/text.d.ts.map +1 -0
  69. package/dist/text.js +54 -0
  70. package/dist/text.js.map +1 -0
  71. package/dist/types.d.ts +121 -0
  72. package/dist/types.d.ts.map +1 -0
  73. package/dist/types.js +2 -0
  74. package/dist/types.js.map +1 -0
  75. package/dist/validate.d.ts +13 -0
  76. package/dist/validate.d.ts.map +1 -0
  77. package/dist/validate.js +59 -0
  78. package/dist/validate.js.map +1 -0
  79. package/dist/version.d.ts +3 -0
  80. package/dist/version.d.ts.map +1 -0
  81. package/dist/version.js +3 -0
  82. package/dist/version.js.map +1 -0
  83. package/dist/voicevox/api.d.ts +79 -0
  84. package/dist/voicevox/api.d.ts.map +1 -0
  85. package/dist/voicevox/api.js +176 -0
  86. package/dist/voicevox/api.js.map +1 -0
  87. package/dist/voicevox/client.d.ts +64 -0
  88. package/dist/voicevox/client.d.ts.map +1 -0
  89. package/dist/voicevox/client.js +321 -0
  90. package/dist/voicevox/client.js.map +1 -0
  91. package/dist/voicevox/dictionary.d.ts +21 -0
  92. package/dist/voicevox/dictionary.d.ts.map +1 -0
  93. package/dist/voicevox/dictionary.js +41 -0
  94. package/dist/voicevox/dictionary.js.map +1 -0
  95. package/dist/voicevox/song.d.ts +12 -0
  96. package/dist/voicevox/song.d.ts.map +1 -0
  97. package/dist/voicevox/song.js +45 -0
  98. package/dist/voicevox/song.js.map +1 -0
  99. package/dist/voicevox/speech.d.ts +17 -0
  100. package/dist/voicevox/speech.d.ts.map +1 -0
  101. package/dist/voicevox/speech.js +100 -0
  102. package/dist/voicevox/speech.js.map +1 -0
  103. package/dist/voicevox/styles.d.ts +15 -0
  104. package/dist/voicevox/styles.d.ts.map +1 -0
  105. package/dist/voicevox/styles.js +103 -0
  106. package/dist/voicevox/styles.js.map +1 -0
  107. package/dist/wav.d.ts +18 -0
  108. package/dist/wav.d.ts.map +1 -0
  109. package/dist/wav.js +198 -0
  110. package/dist/wav.js.map +1 -0
  111. package/examples/batch.jsonl +4 -0
  112. package/examples/song-notes.json +24 -0
  113. package/examples/song.json +12 -0
  114. package/examples/speech-kana.json +6 -0
  115. package/examples/speech.json +8 -0
  116. package/package.json +86 -0
@@ -0,0 +1,64 @@
1
+ import type { EngineScore } from "../score.ts";
2
+ import type { OperationOptions, VoiceStyle } from "../types.ts";
3
+ import type { AudioQuery, DictionaryWord, EngineAccentPhrase, EngineManifest, FrameAudioQuery, SupportedDevices, WordType } from "./api.ts";
4
+ export declare const DEFAULT_ENDPOINT: string;
5
+ export interface VoicevoxClientOptions {
6
+ readonly endpoint?: string;
7
+ readonly timeoutMs?: number;
8
+ readonly retries?: number;
9
+ readonly maxResponseBytes?: number;
10
+ readonly fetch?: typeof globalThis.fetch;
11
+ readonly headers?: Readonly<Record<string, string>>;
12
+ }
13
+ export interface DictionaryWordInput {
14
+ readonly surface: string;
15
+ readonly pronunciation: string;
16
+ readonly accentType: number;
17
+ readonly wordType?: WordType;
18
+ readonly priority?: number;
19
+ }
20
+ type Query = Readonly<Record<string, string | number | boolean | undefined>>;
21
+ interface RequestSpec {
22
+ readonly method: "GET" | "POST" | "PUT" | "DELETE";
23
+ readonly path: string;
24
+ readonly query?: Query;
25
+ readonly body?: unknown;
26
+ readonly accept?: string;
27
+ readonly idempotent?: boolean;
28
+ }
29
+ export declare class VoicevoxClient {
30
+ readonly endpoint: URL;
31
+ private readonly timeoutMs;
32
+ private readonly retries;
33
+ private readonly maxResponseBytes;
34
+ private readonly fetchImpl;
35
+ private readonly headers;
36
+ private manifestCache;
37
+ private versionCache;
38
+ constructor(options?: VoicevoxClientOptions);
39
+ private url;
40
+ private readBody;
41
+ private attempt;
42
+ request(spec: RequestSpec, options?: OperationOptions): Promise<Uint8Array>;
43
+ json(spec: RequestSpec, options?: OperationOptions): Promise<unknown>;
44
+ version(options?: OperationOptions): Promise<string>;
45
+ manifest(options?: OperationOptions): Promise<EngineManifest>;
46
+ supportedDevices(options?: OperationOptions): Promise<SupportedDevices>;
47
+ speakers(options?: OperationOptions): Promise<readonly VoiceStyle[]>;
48
+ singers(options?: OperationOptions): Promise<readonly VoiceStyle[]>;
49
+ audioQuery(text: string, styleId: number, options?: OperationOptions): Promise<AudioQuery>;
50
+ accentPhrases(text: string, styleId: number, isKana: boolean, options?: OperationOptions): Promise<readonly EngineAccentPhrase[]>;
51
+ moraData(phrases: readonly EngineAccentPhrase[], styleId: number, options?: OperationOptions): Promise<readonly EngineAccentPhrase[]>;
52
+ synthesis(query: AudioQuery, styleId: number, upspeak: boolean, options?: OperationOptions): Promise<Uint8Array>;
53
+ singFrameAudioQuery(score: EngineScore, styleId: number, options?: OperationOptions): Promise<FrameAudioQuery>;
54
+ frameSynthesis(query: FrameAudioQuery, styleId: number, options?: OperationOptions): Promise<Uint8Array>;
55
+ initializeSpeaker(styleId: number, skipReinit?: boolean, options?: OperationOptions): Promise<void>;
56
+ isInitializedSpeaker(styleId: number, options?: OperationOptions): Promise<boolean>;
57
+ validateKana(text: string, options?: OperationOptions): Promise<boolean>;
58
+ dictionary(options?: OperationOptions): Promise<readonly DictionaryWord[]>;
59
+ addDictionaryWord(word: DictionaryWordInput, options?: OperationOptions): Promise<string>;
60
+ updateDictionaryWord(uuid: string, word: DictionaryWordInput, options?: OperationOptions): Promise<void>;
61
+ deleteDictionaryWord(uuid: string, options?: OperationOptions): Promise<void>;
62
+ }
63
+ export {};
64
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/voicevox/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,321 @@
1
+ import { setTimeout as sleep } from "node:timers/promises";
2
+ import { KongyoroidError, checkAbort, invalid } from "../errors.js";
3
+ import { LIMITS } from "../limits.js";
4
+ import { integer } from "../validate.js";
5
+ import { protocolError, readAccentPhrases, readAudioQuery, readBoolean, readDictionary, readFrameAudioQuery, readManifest, readString, readStyles, readSupportedDevices, } from "./api.js";
6
+ export const DEFAULT_ENDPOINT = "http://127.0.0.1:50021";
7
+ const RETRYABLE_STATUS = new Set([408, 425, 429, 500, 502, 503, 504]);
8
+ function parseRetryAfter(header) {
9
+ if (header === null)
10
+ return undefined;
11
+ const seconds = Number(header);
12
+ if (Number.isFinite(seconds))
13
+ return Math.max(0, seconds * 1000);
14
+ const at = Date.parse(header);
15
+ return Number.isFinite(at) ? Math.max(0, at - Date.now()) : undefined;
16
+ }
17
+ function decodeDetail(bytes) {
18
+ const text = new TextDecoder("utf-8").decode(bytes).slice(0, 4000);
19
+ try {
20
+ const parsed = JSON.parse(text);
21
+ return typeof parsed === "object" && parsed !== null && "detail" in parsed ? parsed.detail : parsed;
22
+ }
23
+ catch {
24
+ return text;
25
+ }
26
+ }
27
+ function describeDetail(detail) {
28
+ if (typeof detail === "string")
29
+ return detail;
30
+ if (Array.isArray(detail)) {
31
+ return detail
32
+ .map((item) => {
33
+ if (typeof item === "object" && item !== null && "msg" in item) {
34
+ const loc = "loc" in item && Array.isArray(item.loc) ? item.loc.join(".") : "";
35
+ return loc.length > 0 ? `${loc}: ${String(item.msg)}` : String(item.msg);
36
+ }
37
+ return JSON.stringify(item);
38
+ })
39
+ .join("; ");
40
+ }
41
+ if (typeof detail === "object" && detail !== null && "text" in detail)
42
+ return String(detail.text);
43
+ return JSON.stringify(detail);
44
+ }
45
+ export class VoicevoxClient {
46
+ endpoint;
47
+ timeoutMs;
48
+ retries;
49
+ maxResponseBytes;
50
+ fetchImpl;
51
+ headers;
52
+ manifestCache;
53
+ versionCache;
54
+ constructor(options = {}) {
55
+ let endpoint;
56
+ try {
57
+ endpoint = new URL(options.endpoint ?? DEFAULT_ENDPOINT);
58
+ }
59
+ catch (error) {
60
+ throw new KongyoroidError({ code: "INVALID_INPUT", path: "$.endpoint", message: "Invalid VOICEVOX endpoint URL.", retryable: false }, error);
61
+ }
62
+ if (endpoint.protocol !== "http:" && endpoint.protocol !== "https:") {
63
+ invalid("$.endpoint", "The VOICEVOX endpoint must use http or https.");
64
+ }
65
+ endpoint.search = "";
66
+ endpoint.hash = "";
67
+ endpoint.pathname = `${endpoint.pathname.replace(/\/+$/u, "")}/`;
68
+ this.endpoint = endpoint;
69
+ this.timeoutMs = integer(options.timeoutMs ?? 120_000, "$.timeoutMs", 100, 3_600_000);
70
+ this.retries = integer(options.retries ?? 1, "$.retries", 0, 5);
71
+ this.maxResponseBytes = integer(options.maxResponseBytes ?? LIMITS.responseBytes, "$.maxResponseBytes", 1024, 4_294_967_295);
72
+ this.fetchImpl = options.fetch ?? globalThis.fetch;
73
+ this.headers = options.headers ?? {};
74
+ }
75
+ url(path, query) {
76
+ const url = new URL(path, this.endpoint);
77
+ if (query !== undefined) {
78
+ for (const [key, value] of Object.entries(query))
79
+ if (value !== undefined)
80
+ url.searchParams.set(key, String(value));
81
+ }
82
+ return url;
83
+ }
84
+ async readBody(response, path) {
85
+ const declared = response.headers.get("content-length");
86
+ if (declared !== null && Number(declared) > this.maxResponseBytes) {
87
+ await response.body?.cancel();
88
+ throw protocolError(`${path} response exceeds ${this.maxResponseBytes} bytes`);
89
+ }
90
+ if (response.body === null)
91
+ return new Uint8Array(0);
92
+ const reader = response.body.getReader();
93
+ const chunks = [];
94
+ let size = 0;
95
+ const pump = async () => {
96
+ const { done, value } = await reader.read();
97
+ if (done)
98
+ return;
99
+ size += value.length;
100
+ if (size > this.maxResponseBytes) {
101
+ await reader.cancel();
102
+ throw protocolError(`${path} response exceeds ${this.maxResponseBytes} bytes`);
103
+ }
104
+ chunks.push(value);
105
+ return pump();
106
+ };
107
+ try {
108
+ await pump();
109
+ }
110
+ finally {
111
+ reader.releaseLock();
112
+ }
113
+ const bytes = new Uint8Array(size);
114
+ let offset = 0;
115
+ for (const chunk of chunks) {
116
+ bytes.set(chunk, offset);
117
+ offset += chunk.length;
118
+ }
119
+ return bytes;
120
+ }
121
+ async attempt(spec, signal) {
122
+ const timeout = AbortSignal.timeout(this.timeoutMs);
123
+ const combined = signal === undefined ? timeout : AbortSignal.any([signal, timeout]);
124
+ let response;
125
+ try {
126
+ response = await this.fetchImpl(this.url(spec.path, spec.query), {
127
+ method: spec.method,
128
+ headers: {
129
+ accept: spec.accept ?? "application/json",
130
+ ...(spec.body === undefined ? {} : { "content-type": "application/json" }),
131
+ ...this.headers,
132
+ },
133
+ ...(spec.body === undefined ? {} : { body: JSON.stringify(spec.body) }),
134
+ signal: combined,
135
+ redirect: "error",
136
+ });
137
+ }
138
+ catch (error) {
139
+ checkAbort(signal);
140
+ if (timeout.aborted) {
141
+ throw new KongyoroidError({
142
+ code: "TIMEOUT",
143
+ message: `VOICEVOX ${spec.path} did not respond within ${this.timeoutMs} ms.`,
144
+ retryable: true,
145
+ hint: "Raise --timeout-ms for long inputs, or split the text into shorter requests.",
146
+ }, error);
147
+ }
148
+ throw new KongyoroidError({
149
+ code: "ENGINE_UNAVAILABLE",
150
+ message: `Could not reach VOICEVOX ENGINE at ${this.endpoint.origin}: ${error instanceof Error ? error.message : String(error)}`,
151
+ retryable: true,
152
+ hint: "Start VOICEVOX ENGINE (default http://127.0.0.1:50021), pass --endpoint, or use --engine formant.",
153
+ }, error);
154
+ }
155
+ if (response.ok) {
156
+ try {
157
+ return await this.readBody(response, spec.path);
158
+ }
159
+ catch (error) {
160
+ checkAbort(signal);
161
+ if (timeout.aborted) {
162
+ throw new KongyoroidError({ code: "TIMEOUT", message: `VOICEVOX ${spec.path} timed out while streaming.`, retryable: true }, error);
163
+ }
164
+ throw error;
165
+ }
166
+ }
167
+ const bytes = await this.readBody(response, spec.path).catch(() => new Uint8Array(0));
168
+ const detail = decodeDetail(bytes);
169
+ const retryAfter = parseRetryAfter(response.headers.get("retry-after"));
170
+ if (RETRYABLE_STATUS.has(response.status)) {
171
+ throw new KongyoroidError({
172
+ code: "ENGINE_HTTP",
173
+ message: `VOICEVOX ${spec.path} returned HTTP ${response.status}: ${describeDetail(detail)}`,
174
+ status: response.status,
175
+ retryable: true,
176
+ detail: { ...(retryAfter === undefined ? {} : { retryAfterMs: retryAfter }), body: detail },
177
+ });
178
+ }
179
+ throw new KongyoroidError({
180
+ code: "ENGINE_REJECTED",
181
+ message: `VOICEVOX ${spec.path} rejected the request (HTTP ${response.status}): ${describeDetail(detail)}`,
182
+ status: response.status,
183
+ retryable: false,
184
+ detail,
185
+ hint: response.status === 404
186
+ ? "The endpoint is not a VOICEVOX ENGINE or this engine version lacks the feature."
187
+ : "Check the style id with the voices command and the input against the schema command.",
188
+ });
189
+ }
190
+ async request(spec, options = {}) {
191
+ const run = async (attempt) => {
192
+ checkAbort(options.signal);
193
+ try {
194
+ return await this.attempt(spec, options.signal);
195
+ }
196
+ catch (error) {
197
+ if (!(error instanceof KongyoroidError) ||
198
+ !error.retryable ||
199
+ spec.idempotent === false ||
200
+ attempt >= this.retries) {
201
+ throw error;
202
+ }
203
+ const hinted = typeof error.detail === "object" && error.detail !== null && "retryAfterMs" in error.detail
204
+ ? Number(error.detail.retryAfterMs)
205
+ : undefined;
206
+ const delay = Math.min(5000, hinted ?? 200 * 2 ** attempt);
207
+ await sleep(delay, undefined, options.signal === undefined ? {} : { signal: options.signal }).catch(() => {
208
+ checkAbort(options.signal);
209
+ });
210
+ return run(attempt + 1);
211
+ }
212
+ };
213
+ return run(0);
214
+ }
215
+ async json(spec, options = {}) {
216
+ const bytes = await this.request(spec, options);
217
+ if (bytes.length === 0)
218
+ return null;
219
+ try {
220
+ return JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(bytes));
221
+ }
222
+ catch (error) {
223
+ throw protocolError(`${spec.path} did not return JSON`, error instanceof Error ? error.message : String(error));
224
+ }
225
+ }
226
+ version(options = {}) {
227
+ this.versionCache ??= this.json({ method: "GET", path: "version" }, options)
228
+ .then((value) => readString(value, "version"))
229
+ .catch((error) => {
230
+ this.versionCache = undefined;
231
+ throw error;
232
+ });
233
+ return this.versionCache;
234
+ }
235
+ manifest(options = {}) {
236
+ this.manifestCache ??= this.json({ method: "GET", path: "engine_manifest" }, options)
237
+ .then(readManifest)
238
+ .catch((error) => {
239
+ this.manifestCache = undefined;
240
+ throw error;
241
+ });
242
+ return this.manifestCache;
243
+ }
244
+ async supportedDevices(options = {}) {
245
+ return readSupportedDevices(await this.json({ method: "GET", path: "supported_devices" }, options));
246
+ }
247
+ async speakers(options = {}) {
248
+ return readStyles(await this.json({ method: "GET", path: "speakers" }, options));
249
+ }
250
+ async singers(options = {}) {
251
+ return readStyles(await this.json({ method: "GET", path: "singers" }, options));
252
+ }
253
+ async audioQuery(text, styleId, options = {}) {
254
+ return readAudioQuery(await this.json({ method: "POST", path: "audio_query", query: { text, speaker: styleId } }, options));
255
+ }
256
+ async accentPhrases(text, styleId, isKana, options = {}) {
257
+ return readAccentPhrases(await this.json({ method: "POST", path: "accent_phrases", query: { text, speaker: styleId, is_kana: isKana } }, options));
258
+ }
259
+ async moraData(phrases, styleId, options = {}) {
260
+ return readAccentPhrases(await this.json({ method: "POST", path: "mora_data", query: { speaker: styleId }, body: phrases }, options));
261
+ }
262
+ synthesis(query, styleId, upspeak, options = {}) {
263
+ return this.request({
264
+ method: "POST",
265
+ path: "synthesis",
266
+ query: { speaker: styleId, enable_interrogative_upspeak: upspeak },
267
+ body: query,
268
+ accept: "audio/wav",
269
+ }, options);
270
+ }
271
+ async singFrameAudioQuery(score, styleId, options = {}) {
272
+ return readFrameAudioQuery(await this.json({ method: "POST", path: "sing_frame_audio_query", query: { speaker: styleId }, body: score }, options));
273
+ }
274
+ frameSynthesis(query, styleId, options = {}) {
275
+ return this.request({ method: "POST", path: "frame_synthesis", query: { speaker: styleId }, body: query, accept: "audio/wav" }, options);
276
+ }
277
+ async initializeSpeaker(styleId, skipReinit = true, options = {}) {
278
+ await this.request({ method: "POST", path: "initialize_speaker", query: { speaker: styleId, skip_reinit: skipReinit } }, options);
279
+ }
280
+ async isInitializedSpeaker(styleId, options = {}) {
281
+ return readBoolean(await this.json({ method: "GET", path: "is_initialized_speaker", query: { speaker: styleId } }, options), "is_initialized_speaker");
282
+ }
283
+ async validateKana(text, options = {}) {
284
+ return readBoolean(await this.json({ method: "POST", path: "validate_kana", query: { text } }, options), "validate_kana");
285
+ }
286
+ async dictionary(options = {}) {
287
+ return readDictionary(await this.json({ method: "GET", path: "user_dict" }, options));
288
+ }
289
+ async addDictionaryWord(word, options = {}) {
290
+ const uuid = await this.json({
291
+ method: "POST",
292
+ path: "user_dict_word",
293
+ idempotent: false,
294
+ query: {
295
+ surface: word.surface,
296
+ pronunciation: word.pronunciation,
297
+ accent_type: word.accentType,
298
+ word_type: word.wordType,
299
+ priority: word.priority,
300
+ },
301
+ }, options);
302
+ return readString(uuid, "user_dict_word");
303
+ }
304
+ async updateDictionaryWord(uuid, word, options = {}) {
305
+ await this.request({
306
+ method: "PUT",
307
+ path: `user_dict_word/${encodeURIComponent(uuid)}`,
308
+ query: {
309
+ surface: word.surface,
310
+ pronunciation: word.pronunciation,
311
+ accent_type: word.accentType,
312
+ word_type: word.wordType,
313
+ priority: word.priority,
314
+ },
315
+ }, options);
316
+ }
317
+ async deleteDictionaryWord(uuid, options = {}) {
318
+ await this.request({ method: "DELETE", path: `user_dict_word/${encodeURIComponent(uuid)}` }, options);
319
+ }
320
+ }
321
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/voicevox/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { OperationOptions } from "../types.ts";
2
+ import type { DictionaryWord, WordType } from "./api.ts";
3
+ import type { DictionaryWordInput, VoicevoxClient } from "./client.ts";
4
+ export declare const WORD_TYPES: readonly WordType[];
5
+ export interface DictionaryWordDraft {
6
+ readonly surface: string;
7
+ readonly pronunciation: string;
8
+ readonly accentType: number;
9
+ readonly wordType?: string;
10
+ readonly priority?: number;
11
+ }
12
+ export declare function validateWord(draft: DictionaryWordDraft, path?: string): DictionaryWordInput;
13
+ export declare class Dictionary {
14
+ private readonly client;
15
+ constructor(client: VoicevoxClient);
16
+ list(options?: OperationOptions): Promise<readonly DictionaryWord[]>;
17
+ add(draft: DictionaryWordDraft, options?: OperationOptions): Promise<string>;
18
+ update(uuid: string, draft: DictionaryWordDraft, options?: OperationOptions): Promise<void>;
19
+ remove(uuid: string, options?: OperationOptions): Promise<void>;
20
+ }
21
+ //# sourceMappingURL=dictionary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dictionary.d.ts","sourceRoot":"","sources":["../../src/voicevox/dictionary.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACzD,OAAO,KAAK,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAEvE,eAAO,MAAM,UAAU,EAAE,SAAS,QAAQ,EAAkE,CAAC;AAE7G,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,mBAAmB,EAAE,IAAI,GAAE,MAAY,GAAG,mBAAmB,CAmBhG;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;gBAErB,MAAM,EAAE,cAAc;IAIlC,IAAI,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,SAAS,cAAc,EAAE,CAAC;IAIlE,GAAG,CAAC,KAAK,EAAE,mBAAmB,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC;IAIhF,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/F,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;CAGjF"}
@@ -0,0 +1,41 @@
1
+ import { invalid } from "../errors.js";
2
+ import { kanaToMoras, toKatakana } from "../mora.js";
3
+ import { integer, literal, string } from "../validate.js";
4
+ export const WORD_TYPES = ["PROPER_NOUN", "COMMON_NOUN", "VERB", "ADJECTIVE", "SUFFIX"];
5
+ export function validateWord(draft, path = "$") {
6
+ const surface = string(draft.surface, `${path}.surface`, 1, 200).trim();
7
+ if (surface.length === 0)
8
+ invalid(`${path}.surface`, "The surface form must not be blank.");
9
+ const pronunciation = toKatakana(string(draft.pronunciation, `${path}.pronunciation`, 1, 200)).replaceAll(/\s+/gu, "");
10
+ if (!/^[ァ-ヴー]+$/u.test(pronunciation)) {
11
+ invalid(`${path}.pronunciation`, "The pronunciation must be katakana (ー allowed).", "Example: キンヨウビ");
12
+ }
13
+ const moraCount = kanaToMoras(pronunciation, `${path}.pronunciation`).length;
14
+ const accentType = integer(draft.accentType, `${path}.accentType`, 0, moraCount);
15
+ return {
16
+ surface,
17
+ pronunciation,
18
+ accentType,
19
+ ...(draft.wordType === undefined ? {} : { wordType: literal(draft.wordType, `${path}.wordType`, WORD_TYPES) }),
20
+ ...(draft.priority === undefined ? {} : { priority: integer(draft.priority, `${path}.priority`, 0, 10) }),
21
+ };
22
+ }
23
+ export class Dictionary {
24
+ client;
25
+ constructor(client) {
26
+ this.client = client;
27
+ }
28
+ list(options = {}) {
29
+ return this.client.dictionary(options);
30
+ }
31
+ async add(draft, options = {}) {
32
+ return this.client.addDictionaryWord(validateWord(draft), options);
33
+ }
34
+ async update(uuid, draft, options = {}) {
35
+ await this.client.updateDictionaryWord(string(uuid, "$.uuid", 1, 200), validateWord(draft), options);
36
+ }
37
+ async remove(uuid, options = {}) {
38
+ await this.client.deleteDictionaryWord(string(uuid, "$.uuid", 1, 200), options);
39
+ }
40
+ }
41
+ //# sourceMappingURL=dictionary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dictionary.js","sourceRoot":"","sources":["../../src/voicevox/dictionary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAErD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAI1D,MAAM,CAAC,MAAM,UAAU,GAAwB,CAAC,aAAa,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;AAU7G,MAAM,UAAU,YAAY,CAAC,KAA0B,EAAE,OAAe,GAAG;IACzE,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,IAAI,UAAU,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACxE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,GAAG,IAAI,UAAU,EAAE,qCAAqC,CAAC,CAAC;IAC5F,MAAM,aAAa,GAAG,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,GAAG,IAAI,gBAAgB,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,UAAU,CACvG,OAAO,EACP,EAAE,CACH,CAAC;IACF,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;QACtC,OAAO,CAAC,GAAG,IAAI,gBAAgB,EAAE,iDAAiD,EAAE,gBAAgB,CAAC,CAAC;IACxG,CAAC;IACD,MAAM,SAAS,GAAG,WAAW,CAAC,aAAa,EAAE,GAAG,IAAI,gBAAgB,CAAC,CAAC,MAAM,CAAC;IAC7E,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,GAAG,IAAI,aAAa,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;IACjF,OAAO;QACL,OAAO;QACP,aAAa;QACb,UAAU;QACV,GAAG,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,IAAI,WAAW,EAAE,UAAU,CAAC,EAAE,CAAC;QAC9G,GAAG,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,IAAI,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;KAC1G,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,UAAU;IACJ,MAAM,CAAiB;IAExC,YAAmB,MAAsB;QACvC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAEM,IAAI,CAAC,UAA4B,EAAE;QACxC,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC;IAEM,KAAK,CAAC,GAAG,CAAC,KAA0B,EAAE,UAA4B,EAAE;QACzE,OAAO,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;IACrE,CAAC;IAEM,KAAK,CAAC,MAAM,CAAC,IAAY,EAAE,KAA0B,EAAE,UAA4B,EAAE;QAC1F,MAAM,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;IACvG,CAAC;IAEM,KAAK,CAAC,MAAM,CAAC,IAAY,EAAE,UAA4B,EAAE;QAC9D,MAAM,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IAClF,CAAC;CACF"}
@@ -0,0 +1,12 @@
1
+ import type { OperationOptions, ResolvedSong, StyleSelection } from "../types.ts";
2
+ import type { FrameAudioQuery } from "./api.ts";
3
+ import type { VoicevoxClient } from "./client.ts";
4
+ export interface SongSynthesis {
5
+ readonly audio: Uint8Array;
6
+ readonly frames: number;
7
+ readonly frameRate: number;
8
+ readonly sampleRate: number;
9
+ }
10
+ export declare function applyVibrato(query: FrameAudioQuery, depthCents: number, rateHz: number, frameRate: number): FrameAudioQuery;
11
+ export declare function synthesizeSong(client: VoicevoxClient, request: ResolvedSong, singer: StyleSelection, teacher: StyleSelection, options?: OperationOptions): Promise<SongSynthesis>;
12
+ //# sourceMappingURL=song.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"song.d.ts","sourceRoot":"","sources":["../../src/voicevox/song.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,wBAAgB,YAAY,CAC1B,KAAK,EAAE,eAAe,EACtB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,eAAe,CAejB;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,cAAc,EACvB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,aAAa,CAAC,CA2BxB"}
@@ -0,0 +1,45 @@
1
+ import { engineScoreFrames, notesToEngineScore } from "../score.js";
2
+ import { inspectWav } from "../wav.js";
3
+ import { protocolError } from "./api.js";
4
+ export function applyVibrato(query, depthCents, rateHz, frameRate) {
5
+ if (depthCents <= 0 || rateHz <= 0)
6
+ return query;
7
+ let run = 0;
8
+ const f0 = query.f0.map((hz) => {
9
+ if (hz <= 0) {
10
+ run = 0;
11
+ return hz;
12
+ }
13
+ const seconds = run / frameRate;
14
+ run += 1;
15
+ const fade = Math.min(1, Math.max(0, (seconds - 0.12) / 0.18));
16
+ const cents = depthCents * fade * Math.sin(2 * Math.PI * rateHz * seconds);
17
+ return hz * 2 ** (cents / 1200);
18
+ });
19
+ return { ...query, f0 };
20
+ }
21
+ export async function synthesizeSong(client, request, singer, teacher, options = {}) {
22
+ const manifest = await client.manifest(options);
23
+ const frameRate = manifest.frameRate;
24
+ const sampleRate = request.sampleRate ?? manifest.defaultSamplingRate;
25
+ const score = notesToEngineScore(request.notes, request.tempo, frameRate, request.leadIn, request.leadOut);
26
+ const expectedFrames = engineScoreFrames(score);
27
+ const predicted = await client.singFrameAudioQuery(score, teacher.id, options);
28
+ if (predicted.f0.length !== expectedFrames) {
29
+ throw protocolError(`sing_frame_audio_query returned ${predicted.f0.length} frames for a ${expectedFrames}-frame score`);
30
+ }
31
+ const tuned = applyVibrato(predicted, request.vibratoDepth ?? 0, request.vibratoRate, frameRate);
32
+ const query = {
33
+ ...tuned,
34
+ volumeScale: request.volume,
35
+ outputSamplingRate: sampleRate,
36
+ outputStereo: false,
37
+ };
38
+ const audio = await client.frameSynthesis(query, singer.id, options);
39
+ const info = inspectWav(audio);
40
+ if (info.channels !== 1 || info.sampleRate !== sampleRate) {
41
+ throw protocolError(`frame_synthesis returned ${info.channels} channel(s) at ${info.sampleRate} Hz, expected mono ${sampleRate} Hz`);
42
+ }
43
+ return { audio, frames: expectedFrames, frameRate, sampleRate };
44
+ }
45
+ //# sourceMappingURL=song.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"song.js","sourceRoot":"","sources":["../../src/voicevox/song.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { OperationOptions, ResolvedSpeech, StyleSelection } from "../types.ts";
2
+ import type { AudioQuery, EngineAccentPhrase } from "./api.ts";
3
+ import type { VoicevoxClient } from "./client.ts";
4
+ export interface SpeechSynthesis {
5
+ readonly audio: Uint8Array;
6
+ readonly kana: string;
7
+ readonly chunks: number;
8
+ readonly sampleRate: number;
9
+ }
10
+ export interface SpeechOptions extends OperationOptions {
11
+ readonly concurrency?: number;
12
+ }
13
+ export declare function querySeconds(query: AudioQuery): number;
14
+ export declare function applySpeechSettings(phrases: readonly EngineAccentPhrase[], request: ResolvedSpeech, sampleRate: number, kana: string): AudioQuery;
15
+ export declare function synthesizeSpeech(client: VoicevoxClient, request: ResolvedSpeech, speaker: StyleSelection, options?: SpeechOptions): Promise<SpeechSynthesis>;
16
+ export declare function accentPhrasesToKana(phrases: readonly EngineAccentPhrase[]): string;
17
+ //# sourceMappingURL=speech.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"speech.d.ts","sourceRoot":"","sources":["../../src/voicevox/speech.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAEpF,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAE/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,aAAc,SAAQ,gBAAgB;IACrD,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAYtD;AAED,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,SAAS,kBAAkB,EAAE,EACtC,OAAO,EAAE,cAAc,EACvB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,GACX,UAAU,CAeZ;AAED,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,cAAc,EACvB,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,eAAe,CAAC,CAkD1B;AAiBD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,SAAS,kBAAkB,EAAE,GAAG,MAAM,CAelF"}