@argo-video/cli 0.6.0 → 0.7.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 (75) hide show
  1. package/README.md +27 -3
  2. package/dist/camera.d.ts +1 -0
  3. package/dist/camera.d.ts.map +1 -1
  4. package/dist/camera.js +99 -37
  5. package/dist/camera.js.map +1 -1
  6. package/dist/cli.d.ts.map +1 -1
  7. package/dist/cli.js +15 -1
  8. package/dist/cli.js.map +1 -1
  9. package/dist/config.d.ts +1 -0
  10. package/dist/config.d.ts.map +1 -1
  11. package/dist/config.js.map +1 -1
  12. package/dist/doctor.d.ts +9 -0
  13. package/dist/doctor.d.ts.map +1 -0
  14. package/dist/doctor.js +119 -0
  15. package/dist/doctor.js.map +1 -0
  16. package/dist/export.d.ts +2 -0
  17. package/dist/export.d.ts.map +1 -1
  18. package/dist/export.js +35 -0
  19. package/dist/export.js.map +1 -1
  20. package/dist/index.d.ts +2 -0
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +3 -0
  23. package/dist/index.js.map +1 -1
  24. package/dist/pipeline.d.ts +4 -1
  25. package/dist/pipeline.d.ts.map +1 -1
  26. package/dist/pipeline.js +3 -1
  27. package/dist/pipeline.js.map +1 -1
  28. package/dist/record.d.ts +1 -0
  29. package/dist/record.d.ts.map +1 -1
  30. package/dist/record.js +1 -0
  31. package/dist/record.js.map +1 -1
  32. package/dist/tts/cache.d.ts +1 -0
  33. package/dist/tts/cache.d.ts.map +1 -1
  34. package/dist/tts/cache.js +2 -2
  35. package/dist/tts/cache.js.map +1 -1
  36. package/dist/tts/engine.d.ts +5 -0
  37. package/dist/tts/engine.d.ts.map +1 -1
  38. package/dist/tts/engine.js +22 -0
  39. package/dist/tts/engine.js.map +1 -1
  40. package/dist/tts/engines/elevenlabs.d.ts +17 -0
  41. package/dist/tts/engines/elevenlabs.d.ts.map +1 -0
  42. package/dist/tts/engines/elevenlabs.js +52 -0
  43. package/dist/tts/engines/elevenlabs.js.map +1 -0
  44. package/dist/tts/engines/gemini.d.ts +13 -0
  45. package/dist/tts/engines/gemini.d.ts.map +1 -0
  46. package/dist/tts/engines/gemini.js +53 -0
  47. package/dist/tts/engines/gemini.js.map +1 -0
  48. package/dist/tts/engines/index.d.ts +28 -0
  49. package/dist/tts/engines/index.d.ts.map +1 -0
  50. package/dist/tts/engines/index.js +21 -0
  51. package/dist/tts/engines/index.js.map +1 -0
  52. package/dist/tts/engines/kokoro.d.ts +27 -0
  53. package/dist/tts/engines/kokoro.d.ts.map +1 -0
  54. package/dist/tts/engines/kokoro.js +76 -0
  55. package/dist/tts/engines/kokoro.js.map +1 -0
  56. package/dist/tts/engines/mlx-audio.d.ts +14 -0
  57. package/dist/tts/engines/mlx-audio.d.ts.map +1 -0
  58. package/dist/tts/engines/mlx-audio.js +40 -0
  59. package/dist/tts/engines/mlx-audio.js.map +1 -0
  60. package/dist/tts/engines/openai.d.ts +13 -0
  61. package/dist/tts/engines/openai.d.ts.map +1 -0
  62. package/dist/tts/engines/openai.js +50 -0
  63. package/dist/tts/engines/openai.js.map +1 -0
  64. package/dist/tts/engines/sarvam.d.ts +13 -0
  65. package/dist/tts/engines/sarvam.d.ts.map +1 -0
  66. package/dist/tts/engines/sarvam.js +51 -0
  67. package/dist/tts/engines/sarvam.js.map +1 -0
  68. package/dist/tts/generate.d.ts.map +1 -1
  69. package/dist/tts/generate.js +2 -0
  70. package/dist/tts/generate.js.map +1 -1
  71. package/dist/tts/kokoro.d.ts +1 -30
  72. package/dist/tts/kokoro.d.ts.map +1 -1
  73. package/dist/tts/kokoro.js +2 -80
  74. package/dist/tts/kokoro.js.map +1 -1
  75. package/package.json +1 -1
@@ -0,0 +1,76 @@
1
+ export class KokoroEngine {
2
+ tts = null;
3
+ initPromise = null;
4
+ modelId;
5
+ dtype;
6
+ device;
7
+ onProgress;
8
+ constructor(options) {
9
+ this.modelId = options?.modelId ?? 'onnx-community/Kokoro-82M-v1.0-ONNX';
10
+ this.dtype = options?.dtype ?? 'q8';
11
+ this.device = options?.device ?? null;
12
+ this.onProgress = options?.onProgress;
13
+ }
14
+ async getTTS() {
15
+ if (this.tts)
16
+ return this.tts;
17
+ if (!this.initPromise) {
18
+ this.initPromise = (async () => {
19
+ try {
20
+ const { KokoroTTS } = await import('kokoro-js');
21
+ this.tts = await KokoroTTS.from_pretrained(this.modelId, {
22
+ dtype: this.dtype,
23
+ device: this.device,
24
+ progress_callback: this.onProgress ?? undefined,
25
+ });
26
+ }
27
+ catch (err) {
28
+ this.initPromise = null;
29
+ throw new Error(`Failed to initialize Kokoro TTS (model: ${this.modelId}, dtype: ${this.dtype}). ` +
30
+ `This may require an internet connection for first-time model download. ` +
31
+ `Original error: ${err.message}`);
32
+ }
33
+ return this.tts;
34
+ })();
35
+ }
36
+ return this.initPromise;
37
+ }
38
+ async generate(text, options) {
39
+ if (!text?.trim())
40
+ throw new Error('TTS text must not be empty');
41
+ const tts = await this.getTTS();
42
+ let audio;
43
+ try {
44
+ audio = await tts.generate(text, {
45
+ voice: options.voice ?? 'af_heart',
46
+ speed: options.speed ?? 1.0,
47
+ });
48
+ }
49
+ catch (err) {
50
+ throw new Error(`Kokoro TTS failed to generate audio for text "${text.substring(0, 80)}..." ` +
51
+ `(voice: ${options.voice ?? 'af_heart'}). Original error: ${err.message}`);
52
+ }
53
+ const samples = audio.data ?? audio.audio;
54
+ if (!samples || !(samples instanceof Float32Array)) {
55
+ throw new Error('kokoro-js returned unexpected audio format. Check kokoro-js version.');
56
+ }
57
+ const sampleRate = audio.sampling_rate;
58
+ const { createWavBuffer } = await import('../engine.js');
59
+ return createWavBuffer(samples, sampleRate);
60
+ }
61
+ async *stream(text, options) {
62
+ if (!text?.trim())
63
+ throw new Error('TTS text must not be empty');
64
+ const tts = await this.getTTS();
65
+ const { createWavBuffer } = await import('../engine.js');
66
+ for await (const chunk of tts.stream(text, {
67
+ voice: options.voice ?? 'af_heart',
68
+ speed: options.speed ?? 1.0,
69
+ })) {
70
+ const samples = chunk.audio.data ?? chunk.audio.audio;
71
+ const sampleRate = chunk.audio.sampling_rate;
72
+ yield { text: chunk.text, audio: createWavBuffer(samples, sampleRate) };
73
+ }
74
+ }
75
+ }
76
+ //# sourceMappingURL=kokoro.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kokoro.js","sourceRoot":"","sources":["../../../src/tts/engines/kokoro.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { TTSEngine, TTSEngineOptions } from '../engine.js';
2
+ export interface MlxAudioEngineOptions {
3
+ /** mlx-audio server URL. Default: http://localhost:8000 */
4
+ baseUrl?: string;
5
+ /** Model ID passed to the server. Default: mlx-community/Spark-TTS-0.5B-bf16 */
6
+ model?: string;
7
+ }
8
+ export declare class MlxAudioEngine implements TTSEngine {
9
+ private baseUrl;
10
+ private model;
11
+ constructor(options?: MlxAudioEngineOptions);
12
+ generate(text: string, options: TTSEngineOptions): Promise<Buffer>;
13
+ }
14
+ //# sourceMappingURL=mlx-audio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mlx-audio.d.ts","sourceRoot":"","sources":["../../../src/tts/engines/mlx-audio.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhE,MAAM,WAAW,qBAAqB;IACpC,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gFAAgF;IAChF,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,cAAe,YAAW,SAAS;IAC9C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAS;gBAEV,OAAO,CAAC,EAAE,qBAAqB;IAKrC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC;CAoCzE"}
@@ -0,0 +1,40 @@
1
+ export class MlxAudioEngine {
2
+ baseUrl;
3
+ model;
4
+ constructor(options) {
5
+ this.baseUrl = options?.baseUrl ?? 'http://localhost:8000';
6
+ this.model = options?.model ?? 'mlx-community/Spark-TTS-0.5B-bf16';
7
+ }
8
+ async generate(text, options) {
9
+ if (!text?.trim())
10
+ throw new Error('TTS text must not be empty');
11
+ const controller = new AbortController();
12
+ const timeout = setTimeout(() => controller.abort(), 180_000);
13
+ let response;
14
+ try {
15
+ response = await fetch(`${this.baseUrl}/v1/audio/speech`, {
16
+ method: 'POST',
17
+ headers: { 'Content-Type': 'application/json' },
18
+ body: JSON.stringify({
19
+ model: this.model,
20
+ input: text,
21
+ voice: options.voice ?? 'af_heart',
22
+ }),
23
+ signal: controller.signal,
24
+ });
25
+ }
26
+ finally {
27
+ clearTimeout(timeout);
28
+ }
29
+ if (!response.ok) {
30
+ const body = await response.text();
31
+ throw new Error(`mlx-audio server error ${response.status}: ${body}. ` +
32
+ `Ensure the server is running: python3 -m mlx_audio.server --model ${this.model}`);
33
+ }
34
+ const audioBuffer = Buffer.from(await response.arrayBuffer());
35
+ // Convert to Argo WAV format (mono Float32 24kHz)
36
+ const { convertToWav } = await import('../engine.js');
37
+ return convertToWav(audioBuffer);
38
+ }
39
+ }
40
+ //# sourceMappingURL=mlx-audio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mlx-audio.js","sourceRoot":"","sources":["../../../src/tts/engines/mlx-audio.ts"],"names":[],"mappings":"AASA,MAAM,OAAO,cAAc;IACjB,OAAO,CAAS;IAChB,KAAK,CAAS;IAEtB,YAAY,OAA+B;QACzC,IAAI,CAAC,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,uBAAuB,CAAC;QAC3D,IAAI,CAAC,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,mCAAmC,CAAC;IACrE,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAY,EAAE,OAAyB;QACpD,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAEjE,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,OAAO,CAAC,CAAC;QAE9D,IAAI,QAAQ,CAAC;QACb,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,kBAAkB,EAAE;gBACxD,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,KAAK,EAAE,IAAI;oBACX,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,UAAU;iBACnC,CAAC;gBACF,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B,CAAC,CAAC;QACL,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CACb,0BAA0B,QAAQ,CAAC,MAAM,KAAK,IAAI,IAAI;gBACtD,qEAAqE,IAAI,CAAC,KAAK,EAAE,CAClF,CAAC;QACJ,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;QAE9D,kDAAkD;QAClD,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;QACtD,OAAO,YAAY,CAAC,WAAW,CAAC,CAAC;IACnC,CAAC;CACF"}
@@ -0,0 +1,13 @@
1
+ import type { TTSEngine, TTSEngineOptions } from '../engine.js';
2
+ export interface OpenAIEngineOptions {
3
+ apiKey?: string;
4
+ model?: 'tts-1' | 'tts-1-hd';
5
+ }
6
+ export declare class OpenAIEngine implements TTSEngine {
7
+ private apiKey;
8
+ private model;
9
+ constructor(options?: OpenAIEngineOptions);
10
+ private resolveApiKey;
11
+ generate(text: string, options: TTSEngineOptions): Promise<Buffer>;
12
+ }
13
+ //# sourceMappingURL=openai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../../src/tts/engines/openai.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhE,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;CAC9B;AAED,qBAAa,YAAa,YAAW,SAAS;IAC5C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;gBAEV,OAAO,CAAC,EAAE,mBAAmB;IAKzC,OAAO,CAAC,aAAa;IAWf,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC;CAuCzE"}
@@ -0,0 +1,50 @@
1
+ export class OpenAIEngine {
2
+ apiKey;
3
+ model;
4
+ constructor(options) {
5
+ this.apiKey = options?.apiKey ?? '';
6
+ this.model = options?.model ?? 'tts-1';
7
+ }
8
+ resolveApiKey() {
9
+ const key = this.apiKey || process.env.OPENAI_API_KEY || '';
10
+ if (!key) {
11
+ throw new Error('OpenAI TTS engine requires an API key. ' +
12
+ 'Set OPENAI_API_KEY environment variable or pass apiKey option.');
13
+ }
14
+ return key;
15
+ }
16
+ async generate(text, options) {
17
+ if (!text?.trim())
18
+ throw new Error('TTS text must not be empty');
19
+ let OpenAI;
20
+ try {
21
+ // @ts-ignore — openai is an optional dependency
22
+ ({ OpenAI } = await import('openai'));
23
+ }
24
+ catch {
25
+ throw new Error("OpenAI TTS engine requires the 'openai' package. Install it with: npm i openai");
26
+ }
27
+ const client = new OpenAI({ apiKey: this.resolveApiKey() });
28
+ // Request raw PCM so we can build an exact WAV without ffmpeg pipe artifacts
29
+ const response = await client.audio.speech.create({
30
+ model: this.model,
31
+ voice: options.voice ?? 'alloy',
32
+ input: text,
33
+ speed: options.speed ?? 1.0,
34
+ response_format: 'pcm',
35
+ });
36
+ const arrayBuffer = await response.arrayBuffer();
37
+ const pcmBuffer = Buffer.from(arrayBuffer);
38
+ // OpenAI PCM format: 24kHz, 16-bit signed LE, mono
39
+ // Convert 16-bit PCM samples to Float32 and build WAV directly
40
+ const sampleRate = 24000;
41
+ const sampleCount = pcmBuffer.length / 2;
42
+ const samples = new Float32Array(sampleCount);
43
+ for (let i = 0; i < sampleCount; i++) {
44
+ samples[i] = pcmBuffer.readInt16LE(i * 2) / 32768;
45
+ }
46
+ const { createWavBuffer } = await import('../engine.js');
47
+ return createWavBuffer(samples, sampleRate);
48
+ }
49
+ }
50
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../../src/tts/engines/openai.ts"],"names":[],"mappings":"AAOA,MAAM,OAAO,YAAY;IACf,MAAM,CAAS;IACf,KAAK,CAAS;IAEtB,YAAY,OAA6B;QACvC,IAAI,CAAC,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,EAAE,CAAC;QACpC,IAAI,CAAC,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,OAAO,CAAC;IACzC,CAAC;IAEO,aAAa;QACnB,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,EAAE,CAAC;QAC5D,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CACb,yCAAyC;gBACzC,gEAAgE,CACjE,CAAC;QACJ,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAY,EAAE,OAAyB;QACpD,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAEjE,IAAI,MAAW,CAAC;QAChB,IAAI,CAAC;YACH,gDAAgD;YAChD,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QACxC,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CACb,gFAAgF,CACjF,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;QAE5D,6EAA6E;QAC7E,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;YAChD,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,OAAO;YAC/B,KAAK,EAAE,IAAI;YACX,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,GAAG;YAC3B,eAAe,EAAE,KAAK;SACvB,CAAC,CAAC;QAEH,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC;QACjD,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAE3C,mDAAmD;QACnD,+DAA+D;QAC/D,MAAM,UAAU,GAAG,KAAK,CAAC;QACzB,MAAM,WAAW,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;QACzC,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,WAAW,CAAC,CAAC;QAC9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;QACpD,CAAC;QAED,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;QACzD,OAAO,eAAe,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAC9C,CAAC;CACF"}
@@ -0,0 +1,13 @@
1
+ import type { TTSEngine, TTSEngineOptions } from '../engine.js';
2
+ export interface SarvamEngineOptions {
3
+ apiKey?: string;
4
+ model?: string;
5
+ }
6
+ export declare class SarvamEngine implements TTSEngine {
7
+ private apiKey;
8
+ private model;
9
+ constructor(options?: SarvamEngineOptions);
10
+ private resolveApiKey;
11
+ generate(text: string, options: TTSEngineOptions): Promise<Buffer>;
12
+ }
13
+ //# sourceMappingURL=sarvam.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sarvam.d.ts","sourceRoot":"","sources":["../../../src/tts/engines/sarvam.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhE,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,YAAa,YAAW,SAAS;IAC5C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;gBAEV,OAAO,CAAC,EAAE,mBAAmB;IAKzC,OAAO,CAAC,aAAa;IAWf,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC;CAsCzE"}
@@ -0,0 +1,51 @@
1
+ export class SarvamEngine {
2
+ apiKey;
3
+ model;
4
+ constructor(options) {
5
+ this.apiKey = options?.apiKey ?? '';
6
+ this.model = options?.model ?? 'bulbul:v2';
7
+ }
8
+ resolveApiKey() {
9
+ const key = this.apiKey || process.env.SARVAM_API_KEY || '';
10
+ if (!key) {
11
+ throw new Error('Sarvam TTS engine requires an API key. ' +
12
+ 'Set SARVAM_API_KEY environment variable or pass apiKey option.');
13
+ }
14
+ return key;
15
+ }
16
+ async generate(text, options) {
17
+ if (!text?.trim())
18
+ throw new Error('TTS text must not be empty');
19
+ const response = await fetch('https://api.sarvam.ai/text-to-speech', {
20
+ method: 'POST',
21
+ headers: {
22
+ 'Content-Type': 'application/json',
23
+ 'API-Subscription-Key': this.resolveApiKey(),
24
+ },
25
+ body: JSON.stringify({
26
+ inputs: [text],
27
+ target_language_code: options.lang ?? 'hi-IN',
28
+ speaker: options.voice ?? 'meera',
29
+ model: this.model,
30
+ pitch: 0,
31
+ pace: options.speed ?? 1.0,
32
+ loudness: 1.5,
33
+ enable_preprocessing: true,
34
+ }),
35
+ });
36
+ if (!response.ok) {
37
+ const body = await response.text();
38
+ throw new Error(`Sarvam TTS API error ${response.status}: ${body}`);
39
+ }
40
+ const json = await response.json();
41
+ if (!json.audios?.[0]) {
42
+ throw new Error('Sarvam TTS returned no audio data');
43
+ }
44
+ // Sarvam returns base64-encoded WAV
45
+ const audioBuffer = Buffer.from(json.audios[0], 'base64');
46
+ // Convert to Argo WAV format (mono Float32 24kHz)
47
+ const { convertToWav } = await import('../engine.js');
48
+ return convertToWav(audioBuffer);
49
+ }
50
+ }
51
+ //# sourceMappingURL=sarvam.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sarvam.js","sourceRoot":"","sources":["../../../src/tts/engines/sarvam.ts"],"names":[],"mappings":"AAOA,MAAM,OAAO,YAAY;IACf,MAAM,CAAS;IACf,KAAK,CAAS;IAEtB,YAAY,OAA6B;QACvC,IAAI,CAAC,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,EAAE,CAAC;QACpC,IAAI,CAAC,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,WAAW,CAAC;IAC7C,CAAC;IAEO,aAAa;QACnB,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,EAAE,CAAC;QAC5D,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CACb,yCAAyC;gBACzC,gEAAgE,CACjE,CAAC;QACJ,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAY,EAAE,OAAyB;QACpD,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAEjE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,sCAAsC,EAAE;YACnE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,sBAAsB,EAAE,IAAI,CAAC,aAAa,EAAE;aAC7C;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,MAAM,EAAE,CAAC,IAAI,CAAC;gBACd,oBAAoB,EAAE,OAAO,CAAC,IAAI,IAAI,OAAO;gBAC7C,OAAO,EAAE,OAAO,CAAC,KAAK,IAAI,OAAO;gBACjC,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,KAAK,EAAE,CAAC;gBACR,IAAI,EAAE,OAAO,CAAC,KAAK,IAAI,GAAG;gBAC1B,QAAQ,EAAE,GAAG;gBACb,oBAAoB,EAAE,IAAI;aAC3B,CAAC;SACH,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,wBAAwB,QAAQ,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC,CAAC;QACtE,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAA2B,CAAC;QAC5D,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACvD,CAAC;QAED,oCAAoC;QACpC,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QAE1D,kDAAkD;QAClD,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;QACtD,OAAO,YAAY,CAAC,WAAW,CAAC,CAAC;IACnC,CAAC;CACF"}
@@ -1 +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,CAgExF"}
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,CAkExF"}
@@ -41,6 +41,7 @@ export async function generateClips(options) {
41
41
  text: r.text,
42
42
  voice: r.voice ?? defaults?.voice,
43
43
  speed: r.speed ?? defaults?.speed,
44
+ lang: r.lang,
44
45
  };
45
46
  return { entry, clipPath: cache.getClipPath(demoName, entry) };
46
47
  });
@@ -52,6 +53,7 @@ export async function generateClips(options) {
52
53
  const wavBuffer = await engine.generate(entry.text, {
53
54
  voice: entry.voice,
54
55
  speed: entry.speed,
56
+ lang: entry.lang,
55
57
  });
56
58
  cache.cacheClip(demoName, entry, wavBuffer);
57
59
  }
@@ -1 +1 @@
1
- {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/tts/generate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/tts/generate.ts"],"names":[],"mappings":"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"}
@@ -1,31 +1,2 @@
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 initPromise;
15
- private modelId;
16
- private dtype;
17
- private device;
18
- private onProgress?;
19
- constructor(options?: KokoroEngineOptions);
20
- private getTTS;
21
- generate(text: string, options: TTSEngineOptions): Promise<Buffer>;
22
- /**
23
- * Stream audio generation sentence-by-sentence.
24
- * Yields WAV buffers for each sentence as they're generated.
25
- */
26
- stream(text: string, options: TTSEngineOptions): AsyncGenerator<{
27
- text: string;
28
- audio: Buffer;
29
- }>;
30
- }
1
+ export { KokoroEngine, type KokoroEngineOptions } from './engines/kokoro.js';
31
2
  //# sourceMappingURL=kokoro.d.ts.map
@@ -1 +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,WAAW,CAA6B;IAChD,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;IA0Bd,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC;IAwBxE;;;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"}
1
+ {"version":3,"file":"kokoro.d.ts","sourceRoot":"","sources":["../../src/tts/kokoro.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,KAAK,mBAAmB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -1,81 +1,3 @@
1
- export class KokoroEngine {
2
- tts = null;
3
- initPromise = null;
4
- modelId;
5
- dtype;
6
- device;
7
- onProgress;
8
- constructor(options) {
9
- this.modelId = options?.modelId ?? 'onnx-community/Kokoro-82M-v1.0-ONNX';
10
- this.dtype = options?.dtype ?? 'q8';
11
- this.device = options?.device ?? null;
12
- this.onProgress = options?.onProgress;
13
- }
14
- async getTTS() {
15
- if (this.tts)
16
- return this.tts;
17
- // Share a single init promise so concurrent calls don't duplicate model loading
18
- if (!this.initPromise) {
19
- this.initPromise = (async () => {
20
- try {
21
- const { KokoroTTS } = await import('kokoro-js');
22
- this.tts = await KokoroTTS.from_pretrained(this.modelId, {
23
- dtype: this.dtype,
24
- device: this.device,
25
- progress_callback: this.onProgress ?? undefined,
26
- });
27
- }
28
- catch (err) {
29
- this.initPromise = null; // allow retry on failure
30
- throw new Error(`Failed to initialize Kokoro TTS (model: ${this.modelId}, dtype: ${this.dtype}). ` +
31
- `This may require an internet connection for first-time model download. ` +
32
- `Original error: ${err.message}`);
33
- }
34
- return this.tts;
35
- })();
36
- }
37
- return this.initPromise;
38
- }
39
- async generate(text, options) {
40
- if (!text?.trim())
41
- throw new Error('TTS text must not be empty');
42
- const tts = await this.getTTS();
43
- let audio;
44
- try {
45
- audio = await tts.generate(text, {
46
- voice: options.voice ?? 'af_heart',
47
- speed: options.speed ?? 1.0,
48
- });
49
- }
50
- catch (err) {
51
- throw new Error(`Kokoro TTS failed to generate audio for text "${text.substring(0, 80)}..." ` +
52
- `(voice: ${options.voice ?? 'af_heart'}). Original error: ${err.message}`);
53
- }
54
- const samples = audio.data ?? audio.audio;
55
- if (!samples || !(samples instanceof Float32Array)) {
56
- throw new Error('kokoro-js returned unexpected audio format. Check kokoro-js version.');
57
- }
58
- const sampleRate = audio.sampling_rate;
59
- const { createWavBuffer } = await import('./engine.js');
60
- return createWavBuffer(samples, sampleRate);
61
- }
62
- /**
63
- * Stream audio generation sentence-by-sentence.
64
- * Yields WAV buffers for each sentence as they're generated.
65
- */
66
- async *stream(text, options) {
67
- if (!text?.trim())
68
- throw new Error('TTS text must not be empty');
69
- const tts = await this.getTTS();
70
- const { createWavBuffer } = await import('./engine.js');
71
- for await (const chunk of tts.stream(text, {
72
- voice: options.voice ?? 'af_heart',
73
- speed: options.speed ?? 1.0,
74
- })) {
75
- const samples = chunk.audio.data ?? chunk.audio.audio;
76
- const sampleRate = chunk.audio.sampling_rate;
77
- yield { text: chunk.text, audio: createWavBuffer(samples, sampleRate) };
78
- }
79
- }
80
- }
1
+ // Re-export from new location for backward compatibility
2
+ export { KokoroEngine } from './engines/kokoro.js';
81
3
  //# sourceMappingURL=kokoro.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"kokoro.js","sourceRoot":"","sources":["../../src/tts/kokoro.ts"],"names":[],"mappings":"AASA,MAAM,OAAO,YAAY;IACf,GAAG,GAAQ,IAAI,CAAC;IAChB,WAAW,GAAwB,IAAI,CAAC;IACxC,OAAO,CAAS;IAChB,KAAK,CAAS;IACd,MAAM,CAAmC;IACzC,UAAU,CAAqC;IAEvD,YAAY,OAA6B;QACvC,IAAI,CAAC,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,qCAAqC,CAAC;QACzE,IAAI,CAAC,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,IAAI,CAAC;QACpC,IAAI,CAAC,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,IAAI,CAAC;QACtC,IAAI,CAAC,UAAU,GAAG,OAAO,EAAE,UAAU,CAAC;IACxC,CAAC;IAEO,KAAK,CAAC,MAAM;QAClB,IAAI,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC,GAAG,CAAC;QAC9B,gFAAgF;QAChF,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,IAAI,CAAC,WAAW,GAAG,CAAC,KAAK,IAAI,EAAE;gBAC7B,IAAI,CAAC;oBACH,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;oBAChD,IAAI,CAAC,GAAG,GAAG,MAAM,SAAS,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,EAAE;wBACvD,KAAK,EAAE,IAAI,CAAC,KAAgD;wBAC5D,MAAM,EAAE,IAAI,CAAC,MAAM;wBACnB,iBAAiB,EAAE,IAAI,CAAC,UAAU,IAAI,SAAS;qBAChD,CAAC,CAAC;gBACL,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC,yBAAyB;oBAClD,MAAM,IAAI,KAAK,CACb,2CAA2C,IAAI,CAAC,OAAO,YAAY,IAAI,CAAC,KAAK,KAAK;wBAClF,yEAAyE;wBACzE,mBAAoB,GAAa,CAAC,OAAO,EAAE,CAC5C,CAAC;gBACJ,CAAC;gBACD,OAAO,IAAI,CAAC,GAAG,CAAC;YAClB,CAAC,CAAC,EAAE,CAAC;QACP,CAAC;QACD,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAY,EAAE,OAAyB;QACpD,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QACjE,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QAChC,IAAI,KAAK,CAAC;QACV,IAAI,CAAC;YACH,KAAK,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE;gBAC/B,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,UAAU;gBAClC,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,GAAG;aAC5B,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CACb,iDAAiD,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO;gBAC7E,WAAW,OAAO,CAAC,KAAK,IAAI,UAAU,sBAAuB,GAAa,CAAC,OAAO,EAAE,CACrF,CAAC;QACJ,CAAC;QACD,MAAM,OAAO,GAAiB,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC;QACxD,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,YAAY,YAAY,CAAC,EAAE,CAAC;YACnD,MAAM,IAAI,KAAK,CAAC,sEAAsE,CAAC,CAAC;QAC1F,CAAC;QACD,MAAM,UAAU,GAAW,KAAK,CAAC,aAAa,CAAC;QAC/C,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QACxD,OAAO,eAAe,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAC9C,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,CAAC,MAAM,CAAC,IAAY,EAAE,OAAyB;QACnD,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QACjE,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QAChC,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QACxD,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE;YACzC,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,UAAU;YAClC,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,GAAG;SAC5B,CAAC,EAAE,CAAC;YACH,MAAM,OAAO,GAAiB,KAAK,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC;YACpE,MAAM,UAAU,GAAW,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC;YACrD,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,eAAe,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,CAAC;QAC1E,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"kokoro.js","sourceRoot":"","sources":["../../src/tts/kokoro.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,OAAO,EAAE,YAAY,EAA4B,MAAM,qBAAqB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@argo-video/cli",
3
- "version": "0.6.0",
3
+ "version": "0.7.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",