react-native-nitro-mlx 0.2.2 → 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 (110) hide show
  1. package/MLXReactNative.podspec +7 -1
  2. package/ios/Sources/AudioCaptureManager.swift +110 -0
  3. package/ios/Sources/HybridLLM.swift +518 -42
  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 +3 -0
  11. package/lib/module/index.js.map +1 -1
  12. package/lib/module/llm.js +72 -4
  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/tool-utils.js +56 -0
  23. package/lib/module/tool-utils.js.map +1 -0
  24. package/lib/module/tts.js +40 -0
  25. package/lib/module/tts.js.map +1 -0
  26. package/lib/typescript/src/index.d.ts +8 -3
  27. package/lib/typescript/src/index.d.ts.map +1 -1
  28. package/lib/typescript/src/llm.d.ts +46 -4
  29. package/lib/typescript/src/llm.d.ts.map +1 -1
  30. package/lib/typescript/src/models.d.ts +13 -4
  31. package/lib/typescript/src/models.d.ts.map +1 -1
  32. package/lib/typescript/src/specs/LLM.nitro.d.ts +79 -7
  33. package/lib/typescript/src/specs/LLM.nitro.d.ts.map +1 -1
  34. package/lib/typescript/src/specs/STT.nitro.d.ts +28 -0
  35. package/lib/typescript/src/specs/STT.nitro.d.ts.map +1 -0
  36. package/lib/typescript/src/specs/TTS.nitro.d.ts +22 -0
  37. package/lib/typescript/src/specs/TTS.nitro.d.ts.map +1 -0
  38. package/lib/typescript/src/stt.d.ts +16 -0
  39. package/lib/typescript/src/stt.d.ts.map +1 -0
  40. package/lib/typescript/src/tool-utils.d.ts +13 -0
  41. package/lib/typescript/src/tool-utils.d.ts.map +1 -0
  42. package/lib/typescript/src/tts.d.ts +13 -0
  43. package/lib/typescript/src/tts.d.ts.map +1 -0
  44. package/nitrogen/generated/ios/MLXReactNative+autolinking.rb +1 -1
  45. package/nitrogen/generated/ios/MLXReactNative-Swift-Cxx-Bridge.cpp +76 -1
  46. package/nitrogen/generated/ios/MLXReactNative-Swift-Cxx-Bridge.hpp +338 -1
  47. package/nitrogen/generated/ios/MLXReactNative-Swift-Cxx-Umbrella.hpp +28 -1
  48. package/nitrogen/generated/ios/MLXReactNativeAutolinking.mm +17 -1
  49. package/nitrogen/generated/ios/MLXReactNativeAutolinking.swift +31 -1
  50. package/nitrogen/generated/ios/c++/HybridLLMSpecSwift.cpp +1 -1
  51. package/nitrogen/generated/ios/c++/HybridLLMSpecSwift.hpp +18 -3
  52. package/nitrogen/generated/ios/c++/HybridModelManagerSpecSwift.cpp +1 -1
  53. package/nitrogen/generated/ios/c++/HybridModelManagerSpecSwift.hpp +1 -1
  54. package/nitrogen/generated/ios/c++/HybridSTTSpecSwift.cpp +11 -0
  55. package/nitrogen/generated/ios/c++/HybridSTTSpecSwift.hpp +149 -0
  56. package/nitrogen/generated/ios/c++/HybridTTSSpecSwift.cpp +11 -0
  57. package/nitrogen/generated/ios/c++/HybridTTSSpecSwift.hpp +128 -0
  58. package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__shared_ptr_AnyMap______std__shared_ptr_AnyMap_.swift +62 -0
  59. package/nitrogen/generated/ios/swift/Func_void.swift +1 -1
  60. package/nitrogen/generated/ios/swift/Func_void_bool.swift +1 -1
  61. package/nitrogen/generated/ios/swift/Func_void_double.swift +1 -1
  62. package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +1 -1
  63. package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_AnyMap_.swift +47 -0
  64. package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_ArrayBuffer_.swift +47 -0
  65. package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_Promise_std__shared_ptr_AnyMap___.swift +67 -0
  66. package/nitrogen/generated/ios/swift/Func_void_std__string.swift +1 -1
  67. package/nitrogen/generated/ios/swift/Func_void_std__string_std__string.swift +47 -0
  68. package/nitrogen/generated/ios/swift/Func_void_std__vector_std__string_.swift +1 -1
  69. package/nitrogen/generated/ios/swift/GenerationStats.swift +14 -3
  70. package/nitrogen/generated/ios/swift/HybridLLMSpec.swift +3 -2
  71. package/nitrogen/generated/ios/swift/HybridLLMSpec_cxx.swift +38 -2
  72. package/nitrogen/generated/ios/swift/HybridModelManagerSpec.swift +1 -1
  73. package/nitrogen/generated/ios/swift/HybridModelManagerSpec_cxx.swift +1 -1
  74. package/nitrogen/generated/ios/swift/HybridSTTSpec.swift +66 -0
  75. package/nitrogen/generated/ios/swift/HybridSTTSpec_cxx.swift +286 -0
  76. package/nitrogen/generated/ios/swift/HybridTTSSpec.swift +63 -0
  77. package/nitrogen/generated/ios/swift/HybridTTSSpec_cxx.swift +229 -0
  78. package/nitrogen/generated/ios/swift/LLMLoadOptions.swift +44 -2
  79. package/nitrogen/generated/ios/swift/LLMMessage.swift +1 -1
  80. package/nitrogen/generated/ios/swift/STTLoadOptions.swift +66 -0
  81. package/nitrogen/generated/ios/swift/TTSGenerateOptions.swift +78 -0
  82. package/nitrogen/generated/ios/swift/TTSLoadOptions.swift +66 -0
  83. package/nitrogen/generated/ios/swift/ToolDefinition.swift +113 -0
  84. package/nitrogen/generated/ios/swift/ToolParameter.swift +69 -0
  85. package/nitrogen/generated/shared/c++/GenerationStats.hpp +7 -3
  86. package/nitrogen/generated/shared/c++/HybridLLMSpec.cpp +2 -1
  87. package/nitrogen/generated/shared/c++/HybridLLMSpec.hpp +3 -2
  88. package/nitrogen/generated/shared/c++/HybridModelManagerSpec.cpp +1 -1
  89. package/nitrogen/generated/shared/c++/HybridModelManagerSpec.hpp +1 -1
  90. package/nitrogen/generated/shared/c++/HybridSTTSpec.cpp +32 -0
  91. package/nitrogen/generated/shared/c++/HybridSTTSpec.hpp +78 -0
  92. package/nitrogen/generated/shared/c++/HybridTTSSpec.cpp +29 -0
  93. package/nitrogen/generated/shared/c++/HybridTTSSpec.hpp +78 -0
  94. package/nitrogen/generated/shared/c++/LLMLoadOptions.hpp +10 -3
  95. package/nitrogen/generated/shared/c++/LLMMessage.hpp +1 -1
  96. package/nitrogen/generated/shared/c++/STTLoadOptions.hpp +76 -0
  97. package/nitrogen/generated/shared/c++/TTSGenerateOptions.hpp +80 -0
  98. package/nitrogen/generated/shared/c++/TTSLoadOptions.hpp +76 -0
  99. package/nitrogen/generated/shared/c++/ToolDefinition.hpp +93 -0
  100. package/nitrogen/generated/shared/c++/ToolParameter.hpp +87 -0
  101. package/package.json +13 -8
  102. package/src/index.ts +40 -3
  103. package/src/llm.ts +90 -5
  104. package/src/models.ts +81 -1
  105. package/src/specs/LLM.nitro.ts +111 -7
  106. package/src/specs/STT.nitro.ts +35 -0
  107. package/src/specs/TTS.nitro.ts +30 -0
  108. package/src/stt.ts +67 -0
  109. package/src/tool-utils.ts +74 -0
  110. package/src/tts.ts +60 -0
@@ -24,10 +24,16 @@ Pod::Spec.new do |s|
24
24
 
25
25
  spm_dependency(s,
26
26
  url: "https://github.com/ml-explore/mlx-swift-lm.git",
27
- requirement: {kind: "upToNextMinorVersion", minimumVersion: "2.29.2"},
27
+ requirement: {kind: "upToNextMinorVersion", minimumVersion: "2.30.3"},
28
28
  products: ["MLXLLM", "MLXLMCommon"]
29
29
  )
30
30
 
31
+ spm_dependency(s,
32
+ url: "https://github.com/Blaizzy/mlx-audio-swift.git",
33
+ requirement: {kind: "branch", branch: "main"},
34
+ products: ["MLXAudioTTS", "MLXAudioSTT", "MLXAudioCore"]
35
+ )
36
+
31
37
  s.pod_target_xcconfig = {
32
38
  # C++ compiler flags, mainly for folly.
33
39
  "GCC_PREPROCESSOR_DEFINITIONS" => "$(inherited) FOLLY_NO_CONFIG FOLLY_CFG_NO_COROUTINES"
@@ -0,0 +1,110 @@
1
+ import AVFoundation
2
+ import Foundation
3
+ internal import MLX
4
+
5
+ class AudioCaptureManager {
6
+ private let audioEngine = AVAudioEngine()
7
+ private var audioBuffer: [Float] = []
8
+ private let bufferLock = NSLock()
9
+ private let targetSampleRate: Double = 16000
10
+
11
+ var isCapturing: Bool { audioEngine.isRunning }
12
+
13
+ func startCapturing() async throws {
14
+ let session = AVAudioSession.sharedInstance()
15
+ try session.setCategory(.record, mode: .measurement)
16
+ try session.setActive(true)
17
+
18
+ let inputNode = audioEngine.inputNode
19
+ let inputFormat = inputNode.outputFormat(forBus: 0)
20
+ let outputFormat = AVAudioFormat(
21
+ commonFormat: .pcmFormatFloat32,
22
+ sampleRate: targetSampleRate,
23
+ channels: 1,
24
+ interleaved: false
25
+ )!
26
+
27
+ guard
28
+ let converter = AVAudioConverter(
29
+ from: inputFormat, to: outputFormat)
30
+ else {
31
+ throw NSError(
32
+ domain: "AudioCaptureManager",
33
+ code: -1,
34
+ userInfo: [
35
+ NSLocalizedDescriptionKey:
36
+ "Failed to create audio converter"
37
+ ]
38
+ )
39
+ }
40
+
41
+ bufferLock.lock()
42
+ audioBuffer.removeAll()
43
+ bufferLock.unlock()
44
+
45
+ inputNode.installTap(
46
+ onBus: 0, bufferSize: 4096, format: inputFormat
47
+ ) { [weak self] buffer, _ in
48
+ guard let self else { return }
49
+
50
+ let frameCount = AVAudioFrameCount(
51
+ targetSampleRate * Double(buffer.frameLength)
52
+ / inputFormat.sampleRate
53
+ )
54
+ guard
55
+ let convertedBuffer = AVAudioPCMBuffer(
56
+ pcmFormat: outputFormat, frameCapacity: frameCount)
57
+ else { return }
58
+
59
+ var error: NSError?
60
+ converter.convert(to: convertedBuffer, error: &error) {
61
+ _, outStatus in
62
+ outStatus.pointee = .haveData
63
+ return buffer
64
+ }
65
+
66
+ if error == nil, let channelData = convertedBuffer.floatChannelData {
67
+ let frames = Int(convertedBuffer.frameLength)
68
+ self.bufferLock.lock()
69
+ self.audioBuffer.append(
70
+ contentsOf: UnsafeBufferPointer(
71
+ start: channelData[0], count: frames))
72
+ self.bufferLock.unlock()
73
+ }
74
+ }
75
+
76
+ audioEngine.prepare()
77
+ try audioEngine.start()
78
+ }
79
+
80
+ func snapshotAndClear() -> MLXArray? {
81
+ bufferLock.lock()
82
+ let samples = audioBuffer
83
+ audioBuffer.removeAll()
84
+ bufferLock.unlock()
85
+
86
+ guard samples.count >= 8000 else { return nil }
87
+ return MLXArray(samples)
88
+ }
89
+
90
+ func snapshot() -> MLXArray? {
91
+ bufferLock.lock()
92
+ let samples = audioBuffer
93
+ bufferLock.unlock()
94
+
95
+ guard samples.count >= 16000 else { return nil }
96
+ return MLXArray(samples)
97
+ }
98
+
99
+ func stopCapturing() -> MLXArray {
100
+ audioEngine.inputNode.removeTap(onBus: 0)
101
+ audioEngine.stop()
102
+
103
+ bufferLock.lock()
104
+ let samples = audioBuffer
105
+ audioBuffer.removeAll()
106
+ bufferLock.unlock()
107
+
108
+ return MLXArray(samples)
109
+ }
110
+ }