@amaster.ai/pi-video-gen 0.1.2-beta.48

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 (85) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +196 -0
  3. package/dist/compose.d.ts +43 -0
  4. package/dist/compose.d.ts.map +1 -0
  5. package/dist/compose.js +308 -0
  6. package/dist/compose.js.map +1 -0
  7. package/dist/config.d.ts +29 -0
  8. package/dist/config.d.ts.map +1 -0
  9. package/dist/config.js +305 -0
  10. package/dist/config.js.map +1 -0
  11. package/dist/errors.d.ts +50 -0
  12. package/dist/errors.d.ts.map +1 -0
  13. package/dist/errors.js +99 -0
  14. package/dist/errors.js.map +1 -0
  15. package/dist/ffmpeg.d.ts +64 -0
  16. package/dist/ffmpeg.d.ts.map +1 -0
  17. package/dist/ffmpeg.js +292 -0
  18. package/dist/ffmpeg.js.map +1 -0
  19. package/dist/index.d.ts +3 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +837 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/jobs/store.d.ts +124 -0
  24. package/dist/jobs/store.d.ts.map +1 -0
  25. package/dist/jobs/store.js +386 -0
  26. package/dist/jobs/store.js.map +1 -0
  27. package/dist/providers/ark.d.ts +26 -0
  28. package/dist/providers/ark.d.ts.map +1 -0
  29. package/dist/providers/ark.js +178 -0
  30. package/dist/providers/ark.js.map +1 -0
  31. package/dist/providers/dashscope.d.ts +28 -0
  32. package/dist/providers/dashscope.d.ts.map +1 -0
  33. package/dist/providers/dashscope.js +200 -0
  34. package/dist/providers/dashscope.js.map +1 -0
  35. package/dist/providers/kling.d.ts +46 -0
  36. package/dist/providers/kling.d.ts.map +1 -0
  37. package/dist/providers/kling.js +245 -0
  38. package/dist/providers/kling.js.map +1 -0
  39. package/dist/providers/models.d.ts +16 -0
  40. package/dist/providers/models.d.ts.map +1 -0
  41. package/dist/providers/models.js +152 -0
  42. package/dist/providers/models.js.map +1 -0
  43. package/dist/providers/newapi.d.ts +3 -0
  44. package/dist/providers/newapi.d.ts.map +1 -0
  45. package/dist/providers/newapi.js +203 -0
  46. package/dist/providers/newapi.js.map +1 -0
  47. package/dist/providers/openrouter.d.ts +21 -0
  48. package/dist/providers/openrouter.d.ts.map +1 -0
  49. package/dist/providers/openrouter.js +169 -0
  50. package/dist/providers/openrouter.js.map +1 -0
  51. package/dist/providers/request.d.ts +4 -0
  52. package/dist/providers/request.d.ts.map +1 -0
  53. package/dist/providers/request.js +20 -0
  54. package/dist/providers/request.js.map +1 -0
  55. package/dist/providers/task.d.ts +53 -0
  56. package/dist/providers/task.d.ts.map +1 -0
  57. package/dist/providers/task.js +209 -0
  58. package/dist/providers/task.js.map +1 -0
  59. package/dist/render.d.ts +53 -0
  60. package/dist/render.d.ts.map +1 -0
  61. package/dist/render.js +480 -0
  62. package/dist/render.js.map +1 -0
  63. package/dist/text-layer.d.ts +18 -0
  64. package/dist/text-layer.d.ts.map +1 -0
  65. package/dist/text-layer.js +168 -0
  66. package/dist/text-layer.js.map +1 -0
  67. package/dist/timeline-render.d.ts +33 -0
  68. package/dist/timeline-render.d.ts.map +1 -0
  69. package/dist/timeline-render.js +1051 -0
  70. package/dist/timeline-render.js.map +1 -0
  71. package/dist/timeline.d.ts +64 -0
  72. package/dist/timeline.d.ts.map +1 -0
  73. package/dist/timeline.js +246 -0
  74. package/dist/timeline.js.map +1 -0
  75. package/dist/tts/edge-tts.d.ts +22 -0
  76. package/dist/tts/edge-tts.d.ts.map +1 -0
  77. package/dist/tts/edge-tts.js +55 -0
  78. package/dist/tts/edge-tts.js.map +1 -0
  79. package/dist/types.d.ts +161 -0
  80. package/dist/types.d.ts.map +1 -0
  81. package/dist/types.js +13 -0
  82. package/dist/types.js.map +1 -0
  83. package/package.json +93 -0
  84. package/preview.png +0 -0
  85. package/skills/video-gen/SKILL.md +284 -0
@@ -0,0 +1,168 @@
1
+ import { spawnSync } from 'node:child_process';
2
+ import { existsSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import sharp from 'sharp';
5
+ import { VideoGenError } from './errors.js';
6
+ /**
7
+ * Text overlay rendering (C1): SVG template → PNG overlay via sharp.
8
+ *
9
+ * Chinese text is rendered by the LOCAL font stack (model never writes
10
+ * pixels — that's the Codex/hypeframes lesson: model-generated CJK text
11
+ * comes out garbled). Positioning follows Remotion's video-layout rule of a
12
+ * ~8% safe margin.
13
+ */
14
+ const FONT_STACK = 'PingFang SC, Hiragana Sans GB, Microsoft YaHei, Noto Sans CJK SC, sans-serif';
15
+ const SAFE_MARGIN_RATIO = 0.08;
16
+ export function hasCjkFont() {
17
+ const listed = spawnSync('fc-list', [':lang=zh-cn', 'family'], {
18
+ encoding: 'utf-8',
19
+ timeout: 2_000,
20
+ });
21
+ if (listed.status === 0 && listed.stdout.trim())
22
+ return true;
23
+ const windowsFonts = process.env.WINDIR ? join(process.env.WINDIR, 'Fonts') : '';
24
+ return [
25
+ '/System/Library/Fonts/PingFang.ttc',
26
+ '/System/Library/Fonts/STHeiti Light.ttc',
27
+ '/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc',
28
+ '/usr/share/fonts/truetype/wqy/wqy-zenhei.ttc',
29
+ windowsFonts && join(windowsFonts, 'msyh.ttc'),
30
+ windowsFonts && join(windowsFonts, 'simsun.ttc'),
31
+ ].some((path) => path !== '' && existsSync(path));
32
+ }
33
+ function escapeXml(text) {
34
+ return text
35
+ .replace(/&/g, '&')
36
+ .replace(/</g, '&lt;')
37
+ .replace(/>/g, '&gt;')
38
+ .replace(/"/g, '&quot;');
39
+ }
40
+ function estimatedTextWidth(text, fontSize) {
41
+ return Array.from(text).reduce((width, char) => {
42
+ if (/\s/u.test(char))
43
+ return width + fontSize * 0.33;
44
+ if (/[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}\p{Script=Hangul}\p{Extended_Pictographic}]/u.test(char) ||
45
+ /[MWmw@%&]/u.test(char)) {
46
+ return width + fontSize;
47
+ }
48
+ if (/[A-Z0-9]/u.test(char))
49
+ return width + fontSize * 0.75;
50
+ return width + fontSize * 0.62;
51
+ }, 0);
52
+ }
53
+ function wrapSubtitleLines(text, fontSize, maxWidth) {
54
+ const lines = [];
55
+ for (const paragraph of text.split('\n')) {
56
+ let line = '';
57
+ for (const token of paragraph.match(/\s+|[^\s]+/gu) ?? []) {
58
+ const candidate = line + token;
59
+ if (line.trim() && estimatedTextWidth(candidate, fontSize) > maxWidth) {
60
+ lines.push(line.trim());
61
+ line = token.trimStart();
62
+ }
63
+ else {
64
+ line = candidate;
65
+ }
66
+ while (estimatedTextWidth(line, fontSize) > maxWidth) {
67
+ const chars = Array.from(line);
68
+ let cut = 1;
69
+ while (cut < chars.length &&
70
+ estimatedTextWidth(chars.slice(0, cut + 1).join(''), fontSize) <= maxWidth) {
71
+ cut += 1;
72
+ }
73
+ lines.push(chars.slice(0, cut).join('').trim());
74
+ line = chars.slice(cut).join('').trimStart();
75
+ }
76
+ }
77
+ if (line.trim())
78
+ lines.push(line.trim());
79
+ }
80
+ return lines;
81
+ }
82
+ function positionFor(pos, width, height, blockH) {
83
+ const marginX = Math.round(width * SAFE_MARGIN_RATIO);
84
+ const marginY = Math.round(height * SAFE_MARGIN_RATIO);
85
+ if (pos === 'bottom-center') {
86
+ return { x: Math.round(width / 2), y: height - marginY - blockH, anchor: 'middle' };
87
+ }
88
+ if (pos === 'top-left') {
89
+ return { x: marginX, y: marginY, anchor: 'start' };
90
+ }
91
+ if (pos === 'center') {
92
+ return { x: Math.round(width / 2), y: Math.round((height - blockH) / 2), anchor: 'middle' };
93
+ }
94
+ return { x: marginX, y: height - marginY - blockH, anchor: 'start' };
95
+ }
96
+ function overlaySvg(overlay, width, height) {
97
+ const titleSize = Math.max(28, Math.round(height * 0.055));
98
+ const subtitleSize = Math.max(20, Math.round(height * 0.032));
99
+ const lineGap = Math.round(titleSize * 0.5);
100
+ const blockH = (overlay.title ? titleSize : 0) +
101
+ (overlay.title && overlay.subtitle ? lineGap : 0) +
102
+ (overlay.subtitle ? subtitleSize : 0);
103
+ const { x, y, anchor } = positionFor(overlay.position, width, height, blockH);
104
+ const lines = [];
105
+ let cursorY = y + titleSize;
106
+ if (overlay.title) {
107
+ lines.push(`<text x="${x}" y="${cursorY}" font-size="${titleSize}" font-weight="700" fill="#ffffff" text-anchor="${anchor}" font-family="${FONT_STACK}">${escapeXml(overlay.title)}</text>`);
108
+ cursorY += lineGap + (overlay.subtitle ? subtitleSize : 0);
109
+ }
110
+ if (overlay.subtitle) {
111
+ lines.push(`<text x="${x}" y="${cursorY}" font-size="${subtitleSize}" font-weight="400" fill="rgba(255,255,255,0.85)" text-anchor="${anchor}" font-family="${FONT_STACK}">${escapeXml(overlay.subtitle)}</text>`);
112
+ }
113
+ // Soft dark plate behind the text block for legibility over any image.
114
+ const platePad = Math.round(titleSize * 0.45);
115
+ const plateY = y - platePad;
116
+ const plateH = blockH + platePad * 2;
117
+ const plate = `<rect x="0" y="${plateY}" width="${width}" height="${plateH}" fill="rgba(0,0,0,0.32)"/>`;
118
+ return `<svg xmlns="http://www.w3.org/2000/svg" width="${width}" height="${height}">${plate}${lines.join('')}</svg>`;
119
+ }
120
+ /** Render an overlay to a PNG with alpha, sized to the video frame. */
121
+ export async function renderTextOverlay(opts) {
122
+ if (!opts.overlay.title && !opts.overlay.subtitle)
123
+ return null;
124
+ const text = `${opts.overlay.title ?? ''}${opts.overlay.subtitle ?? ''}`;
125
+ if (/\p{Script=Han}/u.test(text) && !hasCjkFont()) {
126
+ throw new VideoGenError('A CJK font is required for Chinese text overlays. Install PingFang, Microsoft YaHei, Noto Sans CJK, or WenQuanYi, then retry.', 'text-layer: CJK font missing');
127
+ }
128
+ const svg = overlaySvg(opts.overlay, opts.width, opts.height);
129
+ // Render the SVG at ~2x density for crisp text, then downscale to frame size.
130
+ await sharp(Buffer.from(svg, 'utf-8'), { density: 150 })
131
+ .resize(opts.width, opts.height)
132
+ .png()
133
+ .toFile(opts.outPath);
134
+ return opts.outPath;
135
+ }
136
+ /** Render one narration cue as a branded, bottom-centered burned subtitle. */
137
+ export async function renderBurnedSubtitle(opts) {
138
+ if (/\p{Script=Han}/u.test(opts.text) && !hasCjkFont()) {
139
+ throw new VideoGenError('A CJK font is required for burned Chinese subtitles. Install PingFang, Microsoft YaHei, Noto Sans CJK, or WenQuanYi, then retry.', 'text-layer: CJK font missing');
140
+ }
141
+ const fontSize = opts.style.fontSize ?? Math.max(20, Math.round(opts.height * 0.032));
142
+ const lineHeight = Math.round(fontSize * 1.35);
143
+ const margin = Math.round(opts.height * SAFE_MARGIN_RATIO);
144
+ const padding = Math.round(fontSize * 0.5);
145
+ const lines = wrapSubtitleLines(opts.text, fontSize, opts.width - margin * 2 - padding * 2);
146
+ const blockHeight = Math.max(1, lines.length) * lineHeight;
147
+ if (blockHeight + padding * 2 > opts.height - margin * 2) {
148
+ throw new VideoGenError('Burned subtitle text is too long to fit the video frame. Shorten the narration or reduce subtitles.fontSize.', 'text-layer: subtitle too long');
149
+ }
150
+ const plateY = opts.height - margin - blockHeight - padding;
151
+ const textY = plateY + padding + fontSize;
152
+ const textColor = opts.style.textColor ?? '#ffffff';
153
+ const backgroundColor = opts.style.backgroundColor ?? '#000000';
154
+ const backgroundOpacity = opts.style.backgroundOpacity ?? 0.55;
155
+ const tspans = lines
156
+ .map((line, index) => `<tspan x="${Math.round(opts.width / 2)}" y="${textY + index * lineHeight}">${escapeXml(line)}</tspan>`)
157
+ .join('');
158
+ const svg = `<svg xmlns="http://www.w3.org/2000/svg" width="${opts.width}" height="${opts.height}">
159
+ <rect x="0" y="${plateY}" width="${opts.width}" height="${blockHeight + padding * 2}" fill="${backgroundColor}" fill-opacity="${backgroundOpacity}"/>
160
+ <text font-size="${fontSize}" font-weight="500" fill="${textColor}" text-anchor="middle" font-family="${FONT_STACK}">${tspans}</text>
161
+ </svg>`;
162
+ await sharp(Buffer.from(svg, 'utf-8'), { density: 150 })
163
+ .resize(opts.width, opts.height)
164
+ .png()
165
+ .toFile(opts.outPath);
166
+ return opts.outPath;
167
+ }
168
+ //# sourceMappingURL=text-layer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-layer.js","sourceRoot":"","sources":["../src/text-layer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { type ActiveJobs } from './jobs/store.js';
2
+ import { type TtsProvider } from './tts/edge-tts.js';
3
+ import type { VideoGenSettings } from './types.js';
4
+ /**
5
+ * Timeline compose pipeline (C1–C4): promo/explainer videos from images/video
6
+ * clips + text overlays + TTS narration + motion, rendered LOCALLY with the
7
+ * vendored ffmpeg — no video-generation model, near-zero marginal cost.
8
+ *
9
+ * Pipeline (all stages are artifact-cached in the job dir, so a rerun after
10
+ * interruption resumes where it stopped):
11
+ * timeline-input.json → overlays/subtitles (sharp) → narration (Edge TTS) →
12
+ * normalized segment mp4s → xfade/concat video track →
13
+ * source/narration audio (+BGM ducking) → optional mov_text subtitles →
14
+ * ffprobe duration + QC frame extraction.
15
+ */
16
+ export type TimelineRunResult = {
17
+ jobId: string;
18
+ finalVideoPath: string;
19
+ segments: number;
20
+ durationSec: number;
21
+ subtitlePath?: string | undefined;
22
+ qcFrames: string[];
23
+ };
24
+ export declare function runTimeline(opts: {
25
+ timelineSpecPath: string;
26
+ cwd: string;
27
+ settings: VideoGenSettings;
28
+ activeJobs: ActiveJobs;
29
+ tts?: TtsProvider | undefined;
30
+ signal?: AbortSignal | undefined;
31
+ onUpdate?: ((msg: string) => void) | undefined;
32
+ }): Promise<TimelineRunResult>;
33
+ //# sourceMappingURL=timeline-render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeline-render.d.ts","sourceRoot":"","sources":["../src/timeline-render.ts"],"names":[],"mappings":"AAyBA,OAAO,EACL,KAAK,UAAU,EAOhB,MAAM,iBAAiB,CAAC;AASzB,OAAO,EAAkC,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD;;;;;;;;;;;GAWG;AAEH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAAC;AAwNF,wBAAsB,WAAW,CAAC,IAAI,EAAE;IACtC,gBAAgB,EAAE,MAAM,CAAC;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,UAAU,EAAE,UAAU,CAAC;IACvB,GAAG,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;IAC9B,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;IACjC,QAAQ,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;CAChD,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA8iC7B"}