@argo-video/cli 0.1.0 → 0.2.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 (144) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +2 -2
  3. package/dist/asset-server.d.ts +7 -0
  4. package/dist/asset-server.d.ts.map +1 -0
  5. package/dist/asset-server.js +69 -0
  6. package/dist/asset-server.js.map +1 -0
  7. package/dist/captions.d.ts +17 -0
  8. package/dist/captions.d.ts.map +1 -0
  9. package/dist/captions.js +23 -0
  10. package/dist/captions.js.map +1 -0
  11. package/dist/cli.d.ts +3 -0
  12. package/dist/cli.d.ts.map +1 -0
  13. package/dist/cli.js +87 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/config.d.ts +49 -0
  16. package/dist/config.d.ts.map +1 -0
  17. package/dist/config.js +76 -0
  18. package/dist/config.js.map +1 -0
  19. package/dist/export.d.ts +19 -0
  20. package/dist/export.d.ts.map +1 -0
  21. package/dist/export.js +66 -0
  22. package/dist/export.js.map +1 -0
  23. package/dist/fixtures.d.ts +13 -0
  24. package/dist/fixtures.d.ts.map +1 -0
  25. package/dist/fixtures.js +49 -0
  26. package/dist/fixtures.js.map +1 -0
  27. package/dist/index.d.ts +8 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +14 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/init.d.ts +2 -0
  32. package/dist/init.d.ts.map +1 -0
  33. package/{src/init.ts → dist/init.js} +39 -54
  34. package/dist/init.js.map +1 -0
  35. package/dist/narration.d.ts +32 -0
  36. package/dist/narration.d.ts.map +1 -0
  37. package/dist/narration.js +86 -0
  38. package/dist/narration.js.map +1 -0
  39. package/dist/overlays/index.d.ts +13 -0
  40. package/dist/overlays/index.d.ts.map +1 -0
  41. package/dist/overlays/index.js +45 -0
  42. package/dist/overlays/index.js.map +1 -0
  43. package/dist/overlays/manifest.d.ts +5 -0
  44. package/dist/overlays/manifest.d.ts.map +1 -0
  45. package/dist/overlays/manifest.js +52 -0
  46. package/dist/overlays/manifest.js.map +1 -0
  47. package/dist/overlays/motion.d.ts +4 -0
  48. package/dist/overlays/motion.d.ts.map +1 -0
  49. package/dist/overlays/motion.js +25 -0
  50. package/dist/overlays/motion.js.map +1 -0
  51. package/dist/overlays/templates.d.ts +8 -0
  52. package/dist/overlays/templates.d.ts.map +1 -0
  53. package/dist/overlays/templates.js +102 -0
  54. package/dist/overlays/templates.js.map +1 -0
  55. package/dist/overlays/types.d.ts +46 -0
  56. package/dist/overlays/types.d.ts.map +1 -0
  57. package/dist/overlays/types.js +25 -0
  58. package/dist/overlays/types.js.map +1 -0
  59. package/dist/overlays/zones.d.ts +23 -0
  60. package/dist/overlays/zones.d.ts.map +1 -0
  61. package/dist/overlays/zones.js +117 -0
  62. package/dist/overlays/zones.js.map +1 -0
  63. package/dist/pipeline.d.ts +3 -0
  64. package/dist/pipeline.d.ts.map +1 -0
  65. package/dist/pipeline.js +109 -0
  66. package/dist/pipeline.js.map +1 -0
  67. package/dist/record.d.ts +15 -0
  68. package/dist/record.d.ts.map +1 -0
  69. package/dist/record.js +110 -0
  70. package/dist/record.js.map +1 -0
  71. package/dist/tts/align.d.ts +26 -0
  72. package/dist/tts/align.d.ts.map +1 -0
  73. package/dist/tts/align.js +53 -0
  74. package/dist/tts/align.js.map +1 -0
  75. package/dist/tts/cache.d.ts +31 -0
  76. package/dist/tts/cache.d.ts.map +1 -0
  77. package/dist/tts/cache.js +51 -0
  78. package/dist/tts/cache.js.map +1 -0
  79. package/dist/tts/engine.d.ts +41 -0
  80. package/dist/tts/engine.d.ts.map +1 -0
  81. package/dist/tts/engine.js +108 -0
  82. package/dist/tts/engine.js.map +1 -0
  83. package/dist/tts/generate.d.ts +21 -0
  84. package/dist/tts/generate.d.ts.map +1 -0
  85. package/dist/tts/generate.js +61 -0
  86. package/dist/tts/generate.js.map +1 -0
  87. package/dist/tts/kokoro.d.ts +30 -0
  88. package/dist/tts/kokoro.d.ts.map +1 -0
  89. package/dist/tts/kokoro.js +66 -0
  90. package/dist/tts/kokoro.js.map +1 -0
  91. package/package.json +13 -1
  92. package/.claude/settings.local.json +0 -34
  93. package/DESIGN.md +0 -261
  94. package/docs/enhancement-proposal.md +0 -262
  95. package/docs/superpowers/plans/2026-03-12-argo.md +0 -208
  96. package/docs/superpowers/plans/2026-03-12-editorial-overlay-system.md +0 -1560
  97. package/docs/superpowers/plans/2026-03-13-npm-rename-skill-showcase.md +0 -499
  98. package/docs/superpowers/specs/2026-03-13-npm-rename-skill-showcase-design.md +0 -109
  99. package/skills/argo-demo-creator.md +0 -355
  100. package/src/asset-server.ts +0 -81
  101. package/src/captions.ts +0 -36
  102. package/src/cli.ts +0 -97
  103. package/src/config.ts +0 -125
  104. package/src/export.ts +0 -93
  105. package/src/fixtures.ts +0 -50
  106. package/src/index.ts +0 -41
  107. package/src/narration.ts +0 -31
  108. package/src/overlays/index.ts +0 -54
  109. package/src/overlays/manifest.ts +0 -68
  110. package/src/overlays/motion.ts +0 -27
  111. package/src/overlays/templates.ts +0 -121
  112. package/src/overlays/types.ts +0 -73
  113. package/src/overlays/zones.ts +0 -82
  114. package/src/pipeline.ts +0 -120
  115. package/src/record.ts +0 -123
  116. package/src/tts/align.ts +0 -75
  117. package/src/tts/cache.ts +0 -65
  118. package/src/tts/engine.ts +0 -147
  119. package/src/tts/generate.ts +0 -83
  120. package/src/tts/kokoro.ts +0 -51
  121. package/tests/asset-server.test.ts +0 -67
  122. package/tests/captions.test.ts +0 -76
  123. package/tests/cli.test.ts +0 -131
  124. package/tests/config.test.ts +0 -150
  125. package/tests/e2e/fake-server.ts +0 -45
  126. package/tests/e2e/record.e2e.test.ts +0 -131
  127. package/tests/export.test.ts +0 -155
  128. package/tests/fixtures.test.ts +0 -74
  129. package/tests/init.test.ts +0 -77
  130. package/tests/narration.test.ts +0 -120
  131. package/tests/overlays/index.test.ts +0 -73
  132. package/tests/overlays/manifest.test.ts +0 -120
  133. package/tests/overlays/motion.test.ts +0 -34
  134. package/tests/overlays/templates.test.ts +0 -69
  135. package/tests/overlays/types.test.ts +0 -36
  136. package/tests/overlays/zones.test.ts +0 -49
  137. package/tests/pipeline.test.ts +0 -177
  138. package/tests/record.test.ts +0 -87
  139. package/tests/tts/align.test.ts +0 -118
  140. package/tests/tts/cache.test.ts +0 -110
  141. package/tests/tts/engine.test.ts +0 -204
  142. package/tests/tts/generate.test.ts +0 -177
  143. package/tests/tts/kokoro.test.ts +0 -25
  144. package/tsconfig.json +0 -19
@@ -0,0 +1,41 @@
1
+ /**
2
+ * TTS Engine interface and WAV utilities for Argo.
3
+ */
4
+ export interface TTSEngineOptions {
5
+ voice?: string;
6
+ speed?: number;
7
+ lang?: string;
8
+ }
9
+ export interface TTSEngine {
10
+ generate(text: string, options: TTSEngineOptions): Promise<Buffer>;
11
+ }
12
+ /**
13
+ * Creates a valid WAV file buffer from Float32Array samples.
14
+ * Format: mono, 32-bit IEEE float, given sample rate.
15
+ */
16
+ export declare function createWavBuffer(samples: Float32Array, sampleRate?: number): Buffer;
17
+ export interface WavHeader {
18
+ sampleRate: number;
19
+ numChannels: number;
20
+ bitsPerSample: number;
21
+ audioFormat: number;
22
+ dataSize: number;
23
+ dataOffset: number;
24
+ durationMs: number;
25
+ }
26
+ /**
27
+ * Parses a WAV file header. Searches for the 'data' chunk rather than
28
+ * assuming a fixed offset.
29
+ */
30
+ export declare function parseWavHeader(wav: Buffer): WavHeader;
31
+ /**
32
+ * Creates a mock TTS engine that produces silent WAV buffers of the given
33
+ * duration and records all calls for test assertions.
34
+ */
35
+ export declare function createMockTTSEngine(durationMs?: number): TTSEngine & {
36
+ calls: Array<{
37
+ text: string;
38
+ options: TTSEngineOptions;
39
+ }>;
40
+ };
41
+ //# sourceMappingURL=engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/tts/engine.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACpE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,YAAY,EAAE,UAAU,SAAQ,GAAG,MAAM,CAoCjF;AAED,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAuDrD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,SAAM,GACf,SAAS,GAAG;IAAE,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,gBAAgB,CAAA;KAAE,CAAC,CAAA;CAAE,CAa3E"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * TTS Engine interface and WAV utilities for Argo.
3
+ */
4
+ /**
5
+ * Creates a valid WAV file buffer from Float32Array samples.
6
+ * Format: mono, 32-bit IEEE float, given sample rate.
7
+ */
8
+ export function createWavBuffer(samples, sampleRate = 24000) {
9
+ const numChannels = 1;
10
+ const bitsPerSample = 32;
11
+ const bytesPerSample = bitsPerSample / 8;
12
+ const blockAlign = numChannels * bytesPerSample;
13
+ const byteRate = sampleRate * blockAlign;
14
+ const dataSize = samples.length * bytesPerSample;
15
+ const headerSize = 44;
16
+ const buf = Buffer.alloc(headerSize + dataSize);
17
+ // RIFF header
18
+ buf.write('RIFF', 0, 'ascii');
19
+ buf.writeUInt32LE(headerSize + dataSize - 8, 4);
20
+ buf.write('WAVE', 8, 'ascii');
21
+ // fmt chunk
22
+ buf.write('fmt ', 12, 'ascii');
23
+ buf.writeUInt32LE(16, 16); // fmt chunk size
24
+ buf.writeUInt16LE(3, 20); // audioFormat = 3 (IEEE float)
25
+ buf.writeUInt16LE(numChannels, 22);
26
+ buf.writeUInt32LE(sampleRate, 24);
27
+ buf.writeUInt32LE(byteRate, 28);
28
+ buf.writeUInt16LE(blockAlign, 32);
29
+ buf.writeUInt16LE(bitsPerSample, 34);
30
+ // data chunk
31
+ buf.write('data', 36, 'ascii');
32
+ buf.writeUInt32LE(dataSize, 40);
33
+ // sample data
34
+ for (let i = 0; i < samples.length; i++) {
35
+ buf.writeFloatLE(samples[i], headerSize + i * bytesPerSample);
36
+ }
37
+ return buf;
38
+ }
39
+ /**
40
+ * Parses a WAV file header. Searches for the 'data' chunk rather than
41
+ * assuming a fixed offset.
42
+ */
43
+ export function parseWavHeader(wav) {
44
+ if (wav.length < 44) {
45
+ throw new Error('Buffer too small to be a valid WAV file');
46
+ }
47
+ if (wav.toString('ascii', 0, 4) !== 'RIFF') {
48
+ throw new Error('Not a valid WAV file: missing RIFF header');
49
+ }
50
+ if (wav.toString('ascii', 8, 12) !== 'WAVE') {
51
+ throw new Error('Not a valid WAV file: missing WAVE marker');
52
+ }
53
+ // Validate and parse fmt chunk (expected at byte 12)
54
+ if (wav.toString('ascii', 12, 16) !== 'fmt ') {
55
+ throw new Error('Not a valid WAV file: fmt chunk not found at expected offset');
56
+ }
57
+ const audioFormat = wav.readUInt16LE(20);
58
+ const numChannels = wav.readUInt16LE(22);
59
+ const sampleRate = wav.readUInt32LE(24);
60
+ const bitsPerSample = wav.readUInt16LE(34);
61
+ // Search for 'data' chunk
62
+ let offset = 12; // after 'WAVE'
63
+ let dataSize = 0;
64
+ let dataOffset = 0;
65
+ while (offset < wav.length - 8) {
66
+ const chunkId = wav.toString('ascii', offset, offset + 4);
67
+ const chunkSize = wav.readUInt32LE(offset + 4);
68
+ if (chunkId === 'data') {
69
+ dataSize = chunkSize;
70
+ dataOffset = offset + 8;
71
+ break;
72
+ }
73
+ offset += 8 + chunkSize;
74
+ }
75
+ if (dataOffset === 0) {
76
+ throw new Error('No data chunk found in WAV file');
77
+ }
78
+ const bytesPerSample = bitsPerSample / 8;
79
+ const totalSamples = dataSize / (bytesPerSample * numChannels);
80
+ const durationMs = (totalSamples / sampleRate) * 1000;
81
+ return {
82
+ sampleRate,
83
+ numChannels,
84
+ bitsPerSample,
85
+ audioFormat,
86
+ dataSize,
87
+ dataOffset,
88
+ durationMs,
89
+ };
90
+ }
91
+ /**
92
+ * Creates a mock TTS engine that produces silent WAV buffers of the given
93
+ * duration and records all calls for test assertions.
94
+ */
95
+ export function createMockTTSEngine(durationMs = 500) {
96
+ const calls = [];
97
+ return {
98
+ calls,
99
+ async generate(text, options) {
100
+ calls.push({ text, options });
101
+ const sampleRate = 24000;
102
+ const numSamples = Math.round((durationMs / 1000) * sampleRate);
103
+ const samples = new Float32Array(numSamples); // zeros = silence
104
+ return createWavBuffer(samples, sampleRate);
105
+ },
106
+ };
107
+ }
108
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/tts/engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * TTS clip generation with manifest parsing and cache integration.
3
+ */
4
+ import type { TTSEngine } from './engine.js';
5
+ export interface GenerateClipsOptions {
6
+ manifestPath: string;
7
+ demoName: string;
8
+ engine: TTSEngine;
9
+ projectRoot: string;
10
+ defaults?: {
11
+ voice?: string;
12
+ speed?: number;
13
+ };
14
+ }
15
+ export interface ClipResult {
16
+ scene: string;
17
+ clipPath: string;
18
+ durationMs: number;
19
+ }
20
+ export declare function generateClips(options: GenerateClipsOptions): Promise<ClipResult[]>;
21
+ //# sourceMappingURL=generate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/tts/generate.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAI7C,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,SAAS,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/C;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CA+DxF"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * TTS clip generation with manifest parsing and cache integration.
3
+ */
4
+ import fs from 'node:fs';
5
+ import { parseWavHeader } from './engine.js';
6
+ import { ClipCache } from './cache.js';
7
+ export async function generateClips(options) {
8
+ const { manifestPath, demoName, engine, projectRoot, defaults } = options;
9
+ // 1. Check manifest exists
10
+ if (!fs.existsSync(manifestPath)) {
11
+ throw new Error(`Manifest file not found: ${manifestPath}`);
12
+ }
13
+ // 2. Read and parse JSON
14
+ let rawEntries;
15
+ try {
16
+ const content = fs.readFileSync(manifestPath, 'utf-8');
17
+ rawEntries = JSON.parse(content);
18
+ }
19
+ catch (err) {
20
+ if (err instanceof SyntaxError) {
21
+ throw new Error(`Failed to parse manifest ${manifestPath}: ${err.message}`);
22
+ }
23
+ throw err;
24
+ }
25
+ if (!Array.isArray(rawEntries)) {
26
+ throw new Error(`Manifest ${manifestPath} must contain a JSON array`);
27
+ }
28
+ // 3. Validate entries
29
+ for (const entry of rawEntries) {
30
+ const e = entry;
31
+ if (typeof e.scene !== 'string' || typeof e.text !== 'string') {
32
+ throw new Error('Manifest entry missing required field: scene and text are required');
33
+ }
34
+ }
35
+ const cache = new ClipCache(projectRoot);
36
+ const results = [];
37
+ for (const raw of rawEntries) {
38
+ const r = raw;
39
+ // 4. Build ManifestEntry with defaults
40
+ const manifestEntry = {
41
+ scene: r.scene,
42
+ text: r.text,
43
+ voice: r.voice ?? defaults?.voice,
44
+ speed: r.speed ?? defaults?.speed,
45
+ };
46
+ const clipPath = cache.getClipPath(demoName, manifestEntry);
47
+ // 5/6. Check cache or generate
48
+ if (!cache.isCached(demoName, manifestEntry)) {
49
+ const wavBuffer = await engine.generate(manifestEntry.text, {
50
+ voice: manifestEntry.voice,
51
+ speed: manifestEntry.speed,
52
+ });
53
+ cache.cacheClip(demoName, manifestEntry, wavBuffer);
54
+ }
55
+ const wavBuf = fs.readFileSync(clipPath);
56
+ const { durationMs } = parseWavHeader(wavBuf);
57
+ results.push({ scene: manifestEntry.scene, clipPath, durationMs });
58
+ }
59
+ return results;
60
+ }
61
+ //# sourceMappingURL=generate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/tts/generate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { TTSEngine, TTSEngineOptions } from './engine.js';
2
+ export interface KokoroEngineOptions {
3
+ modelId?: string;
4
+ dtype?: 'fp32' | 'fp16' | 'q8' | 'q4' | 'q4f16';
5
+ device?: 'wasm' | 'webgpu' | 'cpu' | null;
6
+ onProgress?: (progress: {
7
+ status: string;
8
+ progress?: number;
9
+ file?: string;
10
+ }) => void;
11
+ }
12
+ export declare class KokoroEngine implements TTSEngine {
13
+ private tts;
14
+ private modelId;
15
+ private dtype;
16
+ private device;
17
+ private onProgress?;
18
+ constructor(options?: KokoroEngineOptions);
19
+ private getTTS;
20
+ generate(text: string, options: TTSEngineOptions): Promise<Buffer>;
21
+ /**
22
+ * Stream audio generation sentence-by-sentence.
23
+ * Yields WAV buffers for each sentence as they're generated.
24
+ */
25
+ stream(text: string, options: TTSEngineOptions): AsyncGenerator<{
26
+ text: string;
27
+ audio: Buffer;
28
+ }>;
29
+ }
30
+ //# sourceMappingURL=kokoro.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kokoro.d.ts","sourceRoot":"","sources":["../../src/tts/kokoro.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/D,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,OAAO,CAAC;IAChD,MAAM,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,IAAI,CAAC;IAC1C,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CACvF;AAED,qBAAa,YAAa,YAAW,SAAS;IAC5C,OAAO,CAAC,GAAG,CAAa;IACxB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,MAAM,CAAmC;IACjD,OAAO,CAAC,UAAU,CAAC,CAAoC;gBAE3C,OAAO,CAAC,EAAE,mBAAmB;YAO3B,MAAM;IAmBd,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC;IAgBxE;;;OAGG;IACI,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,cAAc,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CAaxG"}
@@ -0,0 +1,66 @@
1
+ export class KokoroEngine {
2
+ tts = null;
3
+ modelId;
4
+ dtype;
5
+ device;
6
+ onProgress;
7
+ constructor(options) {
8
+ this.modelId = options?.modelId ?? 'onnx-community/Kokoro-82M-v1.0-ONNX';
9
+ this.dtype = options?.dtype ?? 'q8';
10
+ this.device = options?.device ?? null;
11
+ this.onProgress = options?.onProgress;
12
+ }
13
+ async getTTS() {
14
+ if (this.tts)
15
+ return this.tts;
16
+ try {
17
+ const { KokoroTTS } = await import('kokoro-js');
18
+ this.tts = await KokoroTTS.from_pretrained(this.modelId, {
19
+ dtype: this.dtype,
20
+ device: this.device,
21
+ progress_callback: this.onProgress ?? undefined,
22
+ });
23
+ }
24
+ catch (err) {
25
+ throw new Error(`Failed to initialize Kokoro TTS (model: ${this.modelId}, dtype: ${this.dtype}). ` +
26
+ `This may require an internet connection for first-time model download. ` +
27
+ `Original error: ${err.message}`);
28
+ }
29
+ return this.tts;
30
+ }
31
+ async generate(text, options) {
32
+ if (!text?.trim())
33
+ throw new Error('TTS text must not be empty');
34
+ const tts = await this.getTTS();
35
+ const audio = await tts.generate(text, {
36
+ voice: options.voice ?? 'af_heart',
37
+ speed: options.speed ?? 1.0,
38
+ });
39
+ const samples = audio.data ?? audio.audio;
40
+ if (!samples || !(samples instanceof Float32Array)) {
41
+ throw new Error('kokoro-js returned unexpected audio format. Check kokoro-js version.');
42
+ }
43
+ const sampleRate = audio.sampling_rate;
44
+ const { createWavBuffer } = await import('./engine.js');
45
+ return createWavBuffer(samples, sampleRate);
46
+ }
47
+ /**
48
+ * Stream audio generation sentence-by-sentence.
49
+ * Yields WAV buffers for each sentence as they're generated.
50
+ */
51
+ async *stream(text, options) {
52
+ if (!text?.trim())
53
+ throw new Error('TTS text must not be empty');
54
+ const tts = await this.getTTS();
55
+ const { createWavBuffer } = await import('./engine.js');
56
+ for await (const chunk of tts.stream(text, {
57
+ voice: options.voice ?? 'af_heart',
58
+ speed: options.speed ?? 1.0,
59
+ })) {
60
+ const samples = chunk.audio.data ?? chunk.audio.audio;
61
+ const sampleRate = chunk.audio.sampling_rate;
62
+ yield { text: chunk.text, audio: createWavBuffer(samples, sampleRate) };
63
+ }
64
+ }
65
+ }
66
+ //# sourceMappingURL=kokoro.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kokoro.js","sourceRoot":"","sources":["../../src/tts/kokoro.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@argo-video/cli",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "Turn Playwright demo scripts into polished product demo videos with AI voiceover",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -28,6 +28,18 @@
28
28
  "commander": "^12.0.0",
29
29
  "kokoro-js": "^1.2.1"
30
30
  },
31
+ "publishConfig": {
32
+ "access": "public"
33
+ },
34
+ "repository": {
35
+ "type": "git",
36
+ "url": "https://github.com/shreyaskarnik/argo.git"
37
+ },
38
+ "license": "MIT",
39
+ "files": [
40
+ "dist",
41
+ "bin"
42
+ ],
31
43
  "devDependencies": {
32
44
  "@playwright/test": "^1.50.0",
33
45
  "@types/node": "^25.5.0",
@@ -1,34 +0,0 @@
1
- {
2
- "permissions": {
3
- "allow": [
4
- "Bash(git add:*)",
5
- "Bash(git commit:*)",
6
- "Bash(gh repo:*)",
7
- "Bash(gh api:*)",
8
- "Bash(/Users/shreyas/work/rnd/argo/bin/argo.js:*)",
9
- "Bash(chmod +x /Users/shreyas/work/rnd/argo/bin/argo.js)",
10
- "Bash(npm install:*)",
11
- "Bash(npx tsc:*)",
12
- "Bash(ls /Users/shreyas/work/rnd/argo/src/ /Users/shreyas/work/rnd/argo/tests/ 2>/dev/null; ls /Users/shreyas/work/rnd/argo/vitest.config.* 2>/dev/null)",
13
- "Bash(npx vitest:*)",
14
- "Bash(CI=true npx vitest run tests/tts/kokoro.test.ts 2>&1)",
15
- "mcp__plugin_context7_context7__resolve-library-id",
16
- "mcp__plugin_context7_context7__query-docs",
17
- "Bash(node -e \"\nimport\\('@huggingface/transformers'\\).then\\(async \\(m\\) => {\n // Check what task maps to what\n console.log\\('SUPPORTED_TASKS keys that include audio or speech:'\\);\n const keys = Object.keys\\(m\\).filter\\(k => k.toLowerCase\\(\\).includes\\('task'\\) || k.toLowerCase\\(\\).includes\\('mapping'\\)\\);\n console.log\\(keys.slice\\(0, 20\\)\\);\n}\\).catch\\(e => console.error\\(e.message\\)\\);\n\" 2>&1)",
18
- "Bash(node -e \"\nimport\\('@huggingface/transformers'\\).then\\(async \\(m\\) => {\n try {\n const p = await m.pipeline\\('text-to-audio', 'onnx-community/Kokoro-82M-v1.0-ONNX', { dtype: 'fp32' }\\);\n console.log\\('SUCCESS with text-to-audio'\\);\n } catch\\(e\\) {\n console.log\\('text-to-audio error:', e.message\\);\n }\n}\\).catch\\(e => console.error\\(e.message\\)\\);\n\" 2>&1)",
19
- "Bash(npm ls:*)",
20
- "Bash(npm run:*)",
21
- "Bash(node bin/argo.js init 2>&1)",
22
- "Bash(node bin/argo.js --help 2>&1)",
23
- "Bash(rm -rf demos argo.config.ts && node bin/argo.js init 2>&1)",
24
- "Bash(git rm:*)",
25
- "Bash(rm -f argo.config.ts argo.config.js && rm -rf demos/ && npm run build 2>&1 && node bin/argo.js init 2>&1)",
26
- "Bash(node -e \"import\\('./dist/config.js'\\).then\\(m => m.loadConfig\\(process.cwd\\(\\)\\)\\).then\\(c => console.log\\(JSON.stringify\\(c, null, 2\\)\\)\\)\" 2>&1)",
27
- "Bash(rm -rf demos argo.config.* playwright.config.ts && npm run build 2>&1 && node bin/argo.js init 2>&1)",
28
- "Bash(node bin/argo.js record example 2>&1)",
29
- "Bash(npx playwright:*)",
30
- "Bash(npm link:*)",
31
- "Bash(node bin/argo.js pipeline example 2>&1)"
32
- ]
33
- }
34
- }