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.
- package/MLXReactNative.podspec +7 -1
- package/ios/Sources/AudioCaptureManager.swift +110 -0
- package/ios/Sources/HybridLLM.swift +518 -42
- 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 +3 -0
- 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 +97 -26
- 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 +13 -4
- 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 +40 -3
- package/src/llm.ts +90 -5
- package/src/models.ts +81 -1
- 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
|
@@ -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.
|
|
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
|
+
}
|