@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.
- package/LICENSE +21 -0
- package/README.md +2 -2
- package/dist/asset-server.d.ts +7 -0
- package/dist/asset-server.d.ts.map +1 -0
- package/dist/asset-server.js +69 -0
- package/dist/asset-server.js.map +1 -0
- package/dist/captions.d.ts +17 -0
- package/dist/captions.d.ts.map +1 -0
- package/dist/captions.js +23 -0
- package/dist/captions.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +87 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +49 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +76 -0
- package/dist/config.js.map +1 -0
- package/dist/export.d.ts +19 -0
- package/dist/export.d.ts.map +1 -0
- package/dist/export.js +66 -0
- package/dist/export.js.map +1 -0
- package/dist/fixtures.d.ts +13 -0
- package/dist/fixtures.d.ts.map +1 -0
- package/dist/fixtures.js +49 -0
- package/dist/fixtures.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/init.d.ts +2 -0
- package/dist/init.d.ts.map +1 -0
- package/{src/init.ts → dist/init.js} +39 -54
- package/dist/init.js.map +1 -0
- package/dist/narration.d.ts +32 -0
- package/dist/narration.d.ts.map +1 -0
- package/dist/narration.js +86 -0
- package/dist/narration.js.map +1 -0
- package/dist/overlays/index.d.ts +13 -0
- package/dist/overlays/index.d.ts.map +1 -0
- package/dist/overlays/index.js +45 -0
- package/dist/overlays/index.js.map +1 -0
- package/dist/overlays/manifest.d.ts +5 -0
- package/dist/overlays/manifest.d.ts.map +1 -0
- package/dist/overlays/manifest.js +52 -0
- package/dist/overlays/manifest.js.map +1 -0
- package/dist/overlays/motion.d.ts +4 -0
- package/dist/overlays/motion.d.ts.map +1 -0
- package/dist/overlays/motion.js +25 -0
- package/dist/overlays/motion.js.map +1 -0
- package/dist/overlays/templates.d.ts +8 -0
- package/dist/overlays/templates.d.ts.map +1 -0
- package/dist/overlays/templates.js +102 -0
- package/dist/overlays/templates.js.map +1 -0
- package/dist/overlays/types.d.ts +46 -0
- package/dist/overlays/types.d.ts.map +1 -0
- package/dist/overlays/types.js +25 -0
- package/dist/overlays/types.js.map +1 -0
- package/dist/overlays/zones.d.ts +23 -0
- package/dist/overlays/zones.d.ts.map +1 -0
- package/dist/overlays/zones.js +117 -0
- package/dist/overlays/zones.js.map +1 -0
- package/dist/pipeline.d.ts +3 -0
- package/dist/pipeline.d.ts.map +1 -0
- package/dist/pipeline.js +109 -0
- package/dist/pipeline.js.map +1 -0
- package/dist/record.d.ts +15 -0
- package/dist/record.d.ts.map +1 -0
- package/dist/record.js +110 -0
- package/dist/record.js.map +1 -0
- package/dist/tts/align.d.ts +26 -0
- package/dist/tts/align.d.ts.map +1 -0
- package/dist/tts/align.js +53 -0
- package/dist/tts/align.js.map +1 -0
- package/dist/tts/cache.d.ts +31 -0
- package/dist/tts/cache.d.ts.map +1 -0
- package/dist/tts/cache.js +51 -0
- package/dist/tts/cache.js.map +1 -0
- package/dist/tts/engine.d.ts +41 -0
- package/dist/tts/engine.d.ts.map +1 -0
- package/dist/tts/engine.js +108 -0
- package/dist/tts/engine.js.map +1 -0
- package/dist/tts/generate.d.ts +21 -0
- package/dist/tts/generate.d.ts.map +1 -0
- package/dist/tts/generate.js +61 -0
- package/dist/tts/generate.js.map +1 -0
- package/dist/tts/kokoro.d.ts +30 -0
- package/dist/tts/kokoro.d.ts.map +1 -0
- package/dist/tts/kokoro.js +66 -0
- package/dist/tts/kokoro.js.map +1 -0
- package/package.json +13 -1
- package/.claude/settings.local.json +0 -34
- package/DESIGN.md +0 -261
- package/docs/enhancement-proposal.md +0 -262
- package/docs/superpowers/plans/2026-03-12-argo.md +0 -208
- package/docs/superpowers/plans/2026-03-12-editorial-overlay-system.md +0 -1560
- package/docs/superpowers/plans/2026-03-13-npm-rename-skill-showcase.md +0 -499
- package/docs/superpowers/specs/2026-03-13-npm-rename-skill-showcase-design.md +0 -109
- package/skills/argo-demo-creator.md +0 -355
- package/src/asset-server.ts +0 -81
- package/src/captions.ts +0 -36
- package/src/cli.ts +0 -97
- package/src/config.ts +0 -125
- package/src/export.ts +0 -93
- package/src/fixtures.ts +0 -50
- package/src/index.ts +0 -41
- package/src/narration.ts +0 -31
- package/src/overlays/index.ts +0 -54
- package/src/overlays/manifest.ts +0 -68
- package/src/overlays/motion.ts +0 -27
- package/src/overlays/templates.ts +0 -121
- package/src/overlays/types.ts +0 -73
- package/src/overlays/zones.ts +0 -82
- package/src/pipeline.ts +0 -120
- package/src/record.ts +0 -123
- package/src/tts/align.ts +0 -75
- package/src/tts/cache.ts +0 -65
- package/src/tts/engine.ts +0 -147
- package/src/tts/generate.ts +0 -83
- package/src/tts/kokoro.ts +0 -51
- package/tests/asset-server.test.ts +0 -67
- package/tests/captions.test.ts +0 -76
- package/tests/cli.test.ts +0 -131
- package/tests/config.test.ts +0 -150
- package/tests/e2e/fake-server.ts +0 -45
- package/tests/e2e/record.e2e.test.ts +0 -131
- package/tests/export.test.ts +0 -155
- package/tests/fixtures.test.ts +0 -74
- package/tests/init.test.ts +0 -77
- package/tests/narration.test.ts +0 -120
- package/tests/overlays/index.test.ts +0 -73
- package/tests/overlays/manifest.test.ts +0 -120
- package/tests/overlays/motion.test.ts +0 -34
- package/tests/overlays/templates.test.ts +0 -69
- package/tests/overlays/types.test.ts +0 -36
- package/tests/overlays/zones.test.ts +0 -49
- package/tests/pipeline.test.ts +0 -177
- package/tests/record.test.ts +0 -87
- package/tests/tts/align.test.ts +0 -118
- package/tests/tts/cache.test.ts +0 -110
- package/tests/tts/engine.test.ts +0 -204
- package/tests/tts/generate.test.ts +0 -177
- package/tests/tts/kokoro.test.ts +0 -25
- 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.
|
|
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
|
-
}
|