@leiboss/dsh-voiceover 0.0.0-stage → 0.3.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 (72) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +187 -2
  3. package/client/client.js +985 -0
  4. package/cordis.patch.yml +13 -0
  5. package/dist/api.d.ts +52 -0
  6. package/dist/api.d.ts.map +1 -0
  7. package/dist/api.js +301 -0
  8. package/dist/api.js.map +1 -0
  9. package/dist/cli.d.ts +40 -0
  10. package/dist/cli.d.ts.map +1 -0
  11. package/dist/cli.js +303 -0
  12. package/dist/cli.js.map +1 -0
  13. package/dist/client.js +985 -0
  14. package/dist/http-types.d.ts +26 -0
  15. package/dist/http-types.d.ts.map +1 -0
  16. package/dist/http-types.js +2 -0
  17. package/dist/http-types.js.map +1 -0
  18. package/dist/index.d.ts +60 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +410 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/llm.d.ts +60 -0
  23. package/dist/llm.d.ts.map +1 -0
  24. package/dist/llm.js +113 -0
  25. package/dist/llm.js.map +1 -0
  26. package/dist/operations.d.ts +41 -0
  27. package/dist/operations.d.ts.map +1 -0
  28. package/dist/operations.js +77 -0
  29. package/dist/operations.js.map +1 -0
  30. package/dist/panel.d.ts +42 -0
  31. package/dist/panel.d.ts.map +1 -0
  32. package/dist/panel.js +212 -0
  33. package/dist/panel.js.map +1 -0
  34. package/dist/pipeline.d.ts +141 -0
  35. package/dist/pipeline.d.ts.map +1 -0
  36. package/dist/pipeline.js +519 -0
  37. package/dist/pipeline.js.map +1 -0
  38. package/dist/prompts.d.ts +58 -0
  39. package/dist/prompts.d.ts.map +1 -0
  40. package/dist/prompts.js +169 -0
  41. package/dist/prompts.js.map +1 -0
  42. package/dist/serve-entry.d.ts +3 -0
  43. package/dist/serve-entry.d.ts.map +1 -0
  44. package/dist/serve-entry.js +11 -0
  45. package/dist/serve-entry.js.map +1 -0
  46. package/dist/snapshot.d.ts +48 -0
  47. package/dist/snapshot.d.ts.map +1 -0
  48. package/dist/snapshot.js +82 -0
  49. package/dist/snapshot.js.map +1 -0
  50. package/dist/subtitle.d.ts +49 -0
  51. package/dist/subtitle.d.ts.map +1 -0
  52. package/dist/subtitle.js +163 -0
  53. package/dist/subtitle.js.map +1 -0
  54. package/dist/types.d.ts +148 -0
  55. package/dist/types.d.ts.map +1 -0
  56. package/dist/types.js +10 -0
  57. package/dist/types.js.map +1 -0
  58. package/dist/util.d.ts +16 -0
  59. package/dist/util.d.ts.map +1 -0
  60. package/dist/util.js +47 -0
  61. package/dist/util.js.map +1 -0
  62. package/dist/validate.d.ts +15 -0
  63. package/dist/validate.d.ts.map +1 -0
  64. package/dist/validate.js +186 -0
  65. package/dist/validate.js.map +1 -0
  66. package/dist/version.d.ts +3 -0
  67. package/dist/version.d.ts.map +1 -0
  68. package/dist/version.js +3 -0
  69. package/dist/version.js.map +1 -0
  70. package/package.json +83 -3
  71. package/schemas/manifest.schema.json +132 -0
  72. package/schemas/outline.schema.json +40 -0
package/dist/cli.js ADDED
@@ -0,0 +1,303 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * `dsh-voiceover serve` — the daemon entry.
4
+ *
5
+ * Same pipeline, same operations, different door: a local HTTP API so scripts
6
+ * and agents outside DSH can synthesize a line, build a project, watch it, and
7
+ * fetch audio/subtitles. The port binds to loopback by default and the daemon
8
+ * refuses to start without a bearer token.
9
+ */
10
+ import { createServer } from 'node:http';
11
+ import { readFile, stat } from 'node:fs/promises';
12
+ import { homedir } from 'node:os';
13
+ import { join } from 'node:path';
14
+ import { resolveConfig, TtsService } from '@leiboss/dsh-tts';
15
+ import { handleRequest } from "./api.js";
16
+ import { httpCompleter } from "./llm.js";
17
+ import { rerunProject } from "./operations.js";
18
+ import { normalizeSource, projectKey, runProject } from "./pipeline.js";
19
+ import { VERSION } from "./version.js";
20
+ /** Largest request body the daemon reads into memory. */
21
+ const MAX_BODY_BYTES = 6 * 1024 * 1024;
22
+ const USAGE = `Usage: dsh-voiceover [serve] [options]
23
+
24
+ Options:
25
+ -p, --port <n> Listen port (default 7801)
26
+ --host <addr> Listen address (default 127.0.0.1)
27
+ --output <dir> Project root (default $DSH_HOME/voiceover)
28
+ --token <value> Bearer token (or DSH_VOICEOVER_TOKEN); required
29
+ --voice <name> Default voice (default zh-CN-XiaoxiaoNeural)
30
+ --rate <value> Default rate (default +0%)
31
+ --style <name> lecture | news | story | docs (default news)
32
+ --llm-base-url <url> OpenAI-compatible endpoint for script adaptation
33
+ --llm-model <name> Model name (default deepseek-chat)
34
+ --llm-key <value> API key (or DSH_VOICEOVER_LLM_KEY)
35
+ -h, --help Show this help
36
+ `;
37
+ /** Read `--name value` pairs without pulling in a dependency. */
38
+ function parseArgs(argv) {
39
+ const parsed = {};
40
+ for (let index = 0; index < argv.length; index += 1) {
41
+ const arg = argv[index];
42
+ const next = () => {
43
+ const value = argv[index + 1];
44
+ if (value === undefined)
45
+ throw new Error(`${arg} needs a value`);
46
+ index += 1;
47
+ return value;
48
+ };
49
+ switch (arg) {
50
+ case '-h':
51
+ case '--help':
52
+ parsed.help = true;
53
+ break;
54
+ case '-p':
55
+ case '--port':
56
+ parsed.port = Number(next());
57
+ break;
58
+ case '--host':
59
+ parsed.host = next();
60
+ break;
61
+ case '--output':
62
+ parsed.outputDir = next();
63
+ break;
64
+ case '--token':
65
+ parsed.token = next();
66
+ break;
67
+ case '--voice':
68
+ parsed.voice = next();
69
+ break;
70
+ case '--rate':
71
+ parsed.rate = next();
72
+ break;
73
+ case '--style':
74
+ parsed.style = next();
75
+ break;
76
+ case '--llm-base-url':
77
+ parsed.llmBaseUrl = next();
78
+ break;
79
+ case '--llm-model':
80
+ parsed.llmModel = next();
81
+ break;
82
+ case '--llm-key':
83
+ parsed.llmKey = next();
84
+ break;
85
+ case '--chapter-chars':
86
+ parsed.chapterChars = Number(next());
87
+ break;
88
+ default:
89
+ if (arg !== undefined && arg.startsWith('-'))
90
+ throw new Error(`unknown option: ${arg}`);
91
+ }
92
+ }
93
+ return parsed;
94
+ }
95
+ /** Resolve options from flags, the environment, and defaults. */
96
+ function resolveOptions(argv, env) {
97
+ const parsed = parseArgs(argv);
98
+ const home = env.DSH_HOME ?? join(homedir(), '.dsh');
99
+ const style = parsed.style ?? 'news';
100
+ if (!['lecture', 'news', 'story', 'docs'].includes(style)) {
101
+ throw new Error(`unknown style: ${style}`);
102
+ }
103
+ return {
104
+ port: parsed.port ?? 7801,
105
+ host: parsed.host ?? '127.0.0.1',
106
+ outputDir: parsed.outputDir ?? join(home, 'voiceover'),
107
+ token: parsed.token ?? env.DSH_VOICEOVER_TOKEN,
108
+ voice: parsed.voice ?? 'zh-CN-XiaoxiaoNeural',
109
+ rate: parsed.rate ?? '+0%',
110
+ style,
111
+ llmModel: parsed.llmModel ?? 'deepseek-chat',
112
+ ...(parsed.chapterChars === undefined ? {} : { chapterChars: parsed.chapterChars }),
113
+ ...(parsed.llmBaseUrl === undefined ? {} : { llmBaseUrl: parsed.llmBaseUrl }),
114
+ ...(parsed.llmKey === undefined && env.DSH_VOICEOVER_LLM_KEY === undefined
115
+ ? {}
116
+ : { llmKey: parsed.llmKey ?? env.DSH_VOICEOVER_LLM_KEY }),
117
+ };
118
+ }
119
+ /** Engine-backed synthesizer for the pipeline. */
120
+ function engineSynthesizer(engine) {
121
+ return {
122
+ async synthesize(request) {
123
+ const result = await engine.synthesize(request);
124
+ if (result.kind === 'speechSynthesis') {
125
+ throw new Error(`No engine could produce audio: ${result.reason}`);
126
+ }
127
+ const bytes = (await stat(result.filePath)).size;
128
+ return {
129
+ filePath: result.filePath,
130
+ bytes,
131
+ durationMs: result.durationMs,
132
+ timingQuality: result.timingQuality,
133
+ format: result.format === 'wav' ? 'wav' : 'mp3',
134
+ // Report the engine that actually ran; without it the manifest falls
135
+ // back to the planning-time guess and claims edge-py while edge-js ran.
136
+ engine: result.engine,
137
+ ...(result.words === undefined ? {} : { words: result.words }),
138
+ };
139
+ },
140
+ };
141
+ }
142
+ /** Read the whole body with a hard cap. */
143
+ async function readBody(request) {
144
+ const chunks = [];
145
+ let size = 0;
146
+ for await (const chunk of request) {
147
+ const buffer = chunk;
148
+ size += buffer.length;
149
+ if (size > MAX_BODY_BYTES)
150
+ return undefined;
151
+ chunks.push(buffer);
152
+ }
153
+ return Buffer.concat(chunks);
154
+ }
155
+ /** Start the daemon. Returns the listening server for tests. */
156
+ export async function start(options, inject = {}) {
157
+ // The engine is injectable so a test can exercise the daemon without a
158
+ // network or a real voice backend.
159
+ const engine = inject.engine ??
160
+ new TtsService(resolveConfig({ outputDir: join(options.outputDir, '.tts'), engine: 'auto' }, process.env));
161
+ const model = options.llmBaseUrl === undefined
162
+ ? undefined
163
+ : httpCompleter({
164
+ baseUrl: options.llmBaseUrl,
165
+ model: options.llmModel,
166
+ ...(options.llmKey === undefined ? {} : { apiKey: options.llmKey }),
167
+ });
168
+ const deps = {
169
+ ...(model === undefined ? {} : { completer: model }),
170
+ synth: engineSynthesizer(engine),
171
+ };
172
+ /** One in-flight run per project, shared by create and rerun. */
173
+ const running = new Map();
174
+ const track = (projectId, run) => {
175
+ running.set(projectId, run);
176
+ void run
177
+ .catch((error) => {
178
+ console.error(`[voiceover] ${projectId} failed: ${String(error)}`);
179
+ })
180
+ .finally(() => {
181
+ running.delete(projectId);
182
+ });
183
+ };
184
+ const context = {
185
+ outputDir: options.outputDir,
186
+ token: options.token ?? '',
187
+ version: VERSION,
188
+ startedAt: Date.now(),
189
+ async synthesize(input) {
190
+ const result = await engine.synthesize(input);
191
+ if (result.kind === 'speechSynthesis') {
192
+ throw new Error(`No engine could produce audio: ${result.reason}`);
193
+ }
194
+ return {
195
+ filePath: result.filePath,
196
+ format: result.format,
197
+ durationMs: result.durationMs,
198
+ timingQuality: result.timingQuality,
199
+ engine: result.engine,
200
+ };
201
+ },
202
+ async createProject(input) {
203
+ const text = input.sourceText ?? (input.sourcePath === undefined ? '' : await readFile(input.sourcePath, 'utf8'));
204
+ const normalized = normalizeSource(text);
205
+ if (normalized.length === 0)
206
+ throw new Error('the source text is empty');
207
+ const voice = input.voice ?? options.voice;
208
+ const rate = input.rate ?? options.rate;
209
+ const style = input.style ?? options.style;
210
+ const projectId = projectKey({ text: normalized, voice, rate, style });
211
+ if (!running.has(projectId)) {
212
+ track(projectId, runProject(deps, {
213
+ outputDir: options.outputDir,
214
+ title: input.title ?? '未命名',
215
+ text: normalized,
216
+ voice,
217
+ rate,
218
+ style,
219
+ network: true,
220
+ ...(options.chapterChars === undefined ? {} : { chapterChars: options.chapterChars }),
221
+ }));
222
+ }
223
+ return { projectId };
224
+ },
225
+ async rerunProject(projectId, chapter) {
226
+ if (running.has(projectId))
227
+ return;
228
+ track(projectId, rerunProject(deps, {
229
+ outputDir: options.outputDir,
230
+ projectId,
231
+ ...(chapter === undefined ? {} : { chapters: [chapter] }),
232
+ }));
233
+ },
234
+ async doctor() {
235
+ return engine.doctor();
236
+ },
237
+ };
238
+ const server = createServer((request, response) => {
239
+ void (async () => {
240
+ const body = await readBody(request);
241
+ if (body === undefined) {
242
+ response.writeHead(413, { 'content-type': 'application/json' });
243
+ response.end(`${JSON.stringify({ error: 'body too large' })}\n`);
244
+ return;
245
+ }
246
+ const result = await handleRequest(context, {
247
+ method: request.method ?? 'GET',
248
+ url: request.url ?? '/',
249
+ headers: request.headers,
250
+ body,
251
+ });
252
+ response.writeHead(result.status, result.headers);
253
+ response.end(result.body);
254
+ })().catch((error) => {
255
+ response.writeHead(500, { 'content-type': 'application/json' });
256
+ response.end(`${JSON.stringify({ error: String(error).slice(0, 200) })}\n`);
257
+ });
258
+ });
259
+ await new Promise((resolve, reject) => {
260
+ server.once('error', reject);
261
+ server.listen(options.port, options.host, () => {
262
+ server.off('error', reject);
263
+ resolve();
264
+ });
265
+ });
266
+ return { server, context };
267
+ }
268
+ /** CLI entry. */
269
+ export async function main() {
270
+ const argv = process.argv.slice(2);
271
+ if (argv[0] === 'serve')
272
+ argv.shift();
273
+ let options;
274
+ try {
275
+ const parsed = parseArgs(argv);
276
+ if (parsed.help === true) {
277
+ process.stdout.write(USAGE);
278
+ return;
279
+ }
280
+ options = resolveOptions(argv, process.env);
281
+ }
282
+ catch (error) {
283
+ process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n\n${USAGE}`);
284
+ process.exitCode = 2;
285
+ return;
286
+ }
287
+ if (options.token === undefined || options.token.length === 0) {
288
+ process.stderr.write('Refusing to start without a token. Pass --token or set DSH_VOICEOVER_TOKEN; every request must send "Authorization: Bearer <token>".\n');
289
+ process.exitCode = 2;
290
+ return;
291
+ }
292
+ const { server } = await start(options);
293
+ const address = server.address();
294
+ const shown = typeof address === 'object' && address !== null ? `${address.address}:${address.port}` : String(address);
295
+ process.stdout.write(`dsh-voiceover ${VERSION} listening on http://${shown} (projects: ${options.outputDir})\n`);
296
+ const shutdown = () => {
297
+ server.close(() => process.exit(0));
298
+ };
299
+ process.once('SIGINT', shutdown);
300
+ process.once('SIGTERM', shutdown);
301
+ }
302
+ export { resolveOptions };
303
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}