react-native-nitro-mlx 0.3.0 → 0.4.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 (79) hide show
  1. package/MLXReactNative.podspec +7 -1
  2. package/ios/Sources/AudioCaptureManager.swift +110 -0
  3. package/ios/Sources/HybridLLM.swift +309 -68
  4. package/ios/Sources/HybridSTT.swift +202 -0
  5. package/ios/Sources/HybridTTS.swift +145 -0
  6. package/ios/Sources/JSONHelpers.swift +9 -0
  7. package/ios/Sources/ModelDownloader.swift +26 -12
  8. package/ios/Sources/StreamEventEmitter.swift +132 -0
  9. package/ios/Sources/ThinkingStateMachine.swift +206 -0
  10. package/lib/module/index.js +2 -0
  11. package/lib/module/index.js.map +1 -1
  12. package/lib/module/llm.js +39 -1
  13. package/lib/module/llm.js.map +1 -1
  14. package/lib/module/models.js +97 -26
  15. package/lib/module/models.js.map +1 -1
  16. package/lib/module/specs/STT.nitro.js +4 -0
  17. package/lib/module/specs/STT.nitro.js.map +1 -0
  18. package/lib/module/specs/TTS.nitro.js +4 -0
  19. package/lib/module/specs/TTS.nitro.js.map +1 -0
  20. package/lib/module/stt.js +49 -0
  21. package/lib/module/stt.js.map +1 -0
  22. package/lib/module/tts.js +40 -0
  23. package/lib/module/tts.js.map +1 -0
  24. package/lib/typescript/src/index.d.ts +7 -3
  25. package/lib/typescript/src/index.d.ts.map +1 -1
  26. package/lib/typescript/src/llm.d.ts +32 -2
  27. package/lib/typescript/src/llm.d.ts.map +1 -1
  28. package/lib/typescript/src/models.d.ts +13 -4
  29. package/lib/typescript/src/models.d.ts.map +1 -1
  30. package/lib/typescript/src/specs/LLM.nitro.d.ts +49 -4
  31. package/lib/typescript/src/specs/LLM.nitro.d.ts.map +1 -1
  32. package/lib/typescript/src/specs/STT.nitro.d.ts +28 -0
  33. package/lib/typescript/src/specs/STT.nitro.d.ts.map +1 -0
  34. package/lib/typescript/src/specs/TTS.nitro.d.ts +22 -0
  35. package/lib/typescript/src/specs/TTS.nitro.d.ts.map +1 -0
  36. package/lib/typescript/src/stt.d.ts +16 -0
  37. package/lib/typescript/src/stt.d.ts.map +1 -0
  38. package/lib/typescript/src/tts.d.ts +13 -0
  39. package/lib/typescript/src/tts.d.ts.map +1 -0
  40. package/nitrogen/generated/ios/MLXReactNative-Swift-Cxx-Bridge.cpp +42 -0
  41. package/nitrogen/generated/ios/MLXReactNative-Swift-Cxx-Bridge.hpp +165 -0
  42. package/nitrogen/generated/ios/MLXReactNative-Swift-Cxx-Umbrella.hpp +20 -0
  43. package/nitrogen/generated/ios/MLXReactNativeAutolinking.mm +16 -0
  44. package/nitrogen/generated/ios/MLXReactNativeAutolinking.swift +30 -0
  45. package/nitrogen/generated/ios/c++/HybridLLMSpecSwift.hpp +8 -0
  46. package/nitrogen/generated/ios/c++/HybridSTTSpecSwift.cpp +11 -0
  47. package/nitrogen/generated/ios/c++/HybridSTTSpecSwift.hpp +149 -0
  48. package/nitrogen/generated/ios/c++/HybridTTSSpecSwift.cpp +11 -0
  49. package/nitrogen/generated/ios/c++/HybridTTSSpecSwift.hpp +128 -0
  50. package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_ArrayBuffer_.swift +47 -0
  51. package/nitrogen/generated/ios/swift/GenerationStats.swift +13 -2
  52. package/nitrogen/generated/ios/swift/HybridLLMSpec.swift +1 -0
  53. package/nitrogen/generated/ios/swift/HybridLLMSpec_cxx.swift +24 -0
  54. package/nitrogen/generated/ios/swift/HybridSTTSpec.swift +66 -0
  55. package/nitrogen/generated/ios/swift/HybridSTTSpec_cxx.swift +286 -0
  56. package/nitrogen/generated/ios/swift/HybridTTSSpec.swift +63 -0
  57. package/nitrogen/generated/ios/swift/HybridTTSSpec_cxx.swift +229 -0
  58. package/nitrogen/generated/ios/swift/STTLoadOptions.swift +66 -0
  59. package/nitrogen/generated/ios/swift/TTSGenerateOptions.swift +78 -0
  60. package/nitrogen/generated/ios/swift/TTSLoadOptions.swift +66 -0
  61. package/nitrogen/generated/shared/c++/GenerationStats.hpp +6 -2
  62. package/nitrogen/generated/shared/c++/HybridLLMSpec.cpp +1 -0
  63. package/nitrogen/generated/shared/c++/HybridLLMSpec.hpp +1 -0
  64. package/nitrogen/generated/shared/c++/HybridSTTSpec.cpp +32 -0
  65. package/nitrogen/generated/shared/c++/HybridSTTSpec.hpp +78 -0
  66. package/nitrogen/generated/shared/c++/HybridTTSSpec.cpp +29 -0
  67. package/nitrogen/generated/shared/c++/HybridTTSSpec.hpp +78 -0
  68. package/nitrogen/generated/shared/c++/STTLoadOptions.hpp +76 -0
  69. package/nitrogen/generated/shared/c++/TTSGenerateOptions.hpp +80 -0
  70. package/nitrogen/generated/shared/c++/TTSLoadOptions.hpp +76 -0
  71. package/package.json +8 -4
  72. package/src/index.ts +31 -1
  73. package/src/llm.ts +48 -2
  74. package/src/models.ts +81 -1
  75. package/src/specs/LLM.nitro.ts +74 -4
  76. package/src/specs/STT.nitro.ts +35 -0
  77. package/src/specs/TTS.nitro.ts +30 -0
  78. package/src/stt.ts +67 -0
  79. package/src/tts.ts +60 -0
package/src/models.ts CHANGED
@@ -5,6 +5,8 @@ export enum ModelFamily {
5
5
  Phi = 'Phi',
6
6
  SmolLM = 'SmolLM',
7
7
  OpenELM = 'OpenELM',
8
+ PocketTTS = 'PocketTTS',
9
+ GLMASR = 'GLMASR',
8
10
  }
9
11
 
10
12
  export enum ModelProvider {
@@ -14,9 +16,12 @@ export enum ModelProvider {
14
16
  Microsoft = 'Microsoft',
15
17
  HuggingFace = 'HuggingFace',
16
18
  Apple = 'Apple',
19
+ Kyutai = 'Kyutai',
17
20
  }
18
21
 
19
- export type ModelQuantization = '4bit' | '8bit'
22
+ export type ModelQuantization = '4bit' | '8bit' | 'bf16'
23
+
24
+ export type ModelType = 'llm' | 'tts' | 'stt'
20
25
 
21
26
  export interface ModelInfo {
22
27
  id: MLXModel
@@ -26,6 +31,7 @@ export interface ModelInfo {
26
31
  quantization: ModelQuantization
27
32
  displayName: string
28
33
  downloadSize: number
34
+ type: ModelType
29
35
  }
30
36
 
31
37
  export enum MLXModel {
@@ -72,6 +78,14 @@ export enum MLXModel {
72
78
  OpenELM_1_1B_8bit = 'mlx-community/OpenELM-1_1B-8bit',
73
79
  OpenELM_3B_4bit = 'mlx-community/OpenELM-3B-4bit',
74
80
  OpenELM_3B_8bit = 'mlx-community/OpenELM-3B-8bit',
81
+
82
+ // PocketTTS (Kyutai) - 44.6M
83
+ PocketTTS = 'mlx-community/pocket-tts',
84
+ PocketTTS_8bit = 'mlx-community/pocket-tts-8bit',
85
+ PocketTTS_4bit = 'mlx-community/pocket-tts-4bit',
86
+
87
+ // GLM-ASR (GLMASR) - Speech-to-Text
88
+ GLM_ASR_Nano_4bit = 'mlx-community/GLM-ASR-Nano-2512-4bit',
75
89
  }
76
90
 
77
91
  export const MLXModels: ModelInfo[] = [
@@ -83,6 +97,7 @@ export const MLXModels: ModelInfo[] = [
83
97
  quantization: '4bit',
84
98
  displayName: 'Llama 3.2 1B Instruct (4-bit)',
85
99
  downloadSize: 1407777762,
100
+ type: 'llm',
86
101
  },
87
102
  {
88
103
  id: MLXModel.Llama_3_2_1B_Instruct_8bit,
@@ -92,6 +107,7 @@ export const MLXModels: ModelInfo[] = [
92
107
  quantization: '8bit',
93
108
  displayName: 'Llama 3.2 1B Instruct (8-bit)',
94
109
  downloadSize: 1313157436,
110
+ type: 'llm',
95
111
  },
96
112
  {
97
113
  id: MLXModel.Llama_3_2_3B_Instruct_4bit,
@@ -101,6 +117,7 @@ export const MLXModels: ModelInfo[] = [
101
117
  quantization: '4bit',
102
118
  displayName: 'Llama 3.2 3B Instruct (4-bit)',
103
119
  downloadSize: 2019397474,
120
+ type: 'llm',
104
121
  },
105
122
  {
106
123
  id: MLXModel.Llama_3_2_3B_Instruct_8bit,
@@ -110,6 +127,7 @@ export const MLXModels: ModelInfo[] = [
110
127
  quantization: '8bit',
111
128
  displayName: 'Llama 3.2 3B Instruct (8-bit)',
112
129
  downloadSize: 3413784042,
130
+ type: 'llm',
113
131
  },
114
132
  {
115
133
  id: MLXModel.Qwen2_5_0_5B_Instruct_4bit,
@@ -119,6 +137,7 @@ export const MLXModels: ModelInfo[] = [
119
137
  quantization: '4bit',
120
138
  displayName: 'Qwen 2.5 0.5B Instruct (4-bit)',
121
139
  downloadSize: 278064920,
140
+ type: 'llm',
122
141
  },
123
142
  {
124
143
  id: MLXModel.Qwen2_5_0_5B_Instruct_8bit,
@@ -128,6 +147,7 @@ export const MLXModels: ModelInfo[] = [
128
147
  quantization: '8bit',
129
148
  displayName: 'Qwen 2.5 0.5B Instruct (8-bit)',
130
149
  downloadSize: 525045902,
150
+ type: 'llm',
131
151
  },
132
152
  {
133
153
  id: MLXModel.Qwen2_5_1_5B_Instruct_4bit,
@@ -137,6 +157,7 @@ export const MLXModels: ModelInfo[] = [
137
157
  quantization: '4bit',
138
158
  displayName: 'Qwen 2.5 1.5B Instruct (4-bit)',
139
159
  downloadSize: 868628559,
160
+ type: 'llm',
140
161
  },
141
162
  {
142
163
  id: MLXModel.Qwen2_5_1_5B_Instruct_8bit,
@@ -146,6 +167,7 @@ export const MLXModels: ModelInfo[] = [
146
167
  quantization: '8bit',
147
168
  displayName: 'Qwen 2.5 1.5B Instruct (8-bit)',
148
169
  downloadSize: 1640414038,
170
+ type: 'llm',
149
171
  },
150
172
  {
151
173
  id: MLXModel.Qwen2_5_3B_Instruct_4bit,
@@ -155,6 +177,7 @@ export const MLXModels: ModelInfo[] = [
155
177
  quantization: '4bit',
156
178
  displayName: 'Qwen 2.5 3B Instruct (4-bit)',
157
179
  downloadSize: 1736293090,
180
+ type: 'llm',
158
181
  },
159
182
  {
160
183
  id: MLXModel.Qwen2_5_3B_Instruct_8bit,
@@ -164,6 +187,7 @@ export const MLXModels: ModelInfo[] = [
164
187
  quantization: '8bit',
165
188
  displayName: 'Qwen 2.5 3B Instruct (8-bit)',
166
189
  downloadSize: 3279142142,
190
+ type: 'llm',
167
191
  },
168
192
  {
169
193
  id: MLXModel.Qwen3_1_7B_4bit,
@@ -173,6 +197,7 @@ export const MLXModels: ModelInfo[] = [
173
197
  quantization: '4bit',
174
198
  displayName: 'Qwen 3 1.7B (4-bit)',
175
199
  downloadSize: 979502864,
200
+ type: 'llm',
176
201
  },
177
202
  {
178
203
  id: MLXModel.Qwen3_1_7B_8bit,
@@ -182,6 +207,7 @@ export const MLXModels: ModelInfo[] = [
182
207
  quantization: '8bit',
183
208
  displayName: 'Qwen 3 1.7B (8-bit)',
184
209
  downloadSize: 1839729195,
210
+ type: 'llm',
185
211
  },
186
212
  {
187
213
  id: MLXModel.Gemma_3_1B_IT_4bit,
@@ -191,6 +217,7 @@ export const MLXModels: ModelInfo[] = [
191
217
  quantization: '4bit',
192
218
  displayName: 'Gemma 3 1B IT (4-bit)',
193
219
  downloadSize: 770650946,
220
+ type: 'llm',
194
221
  },
195
222
  {
196
223
  id: MLXModel.Gemma_3_1B_IT_8bit,
@@ -200,6 +227,7 @@ export const MLXModels: ModelInfo[] = [
200
227
  quantization: '8bit',
201
228
  displayName: 'Gemma 3 1B IT (8-bit)',
202
229
  downloadSize: 1421522471,
230
+ type: 'llm',
203
231
  },
204
232
  {
205
233
  id: MLXModel.Phi_3_5_Mini_Instruct_4bit,
@@ -209,6 +237,7 @@ export const MLXModels: ModelInfo[] = [
209
237
  quantization: '4bit',
210
238
  displayName: 'Phi 3.5 Mini Instruct (4-bit)',
211
239
  downloadSize: 2150195856,
240
+ type: 'llm',
212
241
  },
213
242
  {
214
243
  id: MLXModel.Phi_3_5_Mini_Instruct_8bit,
@@ -218,6 +247,7 @@ export const MLXModels: ModelInfo[] = [
218
247
  quantization: '8bit',
219
248
  displayName: 'Phi 3.5 Mini Instruct (8-bit)',
220
249
  downloadSize: 4060636056,
250
+ type: 'llm',
221
251
  },
222
252
  {
223
253
  id: MLXModel.Phi_4_Mini_Instruct_4bit,
@@ -227,6 +257,7 @@ export const MLXModels: ModelInfo[] = [
227
257
  quantization: '4bit',
228
258
  displayName: 'Phi 4 Mini Instruct (4-bit)',
229
259
  downloadSize: 2173624891,
260
+ type: 'llm',
230
261
  },
231
262
  {
232
263
  id: MLXModel.Phi_4_Mini_Instruct_8bit,
@@ -236,6 +267,7 @@ export const MLXModels: ModelInfo[] = [
236
267
  quantization: '8bit',
237
268
  displayName: 'Phi 4 Mini Instruct (8-bit)',
238
269
  downloadSize: 4091536167,
270
+ type: 'llm',
239
271
  },
240
272
  {
241
273
  id: MLXModel.SmolLM_1_7B_Instruct_4bit,
@@ -245,6 +277,7 @@ export const MLXModels: ModelInfo[] = [
245
277
  quantization: '4bit',
246
278
  displayName: 'SmolLM 1.7B Instruct (4-bit)',
247
279
  downloadSize: 962855374,
280
+ type: 'llm',
248
281
  },
249
282
  {
250
283
  id: MLXModel.SmolLM_1_7B_Instruct_8bit,
@@ -254,6 +287,7 @@ export const MLXModels: ModelInfo[] = [
254
287
  quantization: '8bit',
255
288
  displayName: 'SmolLM 1.7B Instruct (8-bit)',
256
289
  downloadSize: 1818493993,
290
+ type: 'llm',
257
291
  },
258
292
  {
259
293
  id: MLXModel.SmolLM2_1_7B_Instruct_4bit,
@@ -263,6 +297,7 @@ export const MLXModels: ModelInfo[] = [
263
297
  quantization: '4bit',
264
298
  displayName: 'SmolLM2 1.7B Instruct (4-bit)',
265
299
  downloadSize: 980000000,
300
+ type: 'llm',
266
301
  },
267
302
  {
268
303
  id: MLXModel.SmolLM2_1_7B_Instruct_8bit,
@@ -272,6 +307,7 @@ export const MLXModels: ModelInfo[] = [
272
307
  quantization: '8bit',
273
308
  displayName: 'SmolLM2 1.7B Instruct (8-bit)',
274
309
  downloadSize: 1850000000,
310
+ type: 'llm',
275
311
  },
276
312
  {
277
313
  id: MLXModel.OpenELM_1_1B_4bit,
@@ -281,6 +317,7 @@ export const MLXModels: ModelInfo[] = [
281
317
  quantization: '4bit',
282
318
  displayName: 'OpenELM 1.1B (4-bit)',
283
319
  downloadSize: 608162655,
320
+ type: 'llm',
284
321
  },
285
322
  {
286
323
  id: MLXModel.OpenELM_1_1B_8bit,
@@ -290,6 +327,7 @@ export const MLXModels: ModelInfo[] = [
290
327
  quantization: '8bit',
291
328
  displayName: 'OpenELM 1.1B (8-bit)',
292
329
  downloadSize: 1148048397,
330
+ type: 'llm',
293
331
  },
294
332
  {
295
333
  id: MLXModel.OpenELM_3B_4bit,
@@ -299,6 +337,7 @@ export const MLXModels: ModelInfo[] = [
299
337
  quantization: '4bit',
300
338
  displayName: 'OpenELM 3B (4-bit)',
301
339
  downloadSize: 1650000000,
340
+ type: 'llm',
302
341
  },
303
342
  {
304
343
  id: MLXModel.OpenELM_3B_8bit,
@@ -308,5 +347,46 @@ export const MLXModels: ModelInfo[] = [
308
347
  quantization: '8bit',
309
348
  displayName: 'OpenELM 3B (8-bit)',
310
349
  downloadSize: 3100000000,
350
+ type: 'llm',
351
+ },
352
+ {
353
+ id: MLXModel.PocketTTS,
354
+ family: ModelFamily.PocketTTS,
355
+ provider: ModelProvider.Kyutai,
356
+ parameters: '44.6M',
357
+ quantization: 'bf16',
358
+ displayName: 'PocketTTS (bf16)',
359
+ downloadSize: 180000000,
360
+ type: 'tts',
361
+ },
362
+ {
363
+ id: MLXModel.PocketTTS_8bit,
364
+ family: ModelFamily.PocketTTS,
365
+ provider: ModelProvider.Kyutai,
366
+ parameters: '44.6M',
367
+ quantization: '8bit',
368
+ displayName: 'PocketTTS (8-bit)',
369
+ downloadSize: 140000000,
370
+ type: 'tts',
371
+ },
372
+ {
373
+ id: MLXModel.PocketTTS_4bit,
374
+ family: ModelFamily.PocketTTS,
375
+ provider: ModelProvider.Kyutai,
376
+ parameters: '44.6M',
377
+ quantization: '4bit',
378
+ displayName: 'PocketTTS (4-bit)',
379
+ downloadSize: 80000000,
380
+ type: 'tts',
381
+ },
382
+ {
383
+ id: MLXModel.GLM_ASR_Nano_4bit,
384
+ family: ModelFamily.GLMASR,
385
+ provider: ModelProvider.Alibaba,
386
+ parameters: '1B',
387
+ quantization: '4bit',
388
+ displayName: 'GLM-ASR Nano (4-bit)',
389
+ downloadSize: 600000000,
390
+ type: 'stt',
311
391
  },
312
392
  ]
@@ -4,16 +4,81 @@ import type { AnyMap, HybridObject } from 'react-native-nitro-modules'
4
4
  * Statistics from the last text generation.
5
5
  */
6
6
  export interface GenerationStats {
7
- /** Total number of tokens generated */
8
7
  tokenCount: number
9
- /** Generation speed in tokens per second */
10
8
  tokensPerSecond: number
11
- /** Time in milliseconds until the first token was generated */
12
9
  timeToFirstToken: number
13
- /** Total generation time in milliseconds */
14
10
  totalTime: number
11
+ toolExecutionTime: number
15
12
  }
16
13
 
14
+ export interface GenerationStartEvent {
15
+ type: 'generation_start'
16
+ timestamp: number
17
+ }
18
+
19
+ export interface TokenEvent {
20
+ type: 'token'
21
+ token: string
22
+ }
23
+
24
+ export interface ThinkingStartEvent {
25
+ type: 'thinking_start'
26
+ timestamp: number
27
+ }
28
+
29
+ export interface ThinkingChunkEvent {
30
+ type: 'thinking_chunk'
31
+ chunk: string
32
+ }
33
+
34
+ export interface ThinkingEndEvent {
35
+ type: 'thinking_end'
36
+ content: string
37
+ timestamp: number
38
+ }
39
+
40
+ export interface ToolCallStartEvent {
41
+ type: 'tool_call_start'
42
+ id: string
43
+ name: string
44
+ arguments: string
45
+ }
46
+
47
+ export interface ToolCallExecutingEvent {
48
+ type: 'tool_call_executing'
49
+ id: string
50
+ }
51
+
52
+ export interface ToolCallCompletedEvent {
53
+ type: 'tool_call_completed'
54
+ id: string
55
+ result: string
56
+ }
57
+
58
+ export interface ToolCallFailedEvent {
59
+ type: 'tool_call_failed'
60
+ id: string
61
+ error: string
62
+ }
63
+
64
+ export interface GenerationEndEvent {
65
+ type: 'generation_end'
66
+ content: string
67
+ stats: GenerationStats
68
+ }
69
+
70
+ export type StreamEvent =
71
+ | GenerationStartEvent
72
+ | TokenEvent
73
+ | ThinkingStartEvent
74
+ | ThinkingChunkEvent
75
+ | ThinkingEndEvent
76
+ | ToolCallStartEvent
77
+ | ToolCallExecutingEvent
78
+ | ToolCallCompletedEvent
79
+ | ToolCallFailedEvent
80
+ | GenerationEndEvent
81
+
17
82
  export interface LLMMessage {
18
83
  role: string
19
84
  content: string
@@ -85,6 +150,11 @@ export interface LLM extends HybridObject<{ ios: 'swift' }> {
85
150
  onToolCall?: (toolName: string, args: string) => void,
86
151
  ): Promise<string>
87
152
 
153
+ streamWithEvents(
154
+ prompt: string,
155
+ onEvent: (eventJson: string) => void,
156
+ ): Promise<string>
157
+
88
158
  /**
89
159
  * Stop the current generation.
90
160
  */
@@ -0,0 +1,35 @@
1
+ import type { HybridObject } from 'react-native-nitro-modules'
2
+
3
+ export interface STTLoadOptions {
4
+ onProgress?: (progress: number) => void
5
+ }
6
+
7
+ export interface STTTranscriptionInfo {
8
+ promptTokens: number
9
+ generationTokens: number
10
+ tokensPerSecond: number
11
+ prefillTime: number
12
+ generateTime: number
13
+ }
14
+
15
+ export interface STT extends HybridObject<{ ios: 'swift' }> {
16
+ readonly isLoaded: boolean
17
+ readonly isTranscribing: boolean
18
+ readonly isListening: boolean
19
+ readonly modelId: string
20
+
21
+ load(modelId: string, options?: STTLoadOptions): Promise<void>
22
+
23
+ transcribe(audio: ArrayBuffer): Promise<string>
24
+ transcribeStream(
25
+ audio: ArrayBuffer,
26
+ onToken: (token: string) => void
27
+ ): Promise<string>
28
+
29
+ startListening(): Promise<void>
30
+ transcribeBuffer(): Promise<string>
31
+ stopListening(): Promise<string>
32
+
33
+ stop(): void
34
+ unload(): void
35
+ }
@@ -0,0 +1,30 @@
1
+ import type { HybridObject } from 'react-native-nitro-modules'
2
+
3
+ export interface TTSLoadOptions {
4
+ onProgress?: (progress: number) => void
5
+ }
6
+
7
+ export interface TTSGenerateOptions {
8
+ voice?: string
9
+ speed?: number
10
+ }
11
+
12
+ export interface TTS extends HybridObject<{ ios: 'swift' }> {
13
+ readonly isLoaded: boolean
14
+ readonly isGenerating: boolean
15
+ readonly modelId: string
16
+ readonly sampleRate: number
17
+
18
+ load(modelId: string, options?: TTSLoadOptions): Promise<void>
19
+ generate(
20
+ text: string,
21
+ options?: TTSGenerateOptions
22
+ ): Promise<ArrayBuffer>
23
+ stream(
24
+ text: string,
25
+ onAudioChunk: (audio: ArrayBuffer) => void,
26
+ options?: TTSGenerateOptions
27
+ ): Promise<void>
28
+ stop(): void
29
+ unload(): void
30
+ }
package/src/stt.ts ADDED
@@ -0,0 +1,67 @@
1
+ import { NitroModules } from 'react-native-nitro-modules'
2
+ import type {
3
+ STT as STTSpec,
4
+ STTLoadOptions,
5
+ } from './specs/STT.nitro'
6
+
7
+ let instance: STTSpec | null = null
8
+
9
+ function getInstance(): STTSpec {
10
+ if (!instance) {
11
+ instance = NitroModules.createHybridObject<STTSpec>('STT')
12
+ }
13
+ return instance
14
+ }
15
+
16
+ export const STT = {
17
+ load(modelId: string, options?: STTLoadOptions): Promise<void> {
18
+ return getInstance().load(modelId, options)
19
+ },
20
+
21
+ transcribe(audio: ArrayBuffer): Promise<string> {
22
+ return getInstance().transcribe(audio)
23
+ },
24
+
25
+ transcribeStream(
26
+ audio: ArrayBuffer,
27
+ onToken: (token: string) => void
28
+ ): Promise<string> {
29
+ return getInstance().transcribeStream(audio, onToken)
30
+ },
31
+
32
+ startListening(): Promise<void> {
33
+ return getInstance().startListening()
34
+ },
35
+
36
+ transcribeBuffer(): Promise<string> {
37
+ return getInstance().transcribeBuffer()
38
+ },
39
+
40
+ stopListening(): Promise<string> {
41
+ return getInstance().stopListening()
42
+ },
43
+
44
+ stop(): void {
45
+ getInstance().stop()
46
+ },
47
+
48
+ unload(): void {
49
+ getInstance().unload()
50
+ },
51
+
52
+ get isLoaded(): boolean {
53
+ return getInstance().isLoaded
54
+ },
55
+
56
+ get isTranscribing(): boolean {
57
+ return getInstance().isTranscribing
58
+ },
59
+
60
+ get isListening(): boolean {
61
+ return getInstance().isListening
62
+ },
63
+
64
+ get modelId(): string {
65
+ return getInstance().modelId
66
+ },
67
+ }
package/src/tts.ts ADDED
@@ -0,0 +1,60 @@
1
+ import { NitroModules } from 'react-native-nitro-modules'
2
+ import type {
3
+ TTS as TTSSpec,
4
+ TTSLoadOptions,
5
+ TTSGenerateOptions,
6
+ } from './specs/TTS.nitro'
7
+
8
+ let instance: TTSSpec | null = null
9
+
10
+ function getInstance(): TTSSpec {
11
+ if (!instance) {
12
+ instance = NitroModules.createHybridObject<TTSSpec>('TTS')
13
+ }
14
+ return instance
15
+ }
16
+
17
+ export const TTS = {
18
+ load(modelId: string, options?: TTSLoadOptions): Promise<void> {
19
+ return getInstance().load(modelId, options)
20
+ },
21
+
22
+ generate(
23
+ text: string,
24
+ options?: TTSGenerateOptions
25
+ ): Promise<ArrayBuffer> {
26
+ return getInstance().generate(text, options)
27
+ },
28
+
29
+ stream(
30
+ text: string,
31
+ onAudioChunk: (audio: ArrayBuffer) => void,
32
+ options?: TTSGenerateOptions
33
+ ): Promise<void> {
34
+ return getInstance().stream(text, onAudioChunk, options)
35
+ },
36
+
37
+ stop(): void {
38
+ getInstance().stop()
39
+ },
40
+
41
+ unload(): void {
42
+ getInstance().unload()
43
+ },
44
+
45
+ get isLoaded(): boolean {
46
+ return getInstance().isLoaded
47
+ },
48
+
49
+ get isGenerating(): boolean {
50
+ return getInstance().isGenerating
51
+ },
52
+
53
+ get modelId(): string {
54
+ return getInstance().modelId
55
+ },
56
+
57
+ get sampleRate(): number {
58
+ return getInstance().sampleRate
59
+ },
60
+ }