@inferrlm/react-native-mlx 0.2.0-inferrlm.2 → 0.4.1
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/MLXReactNative.podspec +9 -3
- package/ios/Sources/AudioCaptureManager.swift +110 -0
- package/ios/Sources/HybridLLM.swift +562 -74
- package/ios/Sources/HybridSTT.swift +202 -0
- package/ios/Sources/HybridTTS.swift +145 -0
- package/ios/Sources/JSONHelpers.swift +9 -0
- package/ios/Sources/ModelDownloader.swift +26 -12
- package/ios/Sources/StreamEventEmitter.swift +132 -0
- package/ios/Sources/ThinkingStateMachine.swift +206 -0
- package/lib/module/index.js +4 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/llm.js +72 -4
- package/lib/module/llm.js.map +1 -1
- package/lib/module/models.js +319 -0
- package/lib/module/models.js.map +1 -1
- package/lib/module/specs/STT.nitro.js +4 -0
- package/lib/module/specs/STT.nitro.js.map +1 -0
- package/lib/module/specs/TTS.nitro.js +4 -0
- package/lib/module/specs/TTS.nitro.js.map +1 -0
- package/lib/module/stt.js +49 -0
- package/lib/module/stt.js.map +1 -0
- package/lib/module/tool-utils.js +56 -0
- package/lib/module/tool-utils.js.map +1 -0
- package/lib/module/tts.js +40 -0
- package/lib/module/tts.js.map +1 -0
- package/lib/typescript/src/index.d.ts +8 -3
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/llm.d.ts +46 -4
- package/lib/typescript/src/llm.d.ts.map +1 -1
- package/lib/typescript/src/models.d.ts +39 -1
- package/lib/typescript/src/models.d.ts.map +1 -1
- package/lib/typescript/src/specs/LLM.nitro.d.ts +79 -7
- package/lib/typescript/src/specs/LLM.nitro.d.ts.map +1 -1
- package/lib/typescript/src/specs/STT.nitro.d.ts +28 -0
- package/lib/typescript/src/specs/STT.nitro.d.ts.map +1 -0
- package/lib/typescript/src/specs/TTS.nitro.d.ts +22 -0
- package/lib/typescript/src/specs/TTS.nitro.d.ts.map +1 -0
- package/lib/typescript/src/stt.d.ts +16 -0
- package/lib/typescript/src/stt.d.ts.map +1 -0
- package/lib/typescript/src/tool-utils.d.ts +13 -0
- package/lib/typescript/src/tool-utils.d.ts.map +1 -0
- package/lib/typescript/src/tts.d.ts +13 -0
- package/lib/typescript/src/tts.d.ts.map +1 -0
- package/nitrogen/generated/ios/MLXReactNative+autolinking.rb +1 -1
- package/nitrogen/generated/ios/MLXReactNative-Swift-Cxx-Bridge.cpp +76 -1
- package/nitrogen/generated/ios/MLXReactNative-Swift-Cxx-Bridge.hpp +338 -1
- package/nitrogen/generated/ios/MLXReactNative-Swift-Cxx-Umbrella.hpp +28 -1
- package/nitrogen/generated/ios/MLXReactNativeAutolinking.mm +17 -1
- package/nitrogen/generated/ios/MLXReactNativeAutolinking.swift +31 -1
- package/nitrogen/generated/ios/c++/HybridLLMSpecSwift.cpp +1 -1
- package/nitrogen/generated/ios/c++/HybridLLMSpecSwift.hpp +18 -3
- package/nitrogen/generated/ios/c++/HybridModelManagerSpecSwift.cpp +1 -1
- package/nitrogen/generated/ios/c++/HybridModelManagerSpecSwift.hpp +1 -1
- package/nitrogen/generated/ios/c++/HybridSTTSpecSwift.cpp +11 -0
- package/nitrogen/generated/ios/c++/HybridSTTSpecSwift.hpp +149 -0
- package/nitrogen/generated/ios/c++/HybridTTSSpecSwift.cpp +11 -0
- package/nitrogen/generated/ios/c++/HybridTTSSpecSwift.hpp +128 -0
- 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
- package/nitrogen/generated/ios/swift/Func_void.swift +1 -1
- package/nitrogen/generated/ios/swift/Func_void_bool.swift +1 -1
- package/nitrogen/generated/ios/swift/Func_void_double.swift +1 -1
- package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +1 -1
- package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_AnyMap_.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_ArrayBuffer_.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_Promise_std__shared_ptr_AnyMap___.swift +67 -0
- package/nitrogen/generated/ios/swift/Func_void_std__string.swift +1 -1
- package/nitrogen/generated/ios/swift/Func_void_std__string_std__string.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_std__vector_std__string_.swift +1 -1
- package/nitrogen/generated/ios/swift/GenerationStats.swift +14 -3
- package/nitrogen/generated/ios/swift/HybridLLMSpec.swift +3 -2
- package/nitrogen/generated/ios/swift/HybridLLMSpec_cxx.swift +38 -2
- package/nitrogen/generated/ios/swift/HybridModelManagerSpec.swift +1 -1
- package/nitrogen/generated/ios/swift/HybridModelManagerSpec_cxx.swift +1 -1
- package/nitrogen/generated/ios/swift/HybridSTTSpec.swift +66 -0
- package/nitrogen/generated/ios/swift/HybridSTTSpec_cxx.swift +286 -0
- package/nitrogen/generated/ios/swift/HybridTTSSpec.swift +63 -0
- package/nitrogen/generated/ios/swift/HybridTTSSpec_cxx.swift +229 -0
- package/nitrogen/generated/ios/swift/LLMLoadOptions.swift +44 -2
- package/nitrogen/generated/ios/swift/LLMMessage.swift +1 -1
- package/nitrogen/generated/ios/swift/STTLoadOptions.swift +66 -0
- package/nitrogen/generated/ios/swift/TTSGenerateOptions.swift +78 -0
- package/nitrogen/generated/ios/swift/TTSLoadOptions.swift +66 -0
- package/nitrogen/generated/ios/swift/ToolDefinition.swift +113 -0
- package/nitrogen/generated/ios/swift/ToolParameter.swift +69 -0
- package/nitrogen/generated/shared/c++/GenerationStats.hpp +7 -3
- package/nitrogen/generated/shared/c++/HybridLLMSpec.cpp +2 -1
- package/nitrogen/generated/shared/c++/HybridLLMSpec.hpp +3 -2
- package/nitrogen/generated/shared/c++/HybridModelManagerSpec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridModelManagerSpec.hpp +1 -1
- package/nitrogen/generated/shared/c++/HybridSTTSpec.cpp +32 -0
- package/nitrogen/generated/shared/c++/HybridSTTSpec.hpp +78 -0
- package/nitrogen/generated/shared/c++/HybridTTSSpec.cpp +29 -0
- package/nitrogen/generated/shared/c++/HybridTTSSpec.hpp +78 -0
- package/nitrogen/generated/shared/c++/LLMLoadOptions.hpp +10 -3
- package/nitrogen/generated/shared/c++/LLMMessage.hpp +1 -1
- package/nitrogen/generated/shared/c++/STTLoadOptions.hpp +76 -0
- package/nitrogen/generated/shared/c++/TTSGenerateOptions.hpp +80 -0
- package/nitrogen/generated/shared/c++/TTSLoadOptions.hpp +76 -0
- package/nitrogen/generated/shared/c++/ToolDefinition.hpp +93 -0
- package/nitrogen/generated/shared/c++/ToolParameter.hpp +87 -0
- package/package.json +13 -8
- package/src/index.ts +48 -4
- package/src/llm.ts +90 -5
- package/src/models.ts +371 -0
- package/src/specs/LLM.nitro.ts +111 -7
- package/src/specs/STT.nitro.ts +35 -0
- package/src/specs/TTS.nitro.ts +30 -0
- package/src/stt.ts +67 -0
- package/src/tool-utils.ts +74 -0
- package/src/tts.ts +60 -0
package/MLXReactNative.podspec
CHANGED
|
@@ -10,8 +10,8 @@ Pod::Spec.new do |s|
|
|
|
10
10
|
s.license = package["license"]
|
|
11
11
|
s.authors = package["author"]
|
|
12
12
|
|
|
13
|
-
s.platforms = { :ios =>
|
|
14
|
-
s.source = { :git => "https://github.com/
|
|
13
|
+
s.platforms = { :ios => 26.0, :visionos => 1.0 }
|
|
14
|
+
s.source = { :git => "https://github.com/corasan/react-native-nitro-mlx.git", :tag => "#{s.version}" }
|
|
15
15
|
|
|
16
16
|
s.source_files = [
|
|
17
17
|
# Implementation (Swift)
|
|
@@ -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: "
|
|
27
|
+
requirement: {kind: "branch", branch: "main"},
|
|
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
|
+
}
|