From a3394df1499ef19ae834bad7ad3ce2aa45b27b7f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micha=C5=82=20Dydek?=
<54865962+mdydek@users.noreply.github.com>
Date: Tue, 22 Apr 2025 13:56:17 +0200
Subject: [PATCH 1/3] feat: llama with whisper demo (#179)
- [ ] Bug fix (non-breaking change which fixes an issue)
- [x] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing
functionality to not work as expected)
- [ ] Documentation update (improves or adds clarity to existing
documentation)
- [x] iOS
- [x] Android
- [x] I have performed a self-review of my code
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] I have updated the documentation accordingly
- [ ] My changes generate no new warnings
---
examples/llama/ios/llama/Info.plist | 81 ++
examples/llm/assets/icons/mic_icon.svg | 4 +
examples/llm/assets/icons/stop_icon.svg | 4 +
examples/llm/ios/Podfile.lock | 144 +--
examples/llm/package.json | 3 +-
examples/llm/screens/LLMScreen.tsx | 307 +++--
examples/llm/yarn.lock | 1491 +++--------------------
7 files changed, 546 insertions(+), 1488 deletions(-)
create mode 100644 examples/llama/ios/llama/Info.plist
create mode 100644 examples/llm/assets/icons/mic_icon.svg
create mode 100644 examples/llm/assets/icons/stop_icon.svg
diff --git a/examples/llama/ios/llama/Info.plist b/examples/llama/ios/llama/Info.plist
new file mode 100644
index 00000000..1febd3e0
--- /dev/null
+++ b/examples/llama/ios/llama/Info.plist
@@ -0,0 +1,81 @@
+
+
+
+
+ CADisableMinimumFrameDurationOnPhone
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ CFBundleDisplayName
+ llama
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ $(PRODUCT_NAME)
+ CFBundlePackageType
+ $(PRODUCT_BUNDLE_PACKAGE_TYPE)
+ CFBundleShortVersionString
+ 1.0.0
+ CFBundleSignature
+ ????
+ CFBundleURLTypes
+
+
+ CFBundleURLSchemes
+
+ com.anonymous.llama
+
+
+
+ CFBundleVersion
+ 1
+ LSMinimumSystemVersion
+ 12.0
+ LSRequiresIPhoneOS
+
+ NSAppTransportSecurity
+
+ NSAllowsArbitraryLoads
+
+ NSAllowsLocalNetworking
+
+
+ NSMicrophoneUsageDescription
+ We need your permission to use the microphone.
+ UIAppFonts
+
+ Aeonik-Regular.otf
+ Aeonik-Medium.otf
+
+ UILaunchStoryboardName
+ SplashScreen
+ UIRequiredDeviceCapabilities
+
+ arm64
+
+ UIRequiresFullScreen
+
+ UIStatusBarStyle
+ UIStatusBarStyleDefault
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UIUserInterfaceStyle
+ Light
+ UIViewControllerBasedStatusBarAppearance
+
+
+
diff --git a/examples/llm/assets/icons/mic_icon.svg b/examples/llm/assets/icons/mic_icon.svg
new file mode 100644
index 00000000..955808bf
--- /dev/null
+++ b/examples/llm/assets/icons/mic_icon.svg
@@ -0,0 +1,4 @@
+
+
\ No newline at end of file
diff --git a/examples/llm/assets/icons/stop_icon.svg b/examples/llm/assets/icons/stop_icon.svg
new file mode 100644
index 00000000..cb051899
--- /dev/null
+++ b/examples/llm/assets/icons/stop_icon.svg
@@ -0,0 +1,4 @@
+
+
\ No newline at end of file
diff --git a/examples/llm/ios/Podfile.lock b/examples/llm/ios/Podfile.lock
index 9f1afe5b..b217a449 100644
--- a/examples/llm/ios/Podfile.lock
+++ b/examples/llm/ios/Podfile.lock
@@ -1,7 +1,7 @@
PODS:
- boost (1.84.0)
- DoubleConversion (1.1.6)
- - EXConstants (17.1.5):
+ - EXConstants (17.1.6):
- ExpoModulesCore
- Expo (53.0.8):
- DoubleConversion
@@ -67,6 +67,8 @@ PODS:
- ReactCommon/turbomodule/bridging
- ReactCommon/turbomodule/core
- Yoga
+ - ExpoSpeech (13.1.4):
+ - ExpoModulesCore
- fast_float (6.1.4)
- FBLazyVector (0.79.2)
- fmt (11.0.2)
@@ -1399,7 +1401,7 @@ PODS:
- React-jsiexecutor
- React-RCTFBReactNativeSpec
- ReactCommon/turbomodule/core
- - react-native-executorch (0.3.2):
+ - react-native-executorch (0.3.1-stt-7):
- DoubleConversion
- glog
- hermes-engine
@@ -2009,6 +2011,7 @@ DEPENDENCIES:
- ExpoFont (from `../node_modules/expo-font/ios`)
- ExpoKeepAwake (from `../node_modules/expo-keep-awake/ios`)
- ExpoModulesCore (from `../node_modules/expo-modules-core`)
+ - ExpoSpeech (from `../node_modules/expo-speech/ios`)
- fast_float (from `../node_modules/react-native/third-party-podspecs/fast_float.podspec`)
- FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`)
- fmt (from `../node_modules/react-native/third-party-podspecs/fmt.podspec`)
@@ -2112,6 +2115,8 @@ EXTERNAL SOURCES:
:path: "../node_modules/expo-keep-awake/ios"
ExpoModulesCore:
:path: "../node_modules/expo-modules-core"
+ ExpoSpeech:
+ :path: "../node_modules/expo-speech/ios"
fast_float:
:podspec: "../node_modules/react-native/third-party-podspecs/fast_float.podspec"
FBLazyVector:
@@ -2259,91 +2264,92 @@ EXTERNAL SOURCES:
:path: "../node_modules/react-native/ReactCommon/yoga"
SPEC CHECKSUMS:
- boost: 1dca942403ed9342f98334bf4c3621f011aa7946
- DoubleConversion: f16ae600a246532c4020132d54af21d0ddb2a385
- EXConstants: 26f334022fc0b454b7ecdc7c12d36ffa68c7c397
- Expo: 54adb30ffa0a086c1a4bb87364d69b7917caeb49
- ExpoAsset: 3ea3275cca6a7793b3d36fbf1075c590f803fbcb
- ExpoBrightness: 05e750736f8886dcf235212b0caf85b0f605fc88
- ExpoCalendar: 660542dc1c5ef98f46bedcc8745aa707df5d501a
- ExpoFileSystem: ff47f2208da552fbee872dedc4e74fb7c6ac5907
- ExpoFont: 312c73403bbd4f98e1d6a5330641a56292583cd2
- ExpoKeepAwake: e8dedc115d9f6f24b153ccd2d1d8efcdfd68a527
- ExpoModulesCore: 0bf5158ae9fb71e575582a8a48dbd26ced42f306
+ boost: 7e761d76ca2ce687f7cc98e698152abd03a18f90
+ DoubleConversion: cb417026b2400c8f53ae97020b2be961b59470cb
+ EXConstants: 9f310f44bfedba09087042756802040e464323c0
+ Expo: 769ab5c190382eedebc733af6708bbc9ca5f643b
+ ExpoAsset: 3bc9adb7dbbf27ae82c18ca97eb988a3ae7e73b1
+ ExpoBrightness: c335c6ccc082d5249a4b38dba5cd9a08aa0bf62b
+ ExpoCalendar: f5f94ea8dcd957b1434beb4e1c0da1af063322e6
+ ExpoFileSystem: 0f3f466ecd3560f55768cd3f94ac3a17f093b8e6
+ ExpoFont: abbb91a911eb961652c2b0a22eef801860425ed6
+ ExpoKeepAwake: bf0811570c8da182bfb879169437d4de298376e7
+ ExpoModulesCore: 3ac17421302df62928fc99c133cf25bdbcf0b004
+ ExpoSpeech: 4db7ef7888b9edc39ca9afee54e9c4b3df269ccb
fast_float: 06eeec4fe712a76acc9376682e4808b05ce978b6
FBLazyVector: 84b955f7b4da8b895faf5946f73748267347c975
- fmt: 01b82d4ca6470831d1cc0852a1af644be019e8f6
- glog: 08b301085f15bcbb6ff8632a8ebaf239aae04e6a
+ fmt: a40bb5bd0294ea969aaaba240a927bd33d878cdd
+ glog: 5683914934d5b6e4240e497e0f4a3b42d1854183
hermes-engine: 314be5250afa5692b57b4dd1705959e1973a8ebe
opencv-rne: 63e933ae2373fc91351f9a348dc46c3f523c2d3f
- RCT-Folly: 36fe2295e44b10d831836cc0d1daec5f8abcf809
+ RCT-Folly: e78785aa9ba2ed998ea4151e314036f6c49e6d82
RCTDeprecation: 83ffb90c23ee5cea353bd32008a7bca100908f8c
RCTRequired: eb7c0aba998009f47a540bec9e9d69a54f68136e
RCTTypeSafety: 659ae318c09de0477fd27bbc9e140071c7ea5c93
React: c2d3aa44c49bb34e4dfd49d3ee92da5ebacc1c1c
React-callinvoker: 1bdfb7549b5af266d85757193b5069f60659ef9d
- React-Core: 7150cf9b6a5af063b37003062689f1691e79c020
- React-CoreModules: 15a85e6665d61678942da6ae485b351f4c699049
- React-cxxreact: 74f9de59259ac951923f5726aa14f0398f167af9
+ React-Core: 10597593fdbae06f0089881e025a172e51d4a769
+ React-CoreModules: 6907b255529dd46895cf687daa67b24484a612c2
+ React-cxxreact: a9f5b8180d6955bc3f6a3fcd657c4d9b4d95c1f6
React-debug: e74e76912b91e08d580c481c34881899ccf63da9
- React-defaultsnativemodule: 628285212bbd65417d40ad6a9f8781830fda6c98
- React-domnativemodule: 185d9808198405c176784aaf33403d713bd24fb7
- React-Fabric: c814804affbe1952e16149ddd20256e1bccae67e
- React-FabricComponents: 81ef47d596966121784afec9924f9562a29b1691
- React-FabricImage: f14f371d678aa557101def954ac3ba27e48948ff
+ React-defaultsnativemodule: 11f6ee2cf69bf3af9d0f28a6253def33d21b5266
+ React-domnativemodule: f940bbc4fa9e134190acbf3a4a9f95621b5a8f51
+ React-Fabric: 6f5c357bf3a42ff11f8844ad3fc7a1eb04f4b9de
+ React-FabricComponents: 10e0c0209822ac9e69412913a8af1ca33573379b
+ React-FabricImage: f582e764072dfa4715ae8c42979a5bace9cbcc12
React-featureflags: d5facceff8f8f6de430e0acecf4979a9a0839ba9
- React-featureflagsnativemodule: 96f0ab285382d95c90f663e02526a5ceefa95a11
- React-graphics: 1a66ee0a3f093b125b853f6370296fadcaf6f233
- React-hermes: 8b86e5f54a65ecb69cdf22b3a00a11562eda82d2
- React-idlecallbacksnativemodule: 5c25ab145c602264d00cb26a397ab52e0efa031c
- React-ImageManager: 15e34bd5ef1ac4a18e96660817ef70a7f99ee8c2
- React-jserrorhandler: 02cdf2cd45350108be1ffd2b164578936dbbdff7
- React-jsi: 6af1987cfbb1b6621664fdbf6c7b62bd4d38c923
- React-jsiexecutor: 51f372998e0303585cb0317232b938d694663cbd
- React-jsinspector: 3539ad976d073bfaa8a7d2fa9bef35e70e55033e
- React-jsinspectortracing: e8dbacaf67c201f23052ca1c2bae2f7b84dec443
- React-jsitooling: 95a34f41e3c249d42181de13b4f8d854f178ca9f
- React-jsitracing: 25b029cf5cad488252d46da19dd8c4c134fd5fe4
- React-logger: 368570a253f00879a1e4fea24ed4047e72e7bbf3
- React-Mapbuffer: c04fcda1c6281fc0a6824c7dcc1633dd217ac1ec
- React-microtasksnativemodule: ca2804a25fdcefffa0aa942aa23ab53b99614a34
- react-native-executorch: aa97983ed344f0cbfb47f531f0c24638c579f1c1
- react-native-safe-area-context: 00d03dc688ba86664be66f9e3f203fc7d747d899
- React-NativeModulesApple: 452b86b29fae99ed0a4015dca3ad9cd222f88abf
+ React-featureflagsnativemodule: a7dd141f1ef4b7c1331af0035689fbc742a49ff4
+ React-graphics: 36ae3407172c1c77cea29265d2b12b90aaef6aa0
+ React-hermes: 9116d4e6d07abeb519a2852672de087f44da8f12
+ React-idlecallbacksnativemodule: ae7f5ffc6cf2d2058b007b78248e5b08172ad5c3
+ React-ImageManager: 9daee0dc99ad6a001d4b9e691fbf37107e2b7b54
+ React-jserrorhandler: 1e6211581071edaf4ecd5303147328120c73f4dc
+ React-jsi: 753ba30c902f3a41fa7f956aca8eea3317a44ee6
+ React-jsiexecutor: 47520714aa7d9589c51c0f3713dfbfca4895d4f9
+ React-jsinspector: cfd27107f6d6f1076a57d88c932401251560fe5f
+ React-jsinspectortracing: 76a7d791f3c0c09a0d2bf6f46dfb0e79a4fcc0ac
+ React-jsitooling: 995e826570dd58f802251490486ebd3244a037ab
+ React-jsitracing: 094ae3d8c123cea67b50211c945b7c0443d3e97b
+ React-logger: 8edfcedc100544791cd82692ca5a574240a16219
+ React-Mapbuffer: c3f4b608e4a59dd2f6a416ef4d47a14400194468
+ React-microtasksnativemodule: 054f34e9b82f02bd40f09cebd4083828b5b2beb6
+ react-native-executorch: 8bca350ccbb66246dd7366fb6514fed57083930e
+ react-native-safe-area-context: 562163222d999b79a51577eda2ea8ad2c32b4d06
+ React-NativeModulesApple: 2c4377e139522c3d73f5df582e4f051a838ff25e
React-oscompat: ef5df1c734f19b8003e149317d041b8ce1f7d29c
- React-perflogger: 6fd2f6811533e9c19a61e855c3033eecbf4ad2a0
- React-performancetimeline: abf31259d794c9274b3ea19c5016186925eec6c4
+ React-perflogger: 9a151e0b4c933c9205fd648c246506a83f31395d
+ React-performancetimeline: 5b0dfc0acba29ea0269ddb34cd6dd59d3b8a1c66
React-RCTActionSheet: a499b0d6d9793886b67ba3e16046a3fef2cdbbc3
- React-RCTAnimation: 2595dcb10a82216a511b54742f8c28d793852ac6
- React-RCTAppDelegate: f03604b70f57c9469a84a159d8abecf793a5bcff
- React-RCTBlob: e00f9b4e2f151938f4d9864cf33ebf24ac03328a
- React-RCTFabric: 3945d116fd271598db262d4e6ed5691d431ed9e8
- React-RCTFBReactNativeSpec: 0f4d4f0da938101f2ca9d5333a8f46e527ad2819
- React-RCTImage: dac5e9f8ec476aefe6e60ee640ebc1dfaf1a4dbe
- React-RCTLinking: 494b785a40d952a1dfbe712f43214376e5f0e408
- React-RCTNetwork: b3d7c30cd21793e268db107dd0980cb61b3c1c44
- React-RCTRuntime: a8ff419d437228e7b8a793b14f9d711e1cbb82af
- React-RCTSettings: a060c7e381a3896104761b8eed7e284d95e37df3
- React-RCTText: 4f272b72dbb61f390d8c8274528f9fdbff983806
- React-RCTVibration: 0e5326220719aca12473d703aa46693e3b4ce67a
+ React-RCTAnimation: cc64adc259aabc3354b73065e2231d796dfce576
+ React-RCTAppDelegate: 9d523da768f1c9e84c5f3b7e3624d097dfb0e16b
+ React-RCTBlob: e727f53eeefded7e6432eb76bd22b57bc880e5d1
+ React-RCTFabric: 58590aa4fdb4ad546c06a7449b486cf6844e991f
+ React-RCTFBReactNativeSpec: 9064c63d99e467a3893e328ba3612745c3c3a338
+ React-RCTImage: 7159cbdbb18a09d97ba1a611416eced75b3ccb29
+ React-RCTLinking: 46293afdb859bccc63e1d3dedc6901a3c04ef360
+ React-RCTNetwork: 4a6cd18f5bcd0363657789c64043123a896b1170
+ React-RCTRuntime: 5ab904fd749aa52f267ef771d265612582a17880
+ React-RCTSettings: 61e361dc85136d1cb0e148b7541993d2ee950ea7
+ React-RCTText: abd1e196c3167175e6baef18199c6d9d8ac54b4e
+ React-RCTVibration: 490e0dcb01a3fe4a0dfb7bc51ad5856d8b84f343
React-rendererconsistency: 351fdbc5c1fe4da24243d939094a80f0e149c7a1
- React-renderercss: d333f2ada83969591100d91ec6b23ca2e17e1507
- React-rendererdebug: 039e5949b72ba63c703de020701e3fd152434c61
+ React-renderercss: 3438814bee838ae7840a633ab085ac81699fd5cf
+ React-rendererdebug: 0ac2b9419ad6f88444f066d4b476180af311fb1e
React-rncore: 57ed480649bb678d8bdc386d20fee8bf2b0c307c
- React-RuntimeApple: 344a5e1105256000afabaa8df12c3e4cab880340
- React-RuntimeCore: 0e48fb5e5160acc0334c7a723a42d42cef4b58b6
+ React-RuntimeApple: 8b7a9788f31548298ba1990620fe06b40de65ad7
+ React-RuntimeCore: e03d96fbd57ce69fd9bca8c925942194a5126dbc
React-runtimeexecutor: d60846710facedd1edb70c08b738119b3ee2c6c2
- React-RuntimeHermes: 064286a03871d932c99738e0f8ef854962ab4b99
- React-runtimescheduler: e917ab17ae08c204af1ebf8f669b7e411b0220c8
+ React-RuntimeHermes: aab794755d9f6efd249b61f3af4417296904e3ba
+ React-runtimescheduler: c3cd124fa5db7c37f601ee49ca0d97019acd8788
React-timing: a90f4654cbda9c628614f9bee68967f1768bd6a5
- React-utils: 51c4e71608b8133fecc9a15801d244ae7bdf3758
- ReactAppDependencyProvider: d5dcc564f129632276bd3184e60f053fcd574d6b
- ReactCodegen: fda99a79c866370190e162083a35602fdc314e5d
- ReactCommon: 4d0da92a5eb8da86c08e3ec34bd23ab439fb2461
- RNReanimated: 8b24b49fc13fce9a6e1729ccff645a63d2b7a6d1
- RNSVG: ee32efbed652c5151fd3f98bed13c68af285bc38
+ React-utils: a612d50555b6f0f90c74b7d79954019ad47f5de6
+ ReactAppDependencyProvider: 04d5eb15eb46be6720e17a4a7fa92940a776e584
+ ReactCodegen: c63eda03ba1d94353fb97b031fc84f75a0d125ba
+ ReactCommon: 76d2dc87136d0a667678668b86f0fca0c16fdeb0
+ RNReanimated: 2313402fe27fecb7237619e9c6fcee3177f08a65
+ RNSVG: 794f269526df9ddc1f79b3d1a202b619df0368e3
SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748
- Yoga: 9f110fc4b7aa538663cba3c14cbb1c335f43c13f
+ Yoga: c758bfb934100bb4bf9cbaccb52557cee35e8bdf
PODFILE CHECKSUM: bba19a069e673f2259009e9d2caab44374fdebcf
diff --git a/examples/llm/package.json b/examples/llm/package.json
index cffa62e1..f92475f7 100644
--- a/examples/llm/package.json
+++ b/examples/llm/package.json
@@ -14,11 +14,12 @@
"expo-brightness": "~13.1.4",
"expo-calendar": "~14.1.4",
"expo-font": "~13.3.1",
+ "expo-speech": "^13.0.1",
"expo-status-bar": "~2.2.3",
"metro-config": "^0.81.0",
"react": "19.0.0",
"react-native": "^0.79.2",
- "react-native-executorch": "^0.3.2",
+ "react-native-executorch": "/Users/kopcion/swm-ai/react-native-executorch/react-native-executorch-0.3.1-stt-7.tgz",
"react-native-loading-spinner-overlay": "^3.0.1",
"react-native-markdown-display": "^7.0.2",
"react-native-reanimated": "^3.17.5",
diff --git a/examples/llm/screens/LLMScreen.tsx b/examples/llm/screens/LLMScreen.tsx
index 11fb1aee..3f528c5b 100644
--- a/examples/llm/screens/LLMScreen.tsx
+++ b/examples/llm/screens/LLMScreen.tsx
@@ -1,122 +1,257 @@
import { useEffect, useRef, useState } from 'react';
import {
Keyboard,
+ KeyboardAvoidingView,
+ Platform,
StyleSheet,
Text,
- TextInput,
TouchableOpacity,
TouchableWithoutFeedback,
View,
+ TextInput,
} from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context';
-import SendIcon from '../assets/icons/send_icon.svg';
+import SWMIcon from '../assets/icons/swm_icon.svg';
import Spinner from 'react-native-loading-spinner-overlay';
import {
+ // STREAMING_ACTION,
+ useSpeechToText,
LLAMA3_2_1B_QLORA,
- LLAMA3_2_TOKENIZER,
- LLAMA3_2_TOKENIZER_CONFIG,
+ LLAMA3_2_1B_TOKENIZER,
useLLM,
+ LLAMA3_2_TOKENIZER_CONFIG,
} from 'react-native-executorch';
import PauseIcon from '../assets/icons/pause_icon.svg';
+import MicIcon from '../assets/icons/mic_icon.svg';
+import SendIcon from '../assets/icons/send_icon.svg';
+import StopIcon from '../assets/icons/stop_icon.svg';
import ColorPalette from '../colors';
import Messages from '../components/Messages';
+import LiveAudioStream from 'react-native-live-audio-stream';
+import { Buffer } from 'buffer';
+// import * as Speech from 'expo-speech';
+
+const audioStreamOptions = {
+ sampleRate: 16000,
+ channels: 1,
+ bitsPerSample: 16,
+ audioSource: 1,
+ bufferSize: 16000,
+};
-export default function LLMScreen() {
+const startStreamingAudio = (options: any, onChunk: (data: string) => void) => {
+ LiveAudioStream.init(options);
+ LiveAudioStream.on('data', onChunk);
+ LiveAudioStream.start();
+};
+
+const float32ArrayFromPCMBinaryBuffer = (b64EncodedBuffer: string) => {
+ const b64DecodedChunk = Buffer.from(b64EncodedBuffer, 'base64');
+ const int16Array = new Int16Array(b64DecodedChunk.buffer);
+
+ const float32Array = new Float32Array(int16Array.length);
+ for (let i = 0; i < int16Array.length; i++) {
+ float32Array[i] = Math.max(
+ -1,
+ Math.min(1, (int16Array[i] / audioStreamOptions.bufferSize) * 8)
+ );
+ }
+ return float32Array;
+};
+
+export default function ChatScreen() {
+ // const [currentMessage, setCurrentMessage] = useState('');
+ const [isRecording, setIsRecording] = useState(false);
const [isTextInputFocused, setIsTextInputFocused] = useState(false);
const [userInput, setUserInput] = useState('');
-
+ const textInputRef = useRef(null);
+ const messageRecorded = useRef(false);
const llm = useLLM({
modelSource: LLAMA3_2_1B_QLORA,
- tokenizerSource: LLAMA3_2_TOKENIZER,
+ tokenizerSource: LLAMA3_2_1B_TOKENIZER,
tokenizerConfigSource: LLAMA3_2_TOKENIZER_CONFIG,
+ chatConfig: {
+ contextWindowLength: 6,
+ },
+ });
+ const speechToText = useSpeechToText({
+ modelName: 'whisper',
+ windowSize: 5,
+ overlapSeconds: 1.2,
});
- useEffect(() => {
- if (llm.error) {
- console.log('LLM error:', llm.error);
- }
- }, [llm.error]);
+ const onChunk = (data: string) => {
+ const float32Chunk = float32ArrayFromPCMBinaryBuffer(data);
+ speechToText.transcribe(Array.from(float32Chunk));
+ // speechToText.streamingTranscribe(
+ // STREAMING_ACTION.DATA,
+ // Array.from(float32Chunk)
+ // );
+ };
- const textInputRef = useRef(null);
+ const handleRecordPress = async () => {
+ if (isRecording) {
+ setIsRecording(false);
+ LiveAudioStream.stop();
+ messageRecorded.current = true;
+ // await llm.generate(
+ // await speechToText.streamingTranscribe(STREAMING_ACTION.STOP)
+ // );
+ } else {
+ setIsRecording(true);
+ startStreamingAudio(audioStreamOptions, onChunk);
+ // await speechToText.streamingTranscribe(STREAMING_ACTION.START);
+ }
+ };
+ // const sendMessage = async () => {
+ // setUserInput('');
+ // textInputRef.current?.clear();
+ // try {
+ // await llm.sendMessage(userInput);
+ // } catch (e) {
+ // console.error(e);
+ // }
+ // };
const sendMessage = async () => {
- setUserInput('');
- textInputRef.current?.clear();
- try {
- await llm.sendMessage(userInput);
- } catch (e) {
- console.error(e);
+ if (userInput) {
+ llm.sendMessage(userInput);
+ setUserInput('');
+ setIsTextInputFocused(false);
+ textInputRef.current?.clear();
}
};
- return !llm.isReady ? (
+ // useEffect(() => {
+ // if (llm.response && !llm.isGenerating) {
+ // appendToMessageHistory(llm.response, 'assistant');
+ // }
+ // }, [llm.response, llm.isGenerating]);
+
+ // const modifyLastMessage = (content: string) => {
+ // setCurrentMessage((prevMessage) => prevMessage + content);
+ // };
+
+ useEffect(() => {
+ if (speechToText.sequence.length && !speechToText.isGenerating) {
+ llm.sendMessage(speechToText.sequence);
+ }
+ }, [speechToText.sequence, speechToText.isGenerating, llm.sendMessage]); //eslint-disable-line react-hooks/exhaustive-deps
+
+ // const appendToMessageHistory = (content: string, role: SenderType) => {
+ // setChatHistory((prevHistory) => [...prevHistory, { role, content }]);
+ // if (role == 'assistant' && messageRecorded.current)
+ // Speech.speak(content, { language: 'en-US' });
+ // };
+
+ return !llm.isReady || !speechToText.isReady ? (
) : (
-
-
- {llm.messageHistory.length ? (
-
-
-
- ) : (
-
- Hello! 👋
-
- What can I help you with?
-
+
+
+
+
+
+ llm 3.2 1B QLoRA x Whisper
- )}
-
-
- setIsTextInputFocused(true)}
- onBlur={() => setIsTextInputFocused(false)}
- style={{
- ...styles.textInput,
- borderColor: isTextInputFocused
- ? ColorPalette.blueDark
- : ColorPalette.blueLight,
- }}
- placeholder="Your message"
- placeholderTextColor={'#C1C6E5'}
- multiline={true}
- ref={textInputRef}
- onChangeText={(text: string) => setUserInput(text)}
- />
- {userInput && (
- !llm.isGenerating && (await sendMessage())}
- >
-
-
- )}
- {llm.isGenerating && (
-
-
-
+ {llm.messageHistory.length ? (
+
+
+
+ ) : (
+
+ Hello! 👋
+
+ What can I help you with?
+
+
)}
-
-
-
+
+
+ setIsTextInputFocused(true)}
+ onBlur={() => setIsTextInputFocused(false)}
+ editable={!isRecording && !llm.isGenerating}
+ style={{
+ ...styles.textInput,
+ borderColor: isTextInputFocused
+ ? ColorPalette.blueDark
+ : ColorPalette.blueLight,
+ display: isRecording ? 'none' : 'flex',
+ }}
+ placeholder="Your message"
+ placeholderTextColor={'#C1C6E5'}
+ multiline={true}
+ ref={textInputRef}
+ onChangeText={(text: string) => setUserInput(text)}
+ />
+ {llm.isGenerating ? (
+
+
+
+ ) : !userInput ? (
+
+ {isRecording ? (
+
+ ) : (
+
+ )}
+
+ ) : (
+ !llm.isGenerating && (await sendMessage())}
+ >
+
+
+ )}
+
+
+
+
);
}
const styles = StyleSheet.create({
- container: { flex: 1 },
- chatContainer: { flex: 10, width: '100%' },
+ container: {
+ flex: 1,
+ },
+ keyboardAvoidingView: {
+ flex: 1,
+ },
+ topContainer: {
+ height: 68,
+ width: '100%',
+ alignItems: 'center',
+ justifyContent: 'center',
+ },
+ chatContainer: {
+ flex: 10,
+ width: '100%',
+ },
+ textModelName: {
+ color: ColorPalette.primary,
+ },
helloMessageContainer: {
flex: 10,
width: '100%',
@@ -152,10 +287,20 @@ const styles = StyleSheet.create({
color: ColorPalette.primary,
padding: 16,
},
- sendChatTouchable: {
+ fromUrlTouchable: {
height: '100%',
- width: 48,
justifyContent: 'center',
- alignItems: 'flex-end',
+ alignItems: 'flex-start',
+ },
+ recordTouchable: {
+ height: '100%',
+ justifyContent: 'center',
+ alignItems: 'center',
+ },
+ recordingInfo: {
+ width: '100%',
+ display: 'flex',
+ justifyContent: 'center',
+ alignItems: 'center',
},
});
diff --git a/examples/llm/yarn.lock b/examples/llm/yarn.lock
index 67524771..90612aef 100644
--- a/examples/llm/yarn.lock
+++ b/examples/llm/yarn.lock
@@ -54,13 +54,6 @@ __metadata:
languageName: node
linkType: hard
-"@babel/compat-data@npm:^7.27.2":
- version: 7.27.2
- resolution: "@babel/compat-data@npm:7.27.2"
- checksum: 8d4066324e5f1275adc43f2e22110cac29ee09fe926260c43f0eaa432c148859367df4152574a28ee02dbb3e3d11dd57145eed345d49cc07f9b6e11fee06535f
- languageName: node
- linkType: hard
-
"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.13.16, @babel/core@npm:^7.20.0, @babel/core@npm:^7.21.3, @babel/core@npm:^7.25.2":
version: 7.26.0
resolution: "@babel/core@npm:7.26.0"
@@ -119,19 +112,6 @@ __metadata:
languageName: node
linkType: hard
-"@babel/helper-compilation-targets@npm:^7.27.2":
- version: 7.27.2
- resolution: "@babel/helper-compilation-targets@npm:7.27.2"
- dependencies:
- "@babel/compat-data": ^7.27.2
- "@babel/helper-validator-option": ^7.27.1
- browserslist: ^4.24.0
- lru-cache: ^5.1.1
- semver: ^6.3.1
- checksum: 7b95328237de85d7af1dea010a4daa28e79f961dda48b652860d5893ce9b136fc8b9ea1f126d8e0a24963b09ba5c6631dcb907b4ce109b04452d34a6ae979807
- languageName: node
- linkType: hard
-
"@babel/helper-create-class-features-plugin@npm:^7.18.6, @babel/helper-create-class-features-plugin@npm:^7.25.9":
version: 7.25.9
resolution: "@babel/helper-create-class-features-plugin@npm:7.25.9"
@@ -290,13 +270,6 @@ __metadata:
languageName: node
linkType: hard
-"@babel/helper-validator-option@npm:^7.27.1":
- version: 7.27.1
- resolution: "@babel/helper-validator-option@npm:7.27.1"
- checksum: db73e6a308092531c629ee5de7f0d04390835b21a263be2644276cb27da2384b64676cab9f22cd8d8dbd854c92b1d7d56fc8517cf0070c35d1c14a8c828b0903
- languageName: node
- linkType: hard
-
"@babel/helper-wrap-function@npm:^7.25.9":
version: 7.25.9
resolution: "@babel/helper-wrap-function@npm:7.25.9"
@@ -732,18 +705,7 @@ __metadata:
languageName: node
linkType: hard
-"@babel/plugin-transform-destructuring@npm:^7.27.1":
- version: 7.27.1
- resolution: "@babel/plugin-transform-destructuring@npm:7.27.1"
- dependencies:
- "@babel/helper-plugin-utils": ^7.27.1
- peerDependencies:
- "@babel/core": ^7.0.0-0
- checksum: 492013fc4befd5f3554853f983b82cfa748dd2004a525f1f16a37f841ac402a51e891cac2084b03e2b89553f0e1e685cf5bf8bf9df8fed82114c580b3c567bb6
- languageName: node
- linkType: hard
-
-"@babel/plugin-transform-export-namespace-from@npm:^7.22.11, @babel/plugin-transform-export-namespace-from@npm:^7.25.9":
+"@babel/plugin-transform-export-namespace-from@npm:^7.25.9":
version: 7.27.1
resolution: "@babel/plugin-transform-export-namespace-from@npm:7.27.1"
dependencies:
@@ -859,20 +821,6 @@ __metadata:
languageName: node
linkType: hard
-"@babel/plugin-transform-object-rest-spread@npm:^7.12.13":
- version: 7.27.2
- resolution: "@babel/plugin-transform-object-rest-spread@npm:7.27.2"
- dependencies:
- "@babel/helper-compilation-targets": ^7.27.2
- "@babel/helper-plugin-utils": ^7.27.1
- "@babel/plugin-transform-destructuring": ^7.27.1
- "@babel/plugin-transform-parameters": ^7.27.1
- peerDependencies:
- "@babel/core": ^7.0.0-0
- checksum: 6d518c21cddfa436029d72409aac8f680d3ba3a10eb94477112869132226498474a61218893ac9958f8bc079109af0f684d1347d5036fee8e9b477daecf2d8f3
- languageName: node
- linkType: hard
-
"@babel/plugin-transform-object-rest-spread@npm:^7.24.7":
version: 7.25.9
resolution: "@babel/plugin-transform-object-rest-spread@npm:7.25.9"
@@ -909,17 +857,6 @@ __metadata:
languageName: node
linkType: hard
-"@babel/plugin-transform-parameters@npm:^7.22.15, @babel/plugin-transform-parameters@npm:^7.27.1":
- version: 7.27.1
- resolution: "@babel/plugin-transform-parameters@npm:7.27.1"
- dependencies:
- "@babel/helper-plugin-utils": ^7.27.1
- peerDependencies:
- "@babel/core": ^7.0.0-0
- checksum: 52dd9db2be63ca954dbf86bba3f1dedce5f8bcf0cbc2b9ab26981b6f9c3ad5ea3a1b7ba286d18ae05d7487763f2bd086533826ee82f7b8d76873265569e45125
- languageName: node
- linkType: hard
-
"@babel/plugin-transform-parameters@npm:^7.24.7, @babel/plugin-transform-parameters@npm:^7.25.9":
version: 7.25.9
resolution: "@babel/plugin-transform-parameters@npm:7.25.9"
@@ -1231,63 +1168,46 @@ __metadata:
languageName: node
linkType: hard
-"@expo/bunyan@npm:^4.0.0":
- version: 4.0.1
- resolution: "@expo/bunyan@npm:4.0.1"
- dependencies:
- uuid: ^8.0.0
- checksum: 7a503cf202ef26bd151ef31be63fdac113a27edd1e5703aee96326c3b7bea349e09e706a18854c251b313814a05673d5041eaea4c018667d9afa2c583d821af7
- languageName: node
- linkType: hard
-
-"@expo/cli@npm:0.22.26":
- version: 0.22.26
- resolution: "@expo/cli@npm:0.22.26"
+"@expo/cli@npm:0.24.12":
+ version: 0.24.12
+ resolution: "@expo/cli@npm:0.24.12"
dependencies:
"@0no-co/graphql.web": ^1.0.8
"@babel/runtime": ^7.20.0
"@expo/code-signing-certificates": ^0.0.5
- "@expo/config": ~10.0.11
- "@expo/config-plugins": ~9.0.17
+ "@expo/config": ~11.0.9
+ "@expo/config-plugins": ~10.0.2
"@expo/devcert": ^1.1.2
- "@expo/env": ~0.4.2
- "@expo/image-utils": ^0.6.5
- "@expo/json-file": ^9.0.2
- "@expo/metro-config": ~0.19.12
- "@expo/osascript": ^2.1.6
- "@expo/package-manager": ^1.7.2
- "@expo/plist": ^0.2.2
- "@expo/prebuild-config": ~8.2.0
- "@expo/rudder-sdk-node": ^1.1.1
+ "@expo/env": ~1.0.5
+ "@expo/image-utils": ^0.7.4
+ "@expo/json-file": ^9.1.4
+ "@expo/metro-config": ~0.20.14
+ "@expo/osascript": ^2.2.4
+ "@expo/package-manager": ^1.8.4
+ "@expo/plist": ^0.3.4
+ "@expo/prebuild-config": ^9.0.6
"@expo/spawn-async": ^1.7.2
"@expo/ws-tunnel": ^1.0.1
"@expo/xcpretty": ^4.3.0
- "@react-native/dev-middleware": 0.76.9
+ "@react-native/dev-middleware": 0.79.2
"@urql/core": ^5.0.6
"@urql/exchange-retry": ^1.3.0
accepts: ^1.3.8
arg: ^5.0.2
better-opn: ~3.0.2
- bplist-creator: 0.0.7
+ bplist-creator: 0.1.0
bplist-parser: ^0.3.1
- cacache: ^18.0.2
chalk: ^4.0.0
ci-info: ^3.3.0
compression: ^1.7.4
connect: ^3.7.0
debug: ^4.3.4
env-editor: ^0.4.1
- fast-glob: ^3.3.2
- form-data: ^3.0.1
freeport-async: ^2.0.0
- fs-extra: ~8.1.0
getenv: ^1.0.0
glob: ^10.4.2
- internal-ip: ^4.3.0
- is-docker: ^2.0.0
- is-wsl: ^2.1.1
- lodash.debounce: ^4.0.8
- minimatch: ^3.0.4
+ lan-network: ^0.1.4
+ minimatch: ^9.0.0
node-forge: ^1.3.1
npm-package-arg: ^11.0.0
ora: ^3.4.0
@@ -1308,28 +1228,25 @@ __metadata:
source-map-support: ~0.5.21
stacktrace-parser: ^0.1.10
structured-headers: ^0.4.1
- tar: ^6.2.1
- temp-dir: ^2.0.0
- tempy: ^0.7.1
+ tar: ^7.4.3
terminal-link: ^2.1.1
undici: ^6.18.2
- unique-string: ~2.0.0
wrap-ansi: ^7.0.0
ws: ^8.12.1
bin:
expo-internal: build/bin/cli
- checksum: 32b79ab6a5ee88487e457e5f74249b2e081889521a89d53b452fbd454652428a08164e933681bf7707f4834f1cf529c3b6eaa9df7a077bc1a7bc026442990bf4
+ checksum: 4e3af21db0a361e0b83dc2497e4ebef80bb636947df034d6da422909a15283bf023600bbe859b457353297cde1f67e2c1a011ba16bc7d4b2d55f7a9e0437338a
languageName: node
linkType: hard
-"@expo/cli@npm:0.24.12":
- version: 0.24.12
- resolution: "@expo/cli@npm:0.24.12"
+"@expo/cli@npm:0.24.13":
+ version: 0.24.13
+ resolution: "@expo/cli@npm:0.24.13"
dependencies:
"@0no-co/graphql.web": ^1.0.8
"@babel/runtime": ^7.20.0
"@expo/code-signing-certificates": ^0.0.5
- "@expo/config": ~11.0.9
+ "@expo/config": ~11.0.10
"@expo/config-plugins": ~10.0.2
"@expo/devcert": ^1.1.2
"@expo/env": ~1.0.5
@@ -1360,7 +1277,7 @@ __metadata:
freeport-async: ^2.0.0
getenv: ^1.0.0
glob: ^10.4.2
- lan-network: ^0.1.4
+ lan-network: ^0.1.6
minimatch: ^9.0.0
node-forge: ^1.3.1
npm-package-arg: ^11.0.0
@@ -1389,7 +1306,7 @@ __metadata:
ws: ^8.12.1
bin:
expo-internal: build/bin/cli
- checksum: 4e3af21db0a361e0b83dc2497e4ebef80bb636947df034d6da422909a15283bf023600bbe859b457353297cde1f67e2c1a011ba16bc7d4b2d55f7a9e0437338a
+ checksum: 9392445606c21f37b4360e08f6cc436a2081651998c0fe167f87d4573a89279be0ffa85481ab465b162269c348223326786e9afca5da99b7df6bb6d0969a021c
languageName: node
linkType: hard
@@ -1489,6 +1406,27 @@ __metadata:
languageName: node
linkType: hard
+"@expo/config@npm:~11.0.10":
+ version: 11.0.10
+ resolution: "@expo/config@npm:11.0.10"
+ dependencies:
+ "@babel/code-frame": ~7.10.4
+ "@expo/config-plugins": ~10.0.2
+ "@expo/config-types": ^53.0.4
+ "@expo/json-file": ^9.1.4
+ deepmerge: ^4.3.1
+ getenv: ^1.0.0
+ glob: ^10.4.2
+ require-from-string: ^2.0.2
+ resolve-from: ^5.0.0
+ resolve-workspace-root: ^2.0.0
+ semver: ^7.6.0
+ slugify: ^1.3.4
+ sucrase: 3.35.0
+ checksum: d3308c41602fd7eae22b23dfd64925037e1e0e9d9356781c208bcfc8c3ee4d64ecb309b4b07e081732b96c98801d16e36cbe83d84e88f6b11531714e48a3e24f
+ languageName: node
+ linkType: hard
+
"@expo/config@npm:~11.0.7":
version: 11.0.8
resolution: "@expo/config@npm:11.0.8"
@@ -1577,26 +1515,6 @@ __metadata:
languageName: node
linkType: hard
-"@expo/fingerprint@npm:0.11.11":
- version: 0.11.11
- resolution: "@expo/fingerprint@npm:0.11.11"
- dependencies:
- "@expo/spawn-async": ^1.7.2
- arg: ^5.0.2
- chalk: ^4.1.2
- debug: ^4.3.4
- find-up: ^5.0.0
- getenv: ^1.0.0
- minimatch: ^3.0.4
- p-limit: ^3.1.0
- resolve-from: ^5.0.0
- semver: ^7.6.0
- bin:
- fingerprint: bin/cli.js
- checksum: ef98fc8a4d7026ad409063f5a5776bf89375e4869bbcb5e4b2f3315bb1af75300d1f07107da458ff010dd71b295513e15838a0de91daed877a68dc52790b3adc
- languageName: node
- linkType: hard
-
"@expo/fingerprint@npm:0.12.4":
version: 0.12.4
resolution: "@expo/fingerprint@npm:0.12.4"
@@ -1673,32 +1591,6 @@ __metadata:
languageName: node
linkType: hard
-"@expo/metro-config@npm:0.19.12, @expo/metro-config@npm:~0.19.12":
- version: 0.19.12
- resolution: "@expo/metro-config@npm:0.19.12"
- dependencies:
- "@babel/core": ^7.20.0
- "@babel/generator": ^7.20.5
- "@babel/parser": ^7.20.0
- "@babel/types": ^7.20.0
- "@expo/config": ~10.0.11
- "@expo/env": ~0.4.2
- "@expo/json-file": ~9.0.2
- "@expo/spawn-async": ^1.7.2
- chalk: ^4.1.0
- debug: ^4.3.2
- fs-extra: ^9.1.0
- getenv: ^1.0.0
- glob: ^10.4.2
- jsc-safe-url: ^0.2.4
- lightningcss: ~1.27.0
- minimatch: ^3.0.4
- postcss: ~8.4.32
- resolve-from: ^5.0.0
- checksum: 241934860fcf90575de47d67a6de5c701b51e16069a7007c15fac5addc04a66663e66800241aac63635761921829c2c6895217fd2bf6b8d95a00c2e1c664dfc3
- languageName: node
- linkType: hard
-
"@expo/metro-config@npm:0.20.14, @expo/metro-config@npm:~0.20.14":
version: 0.20.14
resolution: "@expo/metro-config@npm:0.20.14"
@@ -1726,7 +1618,7 @@ __metadata:
languageName: node
linkType: hard
-"@expo/osascript@npm:^2.1.6, @expo/osascript@npm:^2.2.4":
+"@expo/osascript@npm:^2.2.4":
version: 2.2.4
resolution: "@expo/osascript@npm:2.2.4"
dependencies:
@@ -1736,7 +1628,7 @@ __metadata:
languageName: node
linkType: hard
-"@expo/package-manager@npm:^1.7.2, @expo/package-manager@npm:^1.8.4":
+"@expo/package-manager@npm:^1.8.4":
version: 1.8.4
resolution: "@expo/package-manager@npm:1.8.4"
dependencies:
@@ -1790,40 +1682,6 @@ __metadata:
languageName: node
linkType: hard
-"@expo/prebuild-config@npm:~8.2.0":
- version: 8.2.0
- resolution: "@expo/prebuild-config@npm:8.2.0"
- dependencies:
- "@expo/config": ~10.0.11
- "@expo/config-plugins": ~9.0.17
- "@expo/config-types": ^52.0.5
- "@expo/image-utils": ^0.6.5
- "@expo/json-file": ^9.0.2
- "@react-native/normalize-colors": 0.76.9
- debug: ^4.3.1
- fs-extra: ^9.0.0
- resolve-from: ^5.0.0
- semver: ^7.6.0
- xml2js: 0.6.0
- checksum: 5c9d194e63cc4ec9ba3076179832ce928208e09846981cccc6f07e70742b1d7a29bf7594788543578ced75a42fbc0d4a624c4bd7af73e755d220170090f0b2e5
- languageName: node
- linkType: hard
-
-"@expo/rudder-sdk-node@npm:^1.1.1":
- version: 1.1.1
- resolution: "@expo/rudder-sdk-node@npm:1.1.1"
- dependencies:
- "@expo/bunyan": ^4.0.0
- "@segment/loosely-validate-event": ^2.0.0
- fetch-retry: ^4.1.1
- md5: ^2.2.1
- node-fetch: ^2.6.1
- remove-trailing-slash: ^0.1.0
- uuid: ^8.3.2
- checksum: 5ce50c1a82f899b135600cb29cddf3fab601938700c8203f16a1394d2ffbf9e2cdd246b92ff635f8415121072d99a7b4a370f715b78f6680594b5a630e8d78c6
- languageName: node
- linkType: hard
-
"@expo/sdk-runtime-versions@npm:^1.0.0":
version: 1.0.0
resolution: "@expo/sdk-runtime-versions@npm:1.0.0"
@@ -1870,6 +1728,13 @@ __metadata:
languageName: node
linkType: hard
+"@huggingface/jinja@npm:^0.5.0":
+ version: 0.5.0
+ resolution: "@huggingface/jinja@npm:0.5.0"
+ checksum: 8bb04021f381158d5e358a166f8eec250785c0dc9f70a04b92d0aabddc8583a9f20026c808be59d4926787087399ca8f5a4cc8fc37749be35bea63473af19c53
+ languageName: node
+ linkType: hard
+
"@isaacs/cliui@npm:^8.0.2":
version: 8.0.2
resolution: "@isaacs/cliui@npm:8.0.2"
@@ -2053,33 +1918,6 @@ __metadata:
languageName: node
linkType: hard
-"@nodelib/fs.scandir@npm:2.1.5":
- version: 2.1.5
- resolution: "@nodelib/fs.scandir@npm:2.1.5"
- dependencies:
- "@nodelib/fs.stat": 2.0.5
- run-parallel: ^1.1.9
- checksum: a970d595bd23c66c880e0ef1817791432dbb7acbb8d44b7e7d0e7a22f4521260d4a83f7f9fd61d44fda4610105577f8f58a60718105fb38352baed612fd79e59
- languageName: node
- linkType: hard
-
-"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2":
- version: 2.0.5
- resolution: "@nodelib/fs.stat@npm:2.0.5"
- checksum: 012480b5ca9d97bff9261571dbbec7bbc6033f69cc92908bc1ecfad0792361a5a1994bc48674b9ef76419d056a03efadfce5a6cf6dbc0a36559571a7a483f6f0
- languageName: node
- linkType: hard
-
-"@nodelib/fs.walk@npm:^1.2.3":
- version: 1.2.8
- resolution: "@nodelib/fs.walk@npm:1.2.8"
- dependencies:
- "@nodelib/fs.scandir": 2.1.5
- fastq: ^1.6.0
- checksum: 190c643f156d8f8f277bf2a6078af1ffde1fd43f498f187c2db24d35b4b4b5785c02c7dc52e356497b9a1b65b13edc996de08de0b961c32844364da02986dc53
- languageName: node
- linkType: hard
-
"@npmcli/agent@npm:^3.0.0":
version: 3.0.0
resolution: "@npmcli/agent@npm:3.0.0"
@@ -2093,15 +1931,6 @@ __metadata:
languageName: node
linkType: hard
-"@npmcli/fs@npm:^3.1.0":
- version: 3.1.1
- resolution: "@npmcli/fs@npm:3.1.1"
- dependencies:
- semver: ^7.3.5
- checksum: d960cab4b93adcb31ce223bfb75c5714edbd55747342efb67dcc2f25e023d930a7af6ece3e75f2f459b6f38fc14d031c766f116cd124fdc937fd33112579e820
- languageName: node
- linkType: hard
-
"@npmcli/fs@npm:^4.0.0":
version: 4.0.0
resolution: "@npmcli/fs@npm:4.0.0"
@@ -2134,15 +1963,6 @@ __metadata:
languageName: node
linkType: hard
-"@react-native/babel-plugin-codegen@npm:0.76.9":
- version: 0.76.9
- resolution: "@react-native/babel-plugin-codegen@npm:0.76.9"
- dependencies:
- "@react-native/codegen": 0.76.9
- checksum: 13bba234a6c9e29fa4f7bf13a23ce8aecc5fc00da6cef6f6dd0462f82cdfeeeca62842c054ffe626662a92326774bf22723a90be5ac2158990386422ceee96c5
- languageName: node
- linkType: hard
-
"@react-native/babel-plugin-codegen@npm:0.79.2":
version: 0.79.2
resolution: "@react-native/babel-plugin-codegen@npm:0.79.2"
@@ -2208,61 +2028,6 @@ __metadata:
languageName: node
linkType: hard
-"@react-native/babel-preset@npm:0.76.9":
- version: 0.76.9
- resolution: "@react-native/babel-preset@npm:0.76.9"
- dependencies:
- "@babel/core": ^7.25.2
- "@babel/plugin-proposal-export-default-from": ^7.24.7
- "@babel/plugin-syntax-dynamic-import": ^7.8.3
- "@babel/plugin-syntax-export-default-from": ^7.24.7
- "@babel/plugin-syntax-nullish-coalescing-operator": ^7.8.3
- "@babel/plugin-syntax-optional-chaining": ^7.8.3
- "@babel/plugin-transform-arrow-functions": ^7.24.7
- "@babel/plugin-transform-async-generator-functions": ^7.25.4
- "@babel/plugin-transform-async-to-generator": ^7.24.7
- "@babel/plugin-transform-block-scoping": ^7.25.0
- "@babel/plugin-transform-class-properties": ^7.25.4
- "@babel/plugin-transform-classes": ^7.25.4
- "@babel/plugin-transform-computed-properties": ^7.24.7
- "@babel/plugin-transform-destructuring": ^7.24.8
- "@babel/plugin-transform-flow-strip-types": ^7.25.2
- "@babel/plugin-transform-for-of": ^7.24.7
- "@babel/plugin-transform-function-name": ^7.25.1
- "@babel/plugin-transform-literals": ^7.25.2
- "@babel/plugin-transform-logical-assignment-operators": ^7.24.7
- "@babel/plugin-transform-modules-commonjs": ^7.24.8
- "@babel/plugin-transform-named-capturing-groups-regex": ^7.24.7
- "@babel/plugin-transform-nullish-coalescing-operator": ^7.24.7
- "@babel/plugin-transform-numeric-separator": ^7.24.7
- "@babel/plugin-transform-object-rest-spread": ^7.24.7
- "@babel/plugin-transform-optional-catch-binding": ^7.24.7
- "@babel/plugin-transform-optional-chaining": ^7.24.8
- "@babel/plugin-transform-parameters": ^7.24.7
- "@babel/plugin-transform-private-methods": ^7.24.7
- "@babel/plugin-transform-private-property-in-object": ^7.24.7
- "@babel/plugin-transform-react-display-name": ^7.24.7
- "@babel/plugin-transform-react-jsx": ^7.25.2
- "@babel/plugin-transform-react-jsx-self": ^7.24.7
- "@babel/plugin-transform-react-jsx-source": ^7.24.7
- "@babel/plugin-transform-regenerator": ^7.24.7
- "@babel/plugin-transform-runtime": ^7.24.7
- "@babel/plugin-transform-shorthand-properties": ^7.24.7
- "@babel/plugin-transform-spread": ^7.24.7
- "@babel/plugin-transform-sticky-regex": ^7.24.7
- "@babel/plugin-transform-typescript": ^7.25.2
- "@babel/plugin-transform-unicode-regex": ^7.24.7
- "@babel/template": ^7.25.0
- "@react-native/babel-plugin-codegen": 0.76.9
- babel-plugin-syntax-hermes-parser: ^0.25.1
- babel-plugin-transform-flow-enums: ^0.0.2
- react-refresh: ^0.14.0
- peerDependencies:
- "@babel/core": "*"
- checksum: b48ac1195d4b52a14134f3dbfa26771aa66db0b787ebced6153d7c60802f1b959a3cf07b873da1b085e7db9b527507d1111302bb177ad52d7c77d635b6f3805b
- languageName: node
- linkType: hard
-
"@react-native/babel-preset@npm:0.79.2":
version: 0.79.2
resolution: "@react-native/babel-preset@npm:0.79.2"
@@ -2336,24 +2101,6 @@ __metadata:
languageName: node
linkType: hard
-"@react-native/codegen@npm:0.76.9":
- version: 0.76.9
- resolution: "@react-native/codegen@npm:0.76.9"
- dependencies:
- "@babel/parser": ^7.25.3
- glob: ^7.1.1
- hermes-parser: 0.23.1
- invariant: ^2.2.4
- jscodeshift: ^0.14.0
- mkdirp: ^0.5.1
- nullthrows: ^1.1.1
- yargs: ^17.6.2
- peerDependencies:
- "@babel/preset-env": ^7.1.6
- checksum: fcb26bd5be6f923eafd05e356ab01c9bbd30cab5e950bb050312a651771bcb2cb8484a3ba511e1460d44f508700565b0b69d43039c8cc61e63b9eacca6b9c756
- languageName: node
- linkType: hard
-
"@react-native/codegen@npm:0.79.2":
version: 0.79.2
resolution: "@react-native/codegen@npm:0.79.2"
@@ -2390,13 +2137,6 @@ __metadata:
languageName: node
linkType: hard
-"@react-native/debugger-frontend@npm:0.76.9":
- version: 0.76.9
- resolution: "@react-native/debugger-frontend@npm:0.76.9"
- checksum: c537ae5be75bb9a0a549d88b6545762364d87a1166c8a7339ccd774257096a2c62f83efdd86c78553a3f1c4ef35cfa7708aba477bf6eeb76b7814ceab2b98069
- languageName: node
- linkType: hard
-
"@react-native/debugger-frontend@npm:0.79.2":
version: 0.79.2
resolution: "@react-native/debugger-frontend@npm:0.79.2"
@@ -2404,26 +2144,6 @@ __metadata:
languageName: node
linkType: hard
-"@react-native/dev-middleware@npm:0.76.9":
- version: 0.76.9
- resolution: "@react-native/dev-middleware@npm:0.76.9"
- dependencies:
- "@isaacs/ttlcache": ^1.4.1
- "@react-native/debugger-frontend": 0.76.9
- chrome-launcher: ^0.15.2
- chromium-edge-launcher: ^0.2.0
- connect: ^3.6.5
- debug: ^2.2.0
- invariant: ^2.2.4
- nullthrows: ^1.1.1
- open: ^7.0.3
- selfsigned: ^2.4.1
- serve-static: ^1.13.1
- ws: ^6.2.3
- checksum: 1f7750ae0c4d4d7970a73cd4f8443004a93b91b998a003ddb965274eb718d2a70ff06d182903dcaeccf15d8d245f488a397ea8ae53f6ed5f25e4d476d844b90f
- languageName: node
- linkType: hard
-
"@react-native/dev-middleware@npm:0.79.2":
version: 0.79.2
resolution: "@react-native/dev-middleware@npm:0.79.2"
@@ -2490,13 +2210,6 @@ __metadata:
languageName: node
linkType: hard
-"@react-native/normalize-colors@npm:0.76.9":
- version: 0.76.9
- resolution: "@react-native/normalize-colors@npm:0.76.9"
- checksum: 4fddb977b8aad2e848cb698f13b9ffec539668e8ae891846327d5e23ce3de13dea59a2dfbea8a154ea034791c7abc3f7d1d4c8caae2114f7a683c78b221aed36
- languageName: node
- linkType: hard
-
"@react-native/normalize-colors@npm:0.79.2":
version: 0.79.2
resolution: "@react-native/normalize-colors@npm:0.79.2"
@@ -2521,16 +2234,6 @@ __metadata:
languageName: node
linkType: hard
-"@segment/loosely-validate-event@npm:^2.0.0":
- version: 2.0.0
- resolution: "@segment/loosely-validate-event@npm:2.0.0"
- dependencies:
- component-type: ^1.2.1
- join-component: ^1.1.0
- checksum: 8c4aacc903fb717619b69ca7eecf8d4a7b928661b0e835c9cd98f1b858a85ce62c348369ad9a52cb2df8df02578c0525a73fce4c69a42ac414d9554cc6be7117
- languageName: node
- linkType: hard
-
"@sinclair/typebox@npm:^0.27.8":
version: 0.27.8
resolution: "@sinclair/typebox@npm:0.27.8"
@@ -2778,15 +2481,6 @@ __metadata:
languageName: node
linkType: hard
-"@types/node-forge@npm:^1.3.0":
- version: 1.3.11
- resolution: "@types/node-forge@npm:1.3.11"
- dependencies:
- "@types/node": "*"
- checksum: 1e86bd55b92a492eaafd75f6d01f31e7d86a5cdadd0c6bcdc0b1df4103b7f99bb75b832efd5217c7ddda5c781095dc086a868e20b9de00f5a427ddad4c296cd5
- languageName: node
- linkType: hard
-
"@types/node@npm:*":
version: 22.10.2
resolution: "@types/node@npm:22.10.2"
@@ -2906,16 +2600,6 @@ __metadata:
languageName: node
linkType: hard
-"aggregate-error@npm:^3.0.0":
- version: 3.1.0
- resolution: "aggregate-error@npm:3.1.0"
- dependencies:
- clean-stack: ^2.0.0
- indent-string: ^4.0.0
- checksum: 1101a33f21baa27a2fa8e04b698271e64616b886795fd43c31068c07533c7b3facfcaf4e9e0cab3624bd88f729a592f1c901a1a229c9e490eafce411a8644b79
- languageName: node
- linkType: hard
-
"anser@npm:^1.4.9":
version: 1.4.10
resolution: "anser@npm:1.4.10"
@@ -3032,14 +2716,7 @@ __metadata:
languageName: node
linkType: hard
-"array-union@npm:^2.1.0":
- version: 2.1.0
- resolution: "array-union@npm:2.1.0"
- checksum: 5bee12395cba82da674931df6d0fea23c4aa4660cb3b338ced9f828782a65caa232573e6bf3968f23e0c5eb301764a382cef2f128b170a9dc59de0e36c39f98d
- languageName: node
- linkType: hard
-
-"asap@npm:~2.0.3, asap@npm:~2.0.6":
+"asap@npm:~2.0.6":
version: 2.0.6
resolution: "asap@npm:2.0.6"
checksum: b296c92c4b969e973260e47523207cd5769abd27c245a68c26dc7a0fe8053c55bb04360237cb51cab1df52be939da77150ace99ad331fb7fb13b3423ed73ff3d
@@ -3062,13 +2739,6 @@ __metadata:
languageName: node
linkType: hard
-"asynckit@npm:^0.4.0":
- version: 0.4.0
- resolution: "asynckit@npm:0.4.0"
- checksum: 7b78c451df768adba04e2d02e63e2d0bf3b07adcd6e42b4cf665cb7ce899bedd344c69a1dcbce355b5f972d597b25aaa1c1742b52cffd9caccb22f348114f6be
- languageName: node
- linkType: hard
-
"at-least-node@npm:^1.0.0":
version: 1.0.0
resolution: "at-least-node@npm:1.0.0"
@@ -3213,31 +2883,6 @@ __metadata:
languageName: node
linkType: hard
-"babel-preset-expo@npm:~12.0.11":
- version: 12.0.11
- resolution: "babel-preset-expo@npm:12.0.11"
- dependencies:
- "@babel/plugin-proposal-decorators": ^7.12.9
- "@babel/plugin-transform-export-namespace-from": ^7.22.11
- "@babel/plugin-transform-object-rest-spread": ^7.12.13
- "@babel/plugin-transform-parameters": ^7.22.15
- "@babel/preset-react": ^7.22.15
- "@babel/preset-typescript": ^7.23.0
- "@react-native/babel-preset": 0.76.9
- babel-plugin-react-native-web: ~0.19.13
- react-refresh: ^0.14.2
- peerDependencies:
- babel-plugin-react-compiler: ^19.0.0-beta-9ee70a1-20241017
- react-compiler-runtime: ^19.0.0-beta-8a03594-20241020
- peerDependenciesMeta:
- babel-plugin-react-compiler:
- optional: true
- react-compiler-runtime:
- optional: true
- checksum: 8ff4437a5e3ea229c22ad2de645abc452f05fe55bc72b2586e4cfe675fcc6b3c83779c1a18343364d200b988cac5e60eed6e616a29eb1446e2294236f9f60d3f
- languageName: node
- linkType: hard
-
"babel-preset-expo@npm:~13.1.11":
version: 13.1.11
resolution: "babel-preset-expo@npm:13.1.11"
@@ -3321,15 +2966,6 @@ __metadata:
languageName: node
linkType: hard
-"bplist-creator@npm:0.0.7":
- version: 0.0.7
- resolution: "bplist-creator@npm:0.0.7"
- dependencies:
- stream-buffers: ~2.2.0
- checksum: 5bcf4091c5a0e5934d56643d9f2705b5149a0b0b62b8314762f6ad4b3208d313c75ad03bab97a3c42b6e17db3d73530d3642d082ca249b55f952c90056c2b2ad
- languageName: node
- linkType: hard
-
"bplist-creator@npm:0.1.0":
version: 0.1.0
resolution: "bplist-creator@npm:0.1.0"
@@ -3456,26 +3092,6 @@ __metadata:
languageName: node
linkType: hard
-"cacache@npm:^18.0.2":
- version: 18.0.4
- resolution: "cacache@npm:18.0.4"
- dependencies:
- "@npmcli/fs": ^3.1.0
- fs-minipass: ^3.0.0
- glob: ^10.2.2
- lru-cache: ^10.0.1
- minipass: ^7.0.3
- minipass-collect: ^2.0.1
- minipass-flush: ^1.0.5
- minipass-pipeline: ^1.2.4
- p-map: ^4.0.0
- ssri: ^10.0.0
- tar: ^6.1.11
- unique-filename: ^3.0.0
- checksum: b7422c113b4ec750f33beeca0f426a0024c28e3172f332218f48f963e5b970647fa1ac05679fe5bb448832c51efea9fda4456b9a95c3a1af1105fe6c1833cde2
- languageName: node
- linkType: hard
-
"cacache@npm:^19.0.1":
version: 19.0.1
resolution: "cacache@npm:19.0.1"
@@ -3496,16 +3112,6 @@ __metadata:
languageName: node
linkType: hard
-"call-bind-apply-helpers@npm:^1.0.1, call-bind-apply-helpers@npm:^1.0.2":
- version: 1.0.2
- resolution: "call-bind-apply-helpers@npm:1.0.2"
- dependencies:
- es-errors: ^1.3.0
- function-bind: ^1.1.2
- checksum: b2863d74fcf2a6948221f65d95b91b4b2d90cfe8927650b506141e669f7d5de65cea191bf788838bc40d13846b7886c5bc5c84ab96c3adbcf88ad69a72fcdc6b
- languageName: node
- linkType: hard
-
"caller-callsite@npm:^2.0.0":
version: 2.0.0
resolution: "caller-callsite@npm:2.0.0"
@@ -3587,20 +3193,6 @@ __metadata:
languageName: node
linkType: hard
-"charenc@npm:0.0.2":
- version: 0.0.2
- resolution: "charenc@npm:0.0.2"
- checksum: 81dcadbe57e861d527faf6dd3855dc857395a1c4d6781f4847288ab23cffb7b3ee80d57c15bba7252ffe3e5e8019db767757ee7975663ad2ca0939bb8fcaf2e5
- languageName: node
- linkType: hard
-
-"chownr@npm:^2.0.0":
- version: 2.0.0
- resolution: "chownr@npm:2.0.0"
- checksum: c57cf9dd0791e2f18a5ee9c1a299ae6e801ff58fee96dc8bfd0dcb4738a6ce58dd252a3605b1c93c6418fe4f9d5093b28ffbf4d66648cb2a9c67eaef9679be2f
- languageName: node
- linkType: hard
-
"chownr@npm:^3.0.0":
version: 3.0.0
resolution: "chownr@npm:3.0.0"
@@ -3650,13 +3242,6 @@ __metadata:
languageName: node
linkType: hard
-"clean-stack@npm:^2.0.0":
- version: 2.2.0
- resolution: "clean-stack@npm:2.2.0"
- checksum: 2ac8cd2b2f5ec986a3c743935ec85b07bc174d5421a5efc8017e1f146a1cf5f781ae962618f416352103b32c9cd7e203276e8c28241bbe946160cab16149fb68
- languageName: node
- linkType: hard
-
"cli-cursor@npm:^2.1.0":
version: 2.1.0
resolution: "cli-cursor@npm:2.1.0"
@@ -3734,15 +3319,6 @@ __metadata:
languageName: node
linkType: hard
-"combined-stream@npm:^1.0.8":
- version: 1.0.8
- resolution: "combined-stream@npm:1.0.8"
- dependencies:
- delayed-stream: ~1.0.0
- checksum: 49fa4aeb4916567e33ea81d088f6584749fc90c7abec76fd516bf1c5aa5c79f3584b5ba3de6b86d26ddd64bae5329c4c7479343250cfe71c75bb366eae53bb7c
- languageName: node
- linkType: hard
-
"command-exists@npm:^1.2.4":
version: 1.2.9
resolution: "command-exists@npm:1.2.9"
@@ -3785,13 +3361,6 @@ __metadata:
languageName: node
linkType: hard
-"component-type@npm:^1.2.1":
- version: 1.2.2
- resolution: "component-type@npm:1.2.2"
- checksum: ca5a9886a961985b9ebcc0a5b23f2526506eced1c2c932648e5f8960db22fffcc3a77442013c6aef0b5afa8e6b9de02ae2a23ce5c967374edaf99d74fd6d6c3e
- languageName: node
- linkType: hard
-
"compressible@npm:~2.0.18":
version: 2.0.18
resolution: "compressible@npm:2.0.18"
@@ -3887,28 +3456,6 @@ __metadata:
languageName: node
linkType: hard
-"cross-fetch@npm:^3.1.5":
- version: 3.2.0
- resolution: "cross-fetch@npm:3.2.0"
- dependencies:
- node-fetch: ^2.7.0
- checksum: 8ded5ea35f705e81e569e7db244a3f96e05e95996ff51877c89b0c1ec1163c76bb5dad77d0f8fba6bb35a0abacb36403d7271dc586d8b1f636110ee7a8d959fd
- languageName: node
- linkType: hard
-
-"cross-spawn@npm:^6.0.0":
- version: 6.0.6
- resolution: "cross-spawn@npm:6.0.6"
- dependencies:
- nice-try: ^1.0.4
- path-key: ^2.0.1
- semver: ^5.5.0
- shebang-command: ^1.2.0
- which: ^1.2.9
- checksum: a6e2e5b04a0e0f806c1df45f92cd079b65f95fbe5a7650ee1ab60318c33a6c156a8a2f8b6898f57764f7363ec599a0625e9855dfa78d52d2d73dbd32eb11c25e
- languageName: node
- linkType: hard
-
"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.3":
version: 7.0.6
resolution: "cross-spawn@npm:7.0.6"
@@ -3920,13 +3467,6 @@ __metadata:
languageName: node
linkType: hard
-"crypt@npm:0.0.2":
- version: 0.0.2
- resolution: "crypt@npm:0.0.2"
- checksum: baf4c7bbe05df656ec230018af8cf7dbe8c14b36b98726939cef008d473f6fe7a4fad906cfea4062c93af516f1550a3f43ceb4d6615329612c6511378ed9fe34
- languageName: node
- linkType: hard
-
"crypto-random-string@npm:^2.0.0":
version: 2.0.0
resolution: "crypto-random-string@npm:2.0.0"
@@ -4062,16 +3602,6 @@ __metadata:
languageName: node
linkType: hard
-"default-gateway@npm:^4.2.0":
- version: 4.2.0
- resolution: "default-gateway@npm:4.2.0"
- dependencies:
- execa: ^1.0.0
- ip-regex: ^2.1.0
- checksum: 1f5be765471689c6bab33e0c8b87363c3e2485cc1ab78904d383a8a8293a79f684da2a3303744b112503f986af4ea87d917c63a468ed913e9b0c31588c02d6a4
- languageName: node
- linkType: hard
-
"defaults@npm:^1.0.3":
version: 1.0.4
resolution: "defaults@npm:1.0.4"
@@ -4088,29 +3618,6 @@ __metadata:
languageName: node
linkType: hard
-"del@npm:^6.0.0":
- version: 6.1.1
- resolution: "del@npm:6.1.1"
- dependencies:
- globby: ^11.0.1
- graceful-fs: ^4.2.4
- is-glob: ^4.0.1
- is-path-cwd: ^2.2.0
- is-path-inside: ^3.0.2
- p-map: ^4.0.0
- rimraf: ^3.0.2
- slash: ^3.0.0
- checksum: 563288b73b8b19a7261c47fd21a330eeab6e2acd7c6208c49790dfd369127120dd7836cdf0c1eca216b77c94782a81507eac6b4734252d3bef2795cb366996b6
- languageName: node
- linkType: hard
-
-"delayed-stream@npm:~1.0.0":
- version: 1.0.0
- resolution: "delayed-stream@npm:1.0.0"
- checksum: 46fe6e83e2cb1d85ba50bd52803c68be9bd953282fa7096f51fc29edd5d67ff84ff753c51966061e5ba7cb5e47ef6d36a91924eddb7f3f3483b1c560f77a0020
- languageName: node
- linkType: hard
-
"denodeify@npm:^1.2.1":
version: 1.2.1
resolution: "denodeify@npm:1.2.1"
@@ -4141,15 +3648,6 @@ __metadata:
languageName: node
linkType: hard
-"dir-glob@npm:^3.0.1":
- version: 3.0.1
- resolution: "dir-glob@npm:3.0.1"
- dependencies:
- path-type: ^4.0.0
- checksum: fa05e18324510d7283f55862f3161c6759a3f2f8dbce491a2fc14c8324c498286c54282c1f0e933cb930da8419b30679389499b919122952a4f8592362ef4615
- languageName: node
- linkType: hard
-
"dom-serializer@npm:^2.0.0":
version: 2.0.0
resolution: "dom-serializer@npm:2.0.0"
@@ -4214,17 +3712,6 @@ __metadata:
languageName: node
linkType: hard
-"dunder-proto@npm:^1.0.1":
- version: 1.0.1
- resolution: "dunder-proto@npm:1.0.1"
- dependencies:
- call-bind-apply-helpers: ^1.0.1
- es-errors: ^1.3.0
- gopd: ^1.2.0
- checksum: 149207e36f07bd4941921b0ca929e3a28f1da7bd6b6ff8ff7f4e2f2e460675af4576eeba359c635723dc189b64cdd4787e0255897d5b135ccc5d15cb8685fc90
- languageName: node
- linkType: hard
-
"eastasianwidth@npm:^0.2.0":
version: 0.2.0
resolution: "eastasianwidth@npm:0.2.0"
@@ -4283,15 +3770,6 @@ __metadata:
languageName: node
linkType: hard
-"end-of-stream@npm:^1.1.0":
- version: 1.4.4
- resolution: "end-of-stream@npm:1.4.4"
- dependencies:
- once: ^1.4.0
- checksum: 530a5a5a1e517e962854a31693dbb5c0b2fc40b46dad2a56a2deec656ca040631124f4795823acc68238147805f8b021abbe221f4afed5ef3c8e8efc2024908b
- languageName: node
- linkType: hard
-
"entities@npm:^4.2.0, entities@npm:^4.4.0":
version: 4.5.0
resolution: "entities@npm:4.5.0"
@@ -4352,41 +3830,6 @@ __metadata:
languageName: node
linkType: hard
-"es-define-property@npm:^1.0.1":
- version: 1.0.1
- resolution: "es-define-property@npm:1.0.1"
- checksum: 0512f4e5d564021c9e3a644437b0155af2679d10d80f21adaf868e64d30efdfbd321631956f20f42d655fedb2e3a027da479fad3fa6048f768eb453a80a5f80a
- languageName: node
- linkType: hard
-
-"es-errors@npm:^1.3.0":
- version: 1.3.0
- resolution: "es-errors@npm:1.3.0"
- checksum: ec1414527a0ccacd7f15f4a3bc66e215f04f595ba23ca75cdae0927af099b5ec865f9f4d33e9d7e86f512f252876ac77d4281a7871531a50678132429b1271b5
- languageName: node
- linkType: hard
-
-"es-object-atoms@npm:^1.0.0, es-object-atoms@npm:^1.1.1":
- version: 1.1.1
- resolution: "es-object-atoms@npm:1.1.1"
- dependencies:
- es-errors: ^1.3.0
- checksum: 214d3767287b12f36d3d7267ef342bbbe1e89f899cfd67040309fc65032372a8e60201410a99a1645f2f90c1912c8c49c8668066f6bdd954bcd614dda2e3da97
- languageName: node
- linkType: hard
-
-"es-set-tostringtag@npm:^2.1.0":
- version: 2.1.0
- resolution: "es-set-tostringtag@npm:2.1.0"
- dependencies:
- es-errors: ^1.3.0
- get-intrinsic: ^1.2.6
- has-tostringtag: ^1.0.2
- hasown: ^2.0.2
- checksum: 789f35de4be3dc8d11fdcb91bc26af4ae3e6d602caa93299a8c45cf05d36cc5081454ae2a6d3afa09cceca214b76c046e4f8151e092e6fc7feeb5efb9e794fc6
- languageName: node
- linkType: hard
-
"escalade@npm:^3.1.1, escalade@npm:^3.2.0":
version: 3.2.0
resolution: "escalade@npm:3.2.0"
@@ -4453,22 +3896,23 @@ __metadata:
languageName: node
linkType: hard
-"execa@npm:^1.0.0":
- version: 1.0.0
- resolution: "execa@npm:1.0.0"
+"expo-asset@npm:~11.0.5":
+ version: 11.0.5
+ resolution: "expo-asset@npm:11.0.5"
dependencies:
- cross-spawn: ^6.0.0
- get-stream: ^4.0.0
- is-stream: ^1.1.0
- npm-run-path: ^2.0.0
- p-finally: ^1.0.0
- signal-exit: ^3.0.0
- strip-eof: ^1.0.0
- checksum: ddf1342c1c7d02dd93b41364cd847640f6163350d9439071abf70bf4ceb1b9b2b2e37f54babb1d8dc1df8e0d8def32d0e81e74a2e62c3e1d70c303eb4c306bc4
+ "@expo/image-utils": ^0.6.5
+ expo-constants: ~17.0.8
+ invariant: ^2.2.4
+ md5-file: ^3.2.3
+ peerDependencies:
+ expo: "*"
+ react: "*"
+ react-native: "*"
+ checksum: 7650dc032f76b0924eedaf24dee135b293e5c3258e0a9e43a6db7c93ef40ea6b6d6a47432bf80f3051f3b62e40a6ccb25e8acca820baa791d52a2e95432868bc
languageName: node
linkType: hard
-"expo-asset@npm:^11.0.3, expo-asset@npm:~11.1.5":
+"expo-asset@npm:~11.1.5":
version: 11.1.5
resolution: "expo-asset@npm:11.1.5"
dependencies:
@@ -4482,22 +3926,6 @@ __metadata:
languageName: node
linkType: hard
-"expo-asset@npm:~11.0.5":
- version: 11.0.5
- resolution: "expo-asset@npm:11.0.5"
- dependencies:
- "@expo/image-utils": ^0.6.5
- expo-constants: ~17.0.8
- invariant: ^2.2.4
- md5-file: ^3.2.3
- peerDependencies:
- expo: "*"
- react: "*"
- react-native: "*"
- checksum: 7650dc032f76b0924eedaf24dee135b293e5c3258e0a9e43a6db7c93ef40ea6b6d6a47432bf80f3051f3b62e40a6ccb25e8acca820baa791d52a2e95432868bc
- languageName: node
- linkType: hard
-
"expo-brightness@npm:~13.1.4":
version: 13.1.4
resolution: "expo-brightness@npm:13.1.4"
@@ -4557,16 +3985,6 @@ __metadata:
languageName: node
linkType: hard
-"expo-file-system@npm:^18.0.10, expo-file-system@npm:~18.1.9":
- version: 18.1.9
- resolution: "expo-file-system@npm:18.1.9"
- peerDependencies:
- expo: "*"
- react-native: "*"
- checksum: fa8cb76ef8b76478a7c09005378962a3510536bffb6f4929924ff491ea3f4194323b1c165612b9645589dc66da9d549e206c5d1c774b07999ecc07c059b8073d
- languageName: node
- linkType: hard
-
"expo-file-system@npm:~18.0.12":
version: 18.0.12
resolution: "expo-file-system@npm:18.0.12"
@@ -4579,15 +3997,23 @@ __metadata:
languageName: node
linkType: hard
-"expo-font@npm:~13.0.4":
- version: 13.0.4
- resolution: "expo-font@npm:13.0.4"
- dependencies:
- fontfaceobserver: ^2.1.0
+"expo-file-system@npm:~18.1.10":
+ version: 18.1.10
+ resolution: "expo-file-system@npm:18.1.10"
peerDependencies:
expo: "*"
- react: "*"
- checksum: 36fa98d333c97a9a309f0ffa45827616167162caaaca6873f04d6e3d658c669da9e894fadd582b9bcc569f3b5b2043553ca204e4333d7496ad2e5843f0373b09
+ react-native: "*"
+ checksum: 2dc26898cc13e1933fec417e587c81fd87139f617afc266d82f47189391b83c345c6e7a0e097448fcfcd6bf7039da6aae263154f75d2944e611738cd126c386c
+ languageName: node
+ linkType: hard
+
+"expo-file-system@npm:~18.1.9":
+ version: 18.1.9
+ resolution: "expo-file-system@npm:18.1.9"
+ peerDependencies:
+ expo: "*"
+ react-native: "*"
+ checksum: fa8cb76ef8b76478a7c09005378962a3510536bffb6f4929924ff491ea3f4194323b1c165612b9645589dc66da9d549e206c5d1c774b07999ecc07c059b8073d
languageName: node
linkType: hard
@@ -4603,16 +4029,6 @@ __metadata:
languageName: node
linkType: hard
-"expo-keep-awake@npm:~14.0.3":
- version: 14.0.3
- resolution: "expo-keep-awake@npm:14.0.3"
- peerDependencies:
- expo: "*"
- react: "*"
- checksum: 1f8c4c4fbc6030b4ea55fd51b6bb74ba926c71ab3c5350445b065d1433188553b67c64114230240055788df918c96d2d925d9987dcd9fc4045e45362adcbb110
- languageName: node
- linkType: hard
-
"expo-keep-awake@npm:~14.1.4":
version: 14.1.4
resolution: "expo-keep-awake@npm:14.1.4"
@@ -4623,24 +4039,6 @@ __metadata:
languageName: node
linkType: hard
-"expo-modules-autolinking@npm:2.0.8":
- version: 2.0.8
- resolution: "expo-modules-autolinking@npm:2.0.8"
- dependencies:
- "@expo/spawn-async": ^1.7.2
- chalk: ^4.1.0
- commander: ^7.2.0
- fast-glob: ^3.2.5
- find-up: ^5.0.0
- fs-extra: ^9.1.0
- require-from-string: ^2.0.2
- resolve-from: ^5.0.0
- bin:
- expo-modules-autolinking: bin/expo-modules-autolinking.js
- checksum: 1e706d40163e0d3c239641c6d4a846c8006c0367007006cff1eb26a571e605d5fa5ce49c995b9118516d82c819be0e2e2849c2ae63df9b2921bf23bc9a4c2939
- languageName: node
- linkType: hard
-
"expo-modules-autolinking@npm:2.1.10":
version: 2.1.10
resolution: "expo-modules-autolinking@npm:2.1.10"
@@ -4658,21 +4056,30 @@ __metadata:
languageName: node
linkType: hard
-"expo-modules-core@npm:2.2.3":
- version: 2.2.3
- resolution: "expo-modules-core@npm:2.2.3"
+"expo-modules-core@npm:2.3.12":
+ version: 2.3.12
+ resolution: "expo-modules-core@npm:2.3.12"
dependencies:
invariant: ^2.2.4
- checksum: 7b2952f1220b55eb03f395d1549525edeb5bff7bf805257d9652ea4ef85ea71e34ad13b5971f1b559e7aa080f41130846b24cbe3d754660c08196c3ce899143b
+ checksum: 37f127b3ad31e78b8c81883a6c4f6142a3a46a005e28edf7a5db207f35221c597b49cd2c54c92a966bbf89b06dbbec5668e7deb4be558c5523ba379dc19a6901
languageName: node
linkType: hard
-"expo-modules-core@npm:2.3.12":
- version: 2.3.12
- resolution: "expo-modules-core@npm:2.3.12"
+"expo-modules-core@npm:2.3.13":
+ version: 2.3.13
+ resolution: "expo-modules-core@npm:2.3.13"
dependencies:
invariant: ^2.2.4
- checksum: 37f127b3ad31e78b8c81883a6c4f6142a3a46a005e28edf7a5db207f35221c597b49cd2c54c92a966bbf89b06dbbec5668e7deb4be558c5523ba379dc19a6901
+ checksum: 08bad8ffed47c72ec0ceae79e8d9ebbc1df6d6d4ade65f285b2370198821334330c961ca02eb3316ac4f96191753b96907aca6a0804b5be8f9653eef71452710
+ languageName: node
+ linkType: hard
+
+"expo-speech@npm:^13.0.1":
+ version: 13.1.4
+ resolution: "expo-speech@npm:13.1.4"
+ peerDependencies:
+ expo: "*"
+ checksum: ea6677d22b3678bae89a03a69699b1c66690846c1427dbc41d7b5d3eb5ae45821996d79a58ef3ee760fe44e23d588262500a476c0dbdcee2ea6f24dbc31cb132
languageName: node
linkType: hard
@@ -4689,27 +4096,26 @@ __metadata:
languageName: node
linkType: hard
-"expo@npm:^52.0.37":
- version: 52.0.46
- resolution: "expo@npm:52.0.46"
+"expo@npm:^53.0.7":
+ version: 53.0.9
+ resolution: "expo@npm:53.0.9"
dependencies:
"@babel/runtime": ^7.20.0
- "@expo/cli": 0.22.26
- "@expo/config": ~10.0.11
- "@expo/config-plugins": ~9.0.17
- "@expo/fingerprint": 0.11.11
- "@expo/metro-config": 0.19.12
+ "@expo/cli": 0.24.13
+ "@expo/config": ~11.0.10
+ "@expo/config-plugins": ~10.0.2
+ "@expo/fingerprint": 0.12.4
+ "@expo/metro-config": 0.20.14
"@expo/vector-icons": ^14.0.0
- babel-preset-expo: ~12.0.11
- expo-asset: ~11.0.5
- expo-constants: ~17.0.8
- expo-file-system: ~18.0.12
- expo-font: ~13.0.4
- expo-keep-awake: ~14.0.3
- expo-modules-autolinking: 2.0.8
- expo-modules-core: 2.2.3
- fbemitter: ^3.0.0
- web-streams-polyfill: ^3.3.2
+ babel-preset-expo: ~13.1.11
+ expo-asset: ~11.1.5
+ expo-constants: ~17.1.6
+ expo-file-system: ~18.1.10
+ expo-font: ~13.3.1
+ expo-keep-awake: ~14.1.4
+ expo-modules-autolinking: 2.1.10
+ expo-modules-core: 2.3.13
+ react-native-edge-to-edge: 1.6.0
whatwg-url-without-unicode: 8.0.0-3
peerDependencies:
"@expo/dom-webview": "*"
@@ -4728,7 +4134,7 @@ __metadata:
expo: bin/cli
expo-modules-autolinking: bin/autolinking
fingerprint: bin/fingerprint
- checksum: 603b4fa89edf9c2aaf8741818bdd5ca46195a461093ecb2c1855164ba9799d2a590a1424f2e11ae7d97f2f8fe64928516a84b8c8ecfbe5a1dad09a5c0edca83e
+ checksum: 5a6e79cf95c521bca4e06d7612595704ac24da118ec48700d1ee287c4b52aa75764bda2842d75bdd01e985917e4af8575059d5bc7e13683603bd47abb268b309
languageName: node
linkType: hard
@@ -4781,19 +4187,6 @@ __metadata:
languageName: node
linkType: hard
-"fast-glob@npm:^3.2.5, fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.2":
- version: 3.3.3
- resolution: "fast-glob@npm:3.3.3"
- dependencies:
- "@nodelib/fs.stat": ^2.0.2
- "@nodelib/fs.walk": ^1.2.3
- glob-parent: ^5.1.2
- merge2: ^1.3.0
- micromatch: ^4.0.8
- checksum: 0704d7b85c0305fd2cef37777337dfa26230fdd072dce9fb5c82a4b03156f3ffb8ed3e636033e65d45d2a5805a4e475825369a27404c0307f2db0c8eb3366fbd
- languageName: node
- linkType: hard
-
"fast-json-stable-stringify@npm:^2.1.0":
version: 2.1.0
resolution: "fast-json-stable-stringify@npm:2.1.0"
@@ -4801,15 +4194,6 @@ __metadata:
languageName: node
linkType: hard
-"fastq@npm:^1.6.0":
- version: 1.19.1
- resolution: "fastq@npm:1.19.1"
- dependencies:
- reusify: ^1.0.4
- checksum: 7691d1794fb84ad0ec2a185f10e00f0e1713b894e2c9c4d42f0bc0ba5f8c00e6e655a202074ca0b91b9c3d977aab7c30c41a8dc069fb5368576ac0054870a0e6
- languageName: node
- linkType: hard
-
"fb-watchman@npm:^2.0.0":
version: 2.0.2
resolution: "fb-watchman@npm:2.0.2"
@@ -4819,44 +4203,6 @@ __metadata:
languageName: node
linkType: hard
-"fbemitter@npm:^3.0.0":
- version: 3.0.0
- resolution: "fbemitter@npm:3.0.0"
- dependencies:
- fbjs: ^3.0.0
- checksum: 069690b8cdff3521ade3c9beb92ba0a38d818a86ef36dff8690e66749aef58809db4ac0d6938eb1cacea2dbef5f2a508952d455669590264cdc146bbe839f605
- languageName: node
- linkType: hard
-
-"fbjs-css-vars@npm:^1.0.0":
- version: 1.0.2
- resolution: "fbjs-css-vars@npm:1.0.2"
- checksum: 72baf6d22c45b75109118b4daecb6c8016d4c83c8c0f23f683f22e9d7c21f32fff6201d288df46eb561e3c7d4bb4489b8ad140b7f56444c453ba407e8bd28511
- languageName: node
- linkType: hard
-
-"fbjs@npm:^3.0.0":
- version: 3.0.5
- resolution: "fbjs@npm:3.0.5"
- dependencies:
- cross-fetch: ^3.1.5
- fbjs-css-vars: ^1.0.0
- loose-envify: ^1.0.0
- object-assign: ^4.1.0
- promise: ^7.1.1
- setimmediate: ^1.0.5
- ua-parser-js: ^1.0.35
- checksum: e609b5b64686bc96495a5c67728ed9b2710b9b3d695c5759c5f5e47c9483d1c323543ac777a86459e3694efc5712c6ce7212e944feb19752867d699568bb0e54
- languageName: node
- linkType: hard
-
-"fetch-retry@npm:^4.1.1":
- version: 4.1.1
- resolution: "fetch-retry@npm:4.1.1"
- checksum: a06b6a0201efeb5082794713bcdc8dd2c8f1fd4ad5660de860b9c4e51738aa369be58ba7cfa67aa7aa4a3bf9d9b5a4cd2d2fdea88868856483fb81bacd70455b
- languageName: node
- linkType: hard
-
"fill-range@npm:^7.1.1":
version: 7.1.1
resolution: "fill-range@npm:7.1.1"
@@ -4952,18 +4298,6 @@ __metadata:
languageName: node
linkType: hard
-"form-data@npm:^3.0.1":
- version: 3.0.3
- resolution: "form-data@npm:3.0.3"
- dependencies:
- asynckit: ^0.4.0
- combined-stream: ^1.0.8
- es-set-tostringtag: ^2.1.0
- mime-types: ^2.1.35
- checksum: e79641abb58b3d7230816ed00645c2732cb64aa44172221644619238106556584aafd908bcc0d728fb06ef6a0d88261e72f4e01111bae3da6d2d7a429e4e1fd2
- languageName: node
- linkType: hard
-
"freeport-async@npm:^2.0.0":
version: 2.0.0
resolution: "freeport-async@npm:2.0.0"
@@ -4990,38 +4324,6 @@ __metadata:
languageName: node
linkType: hard
-"fs-extra@npm:^9.0.0, fs-extra@npm:^9.1.0":
- version: 9.1.0
- resolution: "fs-extra@npm:9.1.0"
- dependencies:
- at-least-node: ^1.0.0
- graceful-fs: ^4.2.0
- jsonfile: ^6.0.1
- universalify: ^2.0.0
- checksum: ba71ba32e0faa74ab931b7a0031d1523c66a73e225de7426e275e238e312d07313d2da2d33e34a52aa406c8763ade5712eb3ec9ba4d9edce652bcacdc29e6b20
- languageName: node
- linkType: hard
-
-"fs-extra@npm:~8.1.0":
- version: 8.1.0
- resolution: "fs-extra@npm:8.1.0"
- dependencies:
- graceful-fs: ^4.2.0
- jsonfile: ^4.0.0
- universalify: ^0.1.0
- checksum: bf44f0e6cea59d5ce071bba4c43ca76d216f89e402dc6285c128abc0902e9b8525135aa808adad72c9d5d218e9f4bcc63962815529ff2f684ad532172a284880
- languageName: node
- linkType: hard
-
-"fs-minipass@npm:^2.0.0":
- version: 2.1.0
- resolution: "fs-minipass@npm:2.1.0"
- dependencies:
- minipass: ^3.0.0
- checksum: 1b8d128dae2ac6cc94230cc5ead341ba3e0efaef82dab46a33d171c044caaa6ca001364178d42069b2809c35a1c3c35079a32107c770e9ffab3901b59af8c8b1
- languageName: node
- linkType: hard
-
"fs-minipass@npm:^3.0.0":
version: 3.0.3
resolution: "fs-minipass@npm:3.0.3"
@@ -5078,24 +4380,6 @@ __metadata:
languageName: node
linkType: hard
-"get-intrinsic@npm:^1.2.6":
- version: 1.3.0
- resolution: "get-intrinsic@npm:1.3.0"
- dependencies:
- call-bind-apply-helpers: ^1.0.2
- es-define-property: ^1.0.1
- es-errors: ^1.3.0
- es-object-atoms: ^1.1.1
- function-bind: ^1.1.2
- get-proto: ^1.0.1
- gopd: ^1.2.0
- has-symbols: ^1.1.0
- hasown: ^2.0.2
- math-intrinsics: ^1.1.0
- checksum: 301008e4482bb9a9cb49e132b88fee093bff373b4e6def8ba219b1e96b60158a6084f273ef5cafe832e42cd93462f4accb46a618d35fe59a2b507f2388c5b79d
- languageName: node
- linkType: hard
-
"get-package-type@npm:^0.1.0":
version: 0.1.0
resolution: "get-package-type@npm:0.1.0"
@@ -5104,28 +4388,9 @@ __metadata:
linkType: hard
"get-port@npm:^3.2.0":
- version: 3.2.0
- resolution: "get-port@npm:3.2.0"
- checksum: 31f530326569683ac4b7452eb7573c40e9dbe52aec14d80745c35475261e6389160da153d5b8ae911150b4ce99003472b30c69ba5be0cedeaa7865b95542d168
- languageName: node
- linkType: hard
-
-"get-proto@npm:^1.0.1":
- version: 1.0.1
- resolution: "get-proto@npm:1.0.1"
- dependencies:
- dunder-proto: ^1.0.1
- es-object-atoms: ^1.0.0
- checksum: 4fc96afdb58ced9a67558698b91433e6b037aaa6f1493af77498d7c85b141382cf223c0e5946f334fb328ee85dfe6edd06d218eaf09556f4bc4ec6005d7f5f7b
- languageName: node
- linkType: hard
-
-"get-stream@npm:^4.0.0":
- version: 4.1.0
- resolution: "get-stream@npm:4.1.0"
- dependencies:
- pump: ^3.0.0
- checksum: 443e1914170c15bd52ff8ea6eff6dfc6d712b031303e36302d2778e3de2506af9ee964d6124010f7818736dcfde05c04ba7ca6cc26883106e084357a17ae7d73
+ version: 3.2.0
+ resolution: "get-port@npm:3.2.0"
+ checksum: 31f530326569683ac4b7452eb7573c40e9dbe52aec14d80745c35475261e6389160da153d5b8ae911150b4ce99003472b30c69ba5be0cedeaa7865b95542d168
languageName: node
linkType: hard
@@ -5136,15 +4401,6 @@ __metadata:
languageName: node
linkType: hard
-"glob-parent@npm:^5.1.2":
- version: 5.1.2
- resolution: "glob-parent@npm:5.1.2"
- dependencies:
- is-glob: ^4.0.1
- checksum: f4f2bfe2425296e8a47e36864e4f42be38a996db40420fe434565e4480e3322f18eb37589617a98640c5dc8fdec1a387007ee18dbb1f3f5553409c34d17f425e
- languageName: node
- linkType: hard
-
"glob@npm:^10.2.2, glob@npm:^10.3.10, glob@npm:^10.3.7, glob@npm:^10.4.2":
version: 10.4.5
resolution: "glob@npm:10.4.5"
@@ -5182,27 +4438,6 @@ __metadata:
languageName: node
linkType: hard
-"globby@npm:^11.0.1":
- version: 11.1.0
- resolution: "globby@npm:11.1.0"
- dependencies:
- array-union: ^2.1.0
- dir-glob: ^3.0.1
- fast-glob: ^3.2.9
- ignore: ^5.2.0
- merge2: ^1.4.1
- slash: ^3.0.0
- checksum: b4be8885e0cfa018fc783792942d53926c35c50b3aefd3fdcfb9d22c627639dc26bd2327a40a0b74b074100ce95bb7187bfeae2f236856aa3de183af7a02aea6
- languageName: node
- linkType: hard
-
-"gopd@npm:^1.2.0":
- version: 1.2.0
- resolution: "gopd@npm:1.2.0"
- checksum: cc6d8e655e360955bdccaca51a12a474268f95bb793fc3e1f2bdadb075f28bfd1fd988dab872daf77a61d78cbaf13744bc8727a17cfb1d150d76047d805375f3
- languageName: node
- linkType: hard
-
"graceful-fs@npm:^4.1.11, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9":
version: 4.2.11
resolution: "graceful-fs@npm:4.2.11"
@@ -5224,22 +4459,6 @@ __metadata:
languageName: node
linkType: hard
-"has-symbols@npm:^1.0.3, has-symbols@npm:^1.1.0":
- version: 1.1.0
- resolution: "has-symbols@npm:1.1.0"
- checksum: b2316c7302a0e8ba3aaba215f834e96c22c86f192e7310bdf689dd0e6999510c89b00fbc5742571507cebf25764d68c988b3a0da217369a73596191ac0ce694b
- languageName: node
- linkType: hard
-
-"has-tostringtag@npm:^1.0.2":
- version: 1.0.2
- resolution: "has-tostringtag@npm:1.0.2"
- dependencies:
- has-symbols: ^1.0.3
- checksum: 999d60bb753ad714356b2c6c87b7fb74f32463b8426e159397da4bde5bca7e598ab1073f4d8d4deafac297f2eb311484cd177af242776bf05f0d11565680468d
- languageName: node
- linkType: hard
-
"hasown@npm:^2.0.2":
version: 2.0.2
resolution: "hasown@npm:2.0.2"
@@ -5378,13 +4597,6 @@ __metadata:
languageName: node
linkType: hard
-"ignore@npm:^5.2.0":
- version: 5.3.2
- resolution: "ignore@npm:5.3.2"
- checksum: 2acfd32a573260ea522ea0bfeff880af426d68f6831f973129e2ba7363f422923cf53aab62f8369cbf4667c7b25b6f8a3761b34ecdb284ea18e87a5262a865be
- languageName: node
- linkType: hard
-
"image-size@npm:^1.0.2":
version: 1.1.1
resolution: "image-size@npm:1.1.1"
@@ -5423,13 +4635,6 @@ __metadata:
languageName: node
linkType: hard
-"indent-string@npm:^4.0.0":
- version: 4.0.0
- resolution: "indent-string@npm:4.0.0"
- checksum: 824cfb9929d031dabf059bebfe08cf3137365e112019086ed3dcff6a0a7b698cb80cf67ccccde0e25b9e2d7527aa6cc1fed1ac490c752162496caba3e6699612
- languageName: node
- linkType: hard
-
"inflight@npm:^1.0.4":
version: 1.0.6
resolution: "inflight@npm:1.0.6"
@@ -5454,16 +4659,6 @@ __metadata:
languageName: node
linkType: hard
-"internal-ip@npm:^4.3.0":
- version: 4.3.0
- resolution: "internal-ip@npm:4.3.0"
- dependencies:
- default-gateway: ^4.2.0
- ipaddr.js: ^1.9.0
- checksum: c970433c84d9a6b46e2c9f5ab7785d3105b856d0a566891bf919241b5a884c5c1c9bf8e915aebb822a86c14b1b6867e58c1eaf5cd49eb023368083069d1a4a9a
- languageName: node
- linkType: hard
-
"invariant@npm:^2.2.4":
version: 2.2.4
resolution: "invariant@npm:2.2.4"
@@ -5483,20 +4678,6 @@ __metadata:
languageName: node
linkType: hard
-"ip-regex@npm:^2.1.0":
- version: 2.1.0
- resolution: "ip-regex@npm:2.1.0"
- checksum: 331d95052aa53ce245745ea0fc3a6a1e2e3c8d6da65fa8ea52bf73768c1b22a9ac50629d1d2b08c04e7b3ac4c21b536693c149ce2c2615ee4796030e5b3e3cba
- languageName: node
- linkType: hard
-
-"ipaddr.js@npm:^1.9.0":
- version: 1.9.1
- resolution: "ipaddr.js@npm:1.9.1"
- checksum: f88d3825981486f5a1942414c8d77dd6674dd71c065adcfa46f578d677edcb99fda25af42675cb59db492fdf427b34a5abfcde3982da11a8fd83a500b41cfe77
- languageName: node
- linkType: hard
-
"is-arrayish@npm:^0.2.1":
version: 0.2.1
resolution: "is-arrayish@npm:0.2.1"
@@ -5504,13 +4685,6 @@ __metadata:
languageName: node
linkType: hard
-"is-buffer@npm:~1.1.6":
- version: 1.1.6
- resolution: "is-buffer@npm:1.1.6"
- checksum: 4a186d995d8bbf9153b4bd9ff9fd04ae75068fe695d29025d25e592d9488911eeece84eefbd8fa41b8ddcc0711058a71d4c466dcf6f1f6e1d83830052d8ca707
- languageName: node
- linkType: hard
-
"is-core-module@npm:^2.16.0":
version: 2.16.0
resolution: "is-core-module@npm:2.16.0"
@@ -5536,13 +4710,6 @@ __metadata:
languageName: node
linkType: hard
-"is-extglob@npm:^2.1.1":
- version: 2.1.1
- resolution: "is-extglob@npm:2.1.1"
- checksum: df033653d06d0eb567461e58a7a8c9f940bd8c22274b94bf7671ab36df5719791aae15eef6d83bbb5e23283967f2f984b8914559d4449efda578c775c4be6f85
- languageName: node
- linkType: hard
-
"is-fullwidth-code-point@npm:^3.0.0":
version: 3.0.0
resolution: "is-fullwidth-code-point@npm:3.0.0"
@@ -5550,15 +4717,6 @@ __metadata:
languageName: node
linkType: hard
-"is-glob@npm:^4.0.1":
- version: 4.0.3
- resolution: "is-glob@npm:4.0.3"
- dependencies:
- is-extglob: ^2.1.1
- checksum: d381c1319fcb69d341cc6e6c7cd588e17cd94722d9a32dbd60660b993c4fb7d0f19438674e68dfec686d09b7c73139c9166b47597f846af387450224a8101ab4
- languageName: node
- linkType: hard
-
"is-number@npm:^7.0.0":
version: 7.0.0
resolution: "is-number@npm:7.0.0"
@@ -5566,20 +4724,6 @@ __metadata:
languageName: node
linkType: hard
-"is-path-cwd@npm:^2.2.0":
- version: 2.2.0
- resolution: "is-path-cwd@npm:2.2.0"
- checksum: 46a840921bb8cc0dc7b5b423a14220e7db338072a4495743a8230533ce78812dc152548c86f4b828411fe98c5451959f07cf841c6a19f611e46600bd699e8048
- languageName: node
- linkType: hard
-
-"is-path-inside@npm:^3.0.2":
- version: 3.0.3
- resolution: "is-path-inside@npm:3.0.3"
- checksum: abd50f06186a052b349c15e55b182326f1936c89a78bf6c8f2b707412517c097ce04bc49a0ca221787bc44e1049f51f09a2ffb63d22899051988d3a618ba13e9
- languageName: node
- linkType: hard
-
"is-plain-object@npm:^2.0.4":
version: 2.0.4
resolution: "is-plain-object@npm:2.0.4"
@@ -5589,20 +4733,6 @@ __metadata:
languageName: node
linkType: hard
-"is-stream@npm:^1.1.0":
- version: 1.1.0
- resolution: "is-stream@npm:1.1.0"
- checksum: 063c6bec9d5647aa6d42108d4c59723d2bd4ae42135a2d4db6eadbd49b7ea05b750fd69d279e5c7c45cf9da753ad2c00d8978be354d65aa9f6bb434969c6a2ae
- languageName: node
- linkType: hard
-
-"is-stream@npm:^2.0.0":
- version: 2.0.1
- resolution: "is-stream@npm:2.0.1"
- checksum: b8e05ccdf96ac330ea83c12450304d4a591f9958c11fd17bed240af8d5ffe08aedafa4c0f4cfccd4d28dc9d4d129daca1023633d5c11601a6cbc77521f6fae66
- languageName: node
- linkType: hard
-
"is-wsl@npm:^2.1.1, is-wsl@npm:^2.2.0":
version: 2.2.0
resolution: "is-wsl@npm:2.2.0"
@@ -5799,13 +4929,6 @@ __metadata:
languageName: node
linkType: hard
-"join-component@npm:^1.1.0":
- version: 1.1.0
- resolution: "join-component@npm:1.1.0"
- checksum: b904c2f98549e4195022caca3a7dc837f9706c670ff333f3d617f2aed23bce2841322a999734683b6ab8e202568ad810c11ff79b58a64df66888153f04750239
- languageName: node
- linkType: hard
-
"js-tokens@npm:^3.0.0 || ^4.0.0, js-tokens@npm:^4.0.0":
version: 4.0.0
resolution: "js-tokens@npm:4.0.0"
@@ -5922,18 +5045,6 @@ __metadata:
languageName: node
linkType: hard
-"jsonfile@npm:^4.0.0":
- version: 4.0.0
- resolution: "jsonfile@npm:4.0.0"
- dependencies:
- graceful-fs: ^4.1.6
- dependenciesMeta:
- graceful-fs:
- optional: true
- checksum: 6447d6224f0d31623eef9b51185af03ac328a7553efcee30fa423d98a9e276ca08db87d71e17f2310b0263fd3ffa6c2a90a6308367f661dc21580f9469897c9e
- languageName: node
- linkType: hard
-
"jsonfile@npm:^6.0.1":
version: 6.1.0
resolution: "jsonfile@npm:6.1.0"
@@ -5970,6 +5081,15 @@ __metadata:
languageName: node
linkType: hard
+"lan-network@npm:^0.1.6":
+ version: 0.1.6
+ resolution: "lan-network@npm:0.1.6"
+ bin:
+ lan-network: dist/lan-network-cli.js
+ checksum: b041675765ed06c1bc9ba82da2c69bfe5ce2382e03b6800ab1c79390740118eeb6f78efc1ee3b692a9f3b6f3447b1267561a7569d01da5be8c96fc7745ede4e7
+ languageName: node
+ linkType: hard
+
"leven@npm:^3.1.0":
version: 3.1.0
resolution: "leven@npm:3.1.0"
@@ -6124,11 +5244,12 @@ __metadata:
expo-brightness: ~13.1.4
expo-calendar: ~14.1.4
expo-font: ~13.3.1
+ expo-speech: ^13.0.1
expo-status-bar: ~2.2.3
metro-config: ^0.81.0
react: 19.0.0
react-native: ^0.79.2
- react-native-executorch: ^0.3.2
+ react-native-executorch: /Users/kopcion/swm-ai/react-native-executorch/react-native-executorch-0.3.1-stt-7.tgz
react-native-loading-spinner-overlay: ^3.0.1
react-native-markdown-display: ^7.0.2
react-native-reanimated: ^3.17.5
@@ -6294,13 +5415,6 @@ __metadata:
languageName: node
linkType: hard
-"math-intrinsics@npm:^1.1.0":
- version: 1.1.0
- resolution: "math-intrinsics@npm:1.1.0"
- checksum: 0e513b29d120f478c85a70f49da0b8b19bc638975eca466f2eeae0071f3ad00454c621bf66e16dd435896c208e719fc91ad79bbfba4e400fe0b372e7c1c9c9a2
- languageName: node
- linkType: hard
-
"md5-file@npm:^3.2.3":
version: 3.2.3
resolution: "md5-file@npm:3.2.3"
@@ -6312,17 +5426,6 @@ __metadata:
languageName: node
linkType: hard
-"md5@npm:^2.2.1":
- version: 2.3.0
- resolution: "md5@npm:2.3.0"
- dependencies:
- charenc: 0.0.2
- crypt: 0.0.2
- is-buffer: ~1.1.6
- checksum: a63cacf4018dc9dee08c36e6f924a64ced735b37826116c905717c41cebeb41a522f7a526ba6ad578f9c80f02cb365033ccd67fe186ffbcc1a1faeb75daa9b6e
- languageName: node
- linkType: hard
-
"mdn-data@npm:2.0.14":
version: 2.0.14
resolution: "mdn-data@npm:2.0.14"
@@ -6365,13 +5468,6 @@ __metadata:
languageName: node
linkType: hard
-"merge2@npm:^1.3.0, merge2@npm:^1.4.1":
- version: 1.4.1
- resolution: "merge2@npm:1.4.1"
- checksum: 7268db63ed5169466540b6fb947aec313200bcf6d40c5ab722c22e242f651994619bcd85601602972d3c85bd2cc45a358a4c61937e9f11a061919a1da569b0c2
- languageName: node
- linkType: hard
-
"metro-babel-transformer@npm:0.81.0":
version: 0.81.0
resolution: "metro-babel-transformer@npm:0.81.0"
@@ -6830,7 +5926,7 @@ __metadata:
languageName: node
linkType: hard
-"micromatch@npm:^4.0.4, micromatch@npm:^4.0.8":
+"micromatch@npm:^4.0.4":
version: 4.0.8
resolution: "micromatch@npm:4.0.8"
dependencies:
@@ -6854,7 +5950,7 @@ __metadata:
languageName: node
linkType: hard
-"mime-types@npm:^2.1.27, mime-types@npm:^2.1.35, mime-types@npm:~2.1.34":
+"mime-types@npm:^2.1.27, mime-types@npm:~2.1.34":
version: 2.1.35
resolution: "mime-types@npm:2.1.35"
dependencies:
@@ -6964,13 +6060,6 @@ __metadata:
languageName: node
linkType: hard
-"minipass@npm:^5.0.0":
- version: 5.0.0
- resolution: "minipass@npm:5.0.0"
- checksum: 425dab288738853fded43da3314a0b5c035844d6f3097a8e3b5b29b328da8f3c1af6fc70618b32c29ff906284cf6406b6841376f21caaadd0793c1d5a6a620ea
- languageName: node
- linkType: hard
-
"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.0.4, minipass@npm:^7.1.2":
version: 7.1.2
resolution: "minipass@npm:7.1.2"
@@ -6978,16 +6067,6 @@ __metadata:
languageName: node
linkType: hard
-"minizlib@npm:^2.1.1":
- version: 2.1.2
- resolution: "minizlib@npm:2.1.2"
- dependencies:
- minipass: ^3.0.0
- yallist: ^4.0.0
- checksum: f1fdeac0b07cf8f30fcf12f4b586795b97be856edea22b5e9072707be51fc95d41487faec3f265b42973a304fe3a64acd91a44a3826a963e37b37bafde0212c3
- languageName: node
- linkType: hard
-
"minizlib@npm:^3.0.1":
version: 3.0.1
resolution: "minizlib@npm:3.0.1"
@@ -7009,7 +6088,7 @@ __metadata:
languageName: node
linkType: hard
-"mkdirp@npm:^1.0.3, mkdirp@npm:^1.0.4":
+"mkdirp@npm:^1.0.4":
version: 1.0.4
resolution: "mkdirp@npm:1.0.4"
bin:
@@ -7096,13 +6175,6 @@ __metadata:
languageName: node
linkType: hard
-"nice-try@npm:^1.0.4":
- version: 1.0.5
- resolution: "nice-try@npm:1.0.5"
- checksum: 0b4af3b5bb5d86c289f7a026303d192a7eb4417231fe47245c460baeabae7277bcd8fd9c728fb6bd62c30b3e15cd6620373e2cf33353b095d8b403d3e8a15aff
- languageName: node
- linkType: hard
-
"no-case@npm:^3.0.4":
version: 3.0.4
resolution: "no-case@npm:3.0.4"
@@ -7129,21 +6201,7 @@ __metadata:
languageName: node
linkType: hard
-"node-fetch@npm:^2.6.1, node-fetch@npm:^2.7.0":
- version: 2.7.0
- resolution: "node-fetch@npm:2.7.0"
- dependencies:
- whatwg-url: ^5.0.0
- peerDependencies:
- encoding: ^0.1.0
- peerDependenciesMeta:
- encoding:
- optional: true
- checksum: d76d2f5edb451a3f05b15115ec89fc6be39de37c6089f1b6368df03b91e1633fd379a7e01b7ab05089a25034b2023d959b47e59759cb38d88341b2459e89d6e5
- languageName: node
- linkType: hard
-
-"node-forge@npm:^1, node-forge@npm:^1.2.1, node-forge@npm:^1.3.1":
+"node-forge@npm:^1.2.1, node-forge@npm:^1.3.1":
version: 1.3.1
resolution: "node-forge@npm:1.3.1"
checksum: 08fb072d3d670599c89a1704b3e9c649ff1b998256737f0e06fbd1a5bf41cae4457ccaee32d95052d80bbafd9ffe01284e078c8071f0267dc9744e51c5ed42a9
@@ -7214,15 +6272,6 @@ __metadata:
languageName: node
linkType: hard
-"npm-run-path@npm:^2.0.0":
- version: 2.0.2
- resolution: "npm-run-path@npm:2.0.2"
- dependencies:
- path-key: ^2.0.0
- checksum: acd5ad81648ba4588ba5a8effb1d98d2b339d31be16826a118d50f182a134ac523172101b82eab1d01cb4c2ba358e857d54cfafd8163a1ffe7bd52100b741125
- languageName: node
- linkType: hard
-
"nth-check@npm:^2.0.1":
version: 2.1.1
resolution: "nth-check@npm:2.1.1"
@@ -7257,7 +6306,7 @@ __metadata:
languageName: node
linkType: hard
-"object-assign@npm:^4.0.1, object-assign@npm:^4.1.0, object-assign@npm:^4.1.1":
+"object-assign@npm:^4.0.1, object-assign@npm:^4.1.1":
version: 4.1.1
resolution: "object-assign@npm:4.1.1"
checksum: fcc6e4ea8c7fe48abfbb552578b1c53e0d194086e2e6bbbf59e0a536381a292f39943c6e9628af05b5528aa5e3318bb30d6b2e53cadaf5b8fe9e12c4b69af23f
@@ -7289,7 +6338,7 @@ __metadata:
languageName: node
linkType: hard
-"once@npm:^1.3.0, once@npm:^1.3.1, once@npm:^1.4.0":
+"once@npm:^1.3.0":
version: 1.4.0
resolution: "once@npm:1.4.0"
dependencies:
@@ -7349,13 +6398,6 @@ __metadata:
languageName: node
linkType: hard
-"p-finally@npm:^1.0.0":
- version: 1.0.0
- resolution: "p-finally@npm:1.0.0"
- checksum: 93a654c53dc805dd5b5891bab16eb0ea46db8f66c4bfd99336ae929323b1af2b70a8b0654f8f1eae924b2b73d037031366d645f1fd18b3d30cbd15950cc4b1d4
- languageName: node
- linkType: hard
-
"p-limit@npm:^2.0.0, p-limit@npm:^2.2.0":
version: 2.3.0
resolution: "p-limit@npm:2.3.0"
@@ -7401,15 +6443,6 @@ __metadata:
languageName: node
linkType: hard
-"p-map@npm:^4.0.0":
- version: 4.0.0
- resolution: "p-map@npm:4.0.0"
- dependencies:
- aggregate-error: ^3.0.0
- checksum: cb0ab21ec0f32ddffd31dfc250e3afa61e103ef43d957cc45497afe37513634589316de4eb88abdfd969fe6410c22c0b93ab24328833b8eb1ccc087fc0442a1c
- languageName: node
- linkType: hard
-
"p-map@npm:^7.0.2":
version: 7.0.3
resolution: "p-map@npm:7.0.3"
@@ -7516,13 +6549,6 @@ __metadata:
languageName: node
linkType: hard
-"path-key@npm:^2.0.0, path-key@npm:^2.0.1":
- version: 2.0.1
- resolution: "path-key@npm:2.0.1"
- checksum: f7ab0ad42fe3fb8c7f11d0c4f849871e28fbd8e1add65c370e422512fc5887097b9cf34d09c1747d45c942a8c1e26468d6356e2df3f740bf177ab8ca7301ebfd
- languageName: node
- linkType: hard
-
"path-key@npm:^3.1.0":
version: 3.1.1
resolution: "path-key@npm:3.1.1"
@@ -7690,15 +6716,6 @@ __metadata:
languageName: node
linkType: hard
-"promise@npm:^7.1.1":
- version: 7.3.1
- resolution: "promise@npm:7.3.1"
- dependencies:
- asap: ~2.0.3
- checksum: 475bb069130179fbd27ed2ab45f26d8862376a137a57314cf53310bdd85cc986a826fd585829be97ebc0aaf10e9d8e68be1bfe5a4a0364144b1f9eedfa940cf1
- languageName: node
- linkType: hard
-
"promise@npm:^8.3.0":
version: 8.3.0
resolution: "promise@npm:8.3.0"
@@ -7729,16 +6746,6 @@ __metadata:
languageName: node
linkType: hard
-"pump@npm:^3.0.0":
- version: 3.0.2
- resolution: "pump@npm:3.0.2"
- dependencies:
- end-of-stream: ^1.1.0
- once: ^1.3.1
- checksum: e0c4216874b96bd25ddf31a0b61a5613e26cc7afa32379217cf39d3915b0509def3565f5f6968fafdad2894c8bbdbd67d340e84f3634b2a29b950cffb6442d9f
- languageName: node
- linkType: hard
-
"punycode@npm:^2.1.1":
version: 2.3.1
resolution: "punycode@npm:2.3.1"
@@ -7755,13 +6762,6 @@ __metadata:
languageName: node
linkType: hard
-"queue-microtask@npm:^1.2.2":
- version: 1.2.3
- resolution: "queue-microtask@npm:1.2.3"
- checksum: b676f8c040cdc5b12723ad2f91414d267605b26419d5c821ff03befa817ddd10e238d22b25d604920340fd73efd8ba795465a0377c4adf45a4a41e4234e42dc4
- languageName: node
- linkType: hard
-
"queue@npm:6.0.2":
version: 6.0.2
resolution: "queue@npm:6.0.2"
@@ -7826,18 +6826,19 @@ __metadata:
languageName: node
linkType: hard
-"react-native-executorch@npm:^0.3.2":
- version: 0.3.2
- resolution: "react-native-executorch@npm:0.3.2"
+"react-native-executorch@file:/Users/kopcion/swm-ai/react-native-executorch/react-native-executorch-0.3.1-stt-7.tgz::locator=llm%40workspace%3A.":
+ version: 0.3.1-stt-7
+ resolution: "react-native-executorch@file:/Users/kopcion/swm-ai/react-native-executorch/react-native-executorch-0.3.1-stt-7.tgz::locator=llm%40workspace%3A."
dependencies:
- expo: ^52.0.37
- expo-asset: ^11.0.3
- expo-file-system: ^18.0.10
+ "@huggingface/jinja": ^0.5.0
+ expo: ^53.0.7
+ expo-asset: ~11.0.5
+ expo-file-system: ~18.0.12
react-native-live-audio-stream: ^1.1.1
peerDependencies:
react: "*"
react-native: "*"
- checksum: c5ac5f0739186e05cc5bd5b7d03c9a8709ff037c0704e4cce12a489b20ac3dc572a454088c9cb81828abce755d576e980db1ef55fc64659ca0cfc0962789ab62
+ checksum: e22c53ea487332e00272419622651d39944b78efac75f4715dbec1ddf928b4c70a012021053f608fcead55de736766b257838b15fa50c5a1d279d3047e965472
languageName: node
linkType: hard
@@ -8132,13 +7133,6 @@ __metadata:
languageName: node
linkType: hard
-"remove-trailing-slash@npm:^0.1.0":
- version: 0.1.1
- resolution: "remove-trailing-slash@npm:0.1.1"
- checksum: dd200c6b7d6f2b49d12b3eff3abc7089917e8a268cefcd5bf67ff23f8c2ad9f866fbe2f3566e1a8dbdc4f4b1171e2941f7dd00852f8de549bb73c3df53b09d96
- languageName: node
- linkType: hard
-
"require-directory@npm:^2.1.1":
version: 2.1.1
resolution: "require-directory@npm:2.1.1"
@@ -8260,13 +7254,6 @@ __metadata:
languageName: node
linkType: hard
-"reusify@npm:^1.0.4":
- version: 1.1.0
- resolution: "reusify@npm:1.1.0"
- checksum: 64cb3142ac5e9ad689aca289585cb41d22521f4571f73e9488af39f6b1bd62f0cbb3d65e2ecc768ec6494052523f473f1eb4b55c3e9014b3590c17fc6a03e22a
- languageName: node
- linkType: hard
-
"rimraf@npm:^3.0.2":
version: 3.0.2
resolution: "rimraf@npm:3.0.2"
@@ -8300,15 +7287,6 @@ __metadata:
languageName: node
linkType: hard
-"run-parallel@npm:^1.1.9":
- version: 1.2.0
- resolution: "run-parallel@npm:1.2.0"
- dependencies:
- queue-microtask: ^1.2.2
- checksum: cb4f97ad25a75ebc11a8ef4e33bb962f8af8516bb2001082ceabd8902e15b98f4b84b4f8a9b222e5d57fc3bd1379c483886ed4619367a7680dad65316993021d
- languageName: node
- linkType: hard
-
"safe-buffer@npm:5.2.1":
version: 5.2.1
resolution: "safe-buffer@npm:5.2.1"
@@ -8344,17 +7322,7 @@ __metadata:
languageName: node
linkType: hard
-"selfsigned@npm:^2.4.1":
- version: 2.4.1
- resolution: "selfsigned@npm:2.4.1"
- dependencies:
- "@types/node-forge": ^1.3.0
- node-forge: ^1
- checksum: 38b91c56f1d7949c0b77f9bbe4545b19518475cae15e7d7f0043f87b1626710b011ce89879a88969651f650a19d213bb15b7d5b4c2877df9eeeff7ba8f8b9bfa
- languageName: node
- linkType: hard
-
-"semver@npm:^5.5.0, semver@npm:^5.6.0":
+"semver@npm:^5.6.0":
version: 5.7.2
resolution: "semver@npm:5.7.2"
bin:
@@ -8430,7 +7398,7 @@ __metadata:
languageName: node
linkType: hard
-"serve-static@npm:^1.13.1, serve-static@npm:^1.16.2":
+"serve-static@npm:^1.16.2":
version: 1.16.2
resolution: "serve-static@npm:1.16.2"
dependencies:
@@ -8442,13 +7410,6 @@ __metadata:
languageName: node
linkType: hard
-"setimmediate@npm:^1.0.5":
- version: 1.0.5
- resolution: "setimmediate@npm:1.0.5"
- checksum: c9a6f2c5b51a2dabdc0247db9c46460152ffc62ee139f3157440bd48e7c59425093f42719ac1d7931f054f153e2d26cf37dfeb8da17a794a58198a2705e527fd
- languageName: node
- linkType: hard
-
"setprototypeof@npm:1.2.0":
version: 1.2.0
resolution: "setprototypeof@npm:1.2.0"
@@ -8465,15 +7426,6 @@ __metadata:
languageName: node
linkType: hard
-"shebang-command@npm:^1.2.0":
- version: 1.2.0
- resolution: "shebang-command@npm:1.2.0"
- dependencies:
- shebang-regex: ^1.0.0
- checksum: 9eed1750301e622961ba5d588af2212505e96770ec376a37ab678f965795e995ade7ed44910f5d3d3cb5e10165a1847f52d3348c64e146b8be922f7707958908
- languageName: node
- linkType: hard
-
"shebang-command@npm:^2.0.0":
version: 2.0.0
resolution: "shebang-command@npm:2.0.0"
@@ -8483,13 +7435,6 @@ __metadata:
languageName: node
linkType: hard
-"shebang-regex@npm:^1.0.0":
- version: 1.0.0
- resolution: "shebang-regex@npm:1.0.0"
- checksum: 404c5a752cd40f94591dfd9346da40a735a05139dac890ffc229afba610854d8799aaa52f87f7e0c94c5007f2c6af55bdcaeb584b56691926c5eaf41dc8f1372
- languageName: node
- linkType: hard
-
"shebang-regex@npm:^3.0.0":
version: 3.0.0
resolution: "shebang-regex@npm:3.0.0"
@@ -8504,7 +7449,7 @@ __metadata:
languageName: node
linkType: hard
-"signal-exit@npm:^3.0.0, signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.7":
+"signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.7":
version: 3.0.7
resolution: "signal-exit@npm:3.0.7"
checksum: a2f098f247adc367dffc27845853e9959b9e88b01cb301658cfe4194352d8d2bb32e18467c786a7fe15f1d44b233ea35633d076d5e737870b7139949d1ab6318
@@ -8633,15 +7578,6 @@ __metadata:
languageName: node
linkType: hard
-"ssri@npm:^10.0.0":
- version: 10.0.6
- resolution: "ssri@npm:10.0.6"
- dependencies:
- minipass: ^7.0.3
- checksum: 4603d53a05bcd44188747d38f1cc43833b9951b5a1ee43ba50535bdfc5fe4a0897472dbe69837570a5417c3c073377ef4f8c1a272683b401857f72738ee57299
- languageName: node
- linkType: hard
-
"ssri@npm:^12.0.0":
version: 12.0.0
resolution: "ssri@npm:12.0.0"
@@ -8690,7 +7626,7 @@ __metadata:
languageName: node
linkType: hard
-"stream-buffers@npm:2.2.x, stream-buffers@npm:~2.2.0":
+"stream-buffers@npm:2.2.x":
version: 2.2.0
resolution: "stream-buffers@npm:2.2.0"
checksum: 4587d9e8f050d689fb38b4295e73408401b16de8edecc12026c6f4ae92956705ecfd995ae3845d7fa3ebf19502d5754df9143d91447fd881d86e518f43882c1c
@@ -8755,13 +7691,6 @@ __metadata:
languageName: node
linkType: hard
-"strip-eof@npm:^1.0.0":
- version: 1.0.0
- resolution: "strip-eof@npm:1.0.0"
- checksum: 40bc8ddd7e072f8ba0c2d6d05267b4e0a4800898c3435b5fb5f5a21e6e47dfaff18467e7aa0d1844bb5d6274c3097246595841fbfeb317e541974ee992cac506
- languageName: node
- linkType: hard
-
"strip-json-comments@npm:~2.0.1":
version: 2.0.1
resolution: "strip-json-comments@npm:2.0.1"
@@ -8869,20 +7798,6 @@ __metadata:
languageName: node
linkType: hard
-"tar@npm:^6.1.11, tar@npm:^6.2.1":
- version: 6.2.1
- resolution: "tar@npm:6.2.1"
- dependencies:
- chownr: ^2.0.0
- fs-minipass: ^2.0.0
- minipass: ^5.0.0
- minizlib: ^2.1.1
- mkdirp: ^1.0.3
- yallist: ^4.0.0
- checksum: f1322768c9741a25356c11373bce918483f40fa9a25c69c59410c8a1247632487edef5fe76c5f12ac51a6356d2f1829e96d2bc34098668a2fc34d76050ac2b6c
- languageName: node
- linkType: hard
-
"tar@npm:^7.4.3":
version: 7.4.3
resolution: "tar@npm:7.4.3"
@@ -8897,7 +7812,7 @@ __metadata:
languageName: node
linkType: hard
-"temp-dir@npm:^2.0.0, temp-dir@npm:~2.0.0":
+"temp-dir@npm:~2.0.0":
version: 2.0.0
resolution: "temp-dir@npm:2.0.0"
checksum: cc4f0404bf8d6ae1a166e0e64f3f409b423f4d1274d8c02814a59a5529f07db6cd070a749664141b992b2c1af337fa9bb451a460a43bb9bcddc49f235d3115aa
@@ -8913,19 +7828,6 @@ __metadata:
languageName: node
linkType: hard
-"tempy@npm:^0.7.1":
- version: 0.7.1
- resolution: "tempy@npm:0.7.1"
- dependencies:
- del: ^6.0.0
- is-stream: ^2.0.0
- temp-dir: ^2.0.0
- type-fest: ^0.16.0
- unique-string: ^2.0.0
- checksum: 265652f94eed077c311777e0290c4b4f3ec670c71c62c979efcbbd67ee506d677ff2741a72d7160556e9b0fba8fc5fbd7b3c482ac94c8acc48d85411f1f079c3
- languageName: node
- linkType: hard
-
"terminal-link@npm:^2.1.1":
version: 2.1.1
resolution: "terminal-link@npm:2.1.1"
@@ -9028,13 +7930,6 @@ __metadata:
languageName: node
linkType: hard
-"tr46@npm:~0.0.3":
- version: 0.0.3
- resolution: "tr46@npm:0.0.3"
- checksum: 726321c5eaf41b5002e17ffbd1fb7245999a073e8979085dacd47c4b4e8068ff5777142fc6726d6ca1fd2ff16921b48788b87225cbc57c72636f6efa8efbffe3
- languageName: node
- linkType: hard
-
"ts-interface-checker@npm:^0.1.9":
version: 0.1.13
resolution: "ts-interface-checker@npm:0.1.13"
@@ -9056,13 +7951,6 @@ __metadata:
languageName: node
linkType: hard
-"type-fest@npm:^0.16.0":
- version: 0.16.0
- resolution: "type-fest@npm:0.16.0"
- checksum: 1a4102c06dc109db00418c753062e206cab65befd469d000ece4452ee649bf2a9cf57686d96fb42326bc9d918d9a194d4452897b486dcc41989e5c99e4e87094
- languageName: node
- linkType: hard
-
"type-fest@npm:^0.21.3":
version: 0.21.3
resolution: "type-fest@npm:0.21.3"
@@ -9097,15 +7985,6 @@ __metadata:
languageName: node
linkType: hard
-"ua-parser-js@npm:^1.0.35":
- version: 1.0.40
- resolution: "ua-parser-js@npm:1.0.40"
- bin:
- ua-parser-js: script/cli.js
- checksum: ae555a33dc9395dd877e295d6adbf5634e047aad7c3358328830218f3ca3a6233e35848cd355465a7612f269860e8029984389282940c7a27c9af4dfcdbba8c3
- languageName: node
- linkType: hard
-
"uc.micro@npm:^1.0.1, uc.micro@npm:^1.0.5":
version: 1.0.6
resolution: "uc.micro@npm:1.0.6"
@@ -9158,15 +8037,6 @@ __metadata:
languageName: node
linkType: hard
-"unique-filename@npm:^3.0.0":
- version: 3.0.0
- resolution: "unique-filename@npm:3.0.0"
- dependencies:
- unique-slug: ^4.0.0
- checksum: 8e2f59b356cb2e54aab14ff98a51ac6c45781d15ceaab6d4f1c2228b780193dc70fae4463ce9e1df4479cb9d3304d7c2043a3fb905bdeca71cc7e8ce27e063df
- languageName: node
- linkType: hard
-
"unique-filename@npm:^4.0.0":
version: 4.0.0
resolution: "unique-filename@npm:4.0.0"
@@ -9176,15 +8046,6 @@ __metadata:
languageName: node
linkType: hard
-"unique-slug@npm:^4.0.0":
- version: 4.0.0
- resolution: "unique-slug@npm:4.0.0"
- dependencies:
- imurmurhash: ^0.1.4
- checksum: 0884b58365af59f89739e6f71e3feacb5b1b41f2df2d842d0757933620e6de08eff347d27e9d499b43c40476cbaf7988638d3acb2ffbcb9d35fd035591adfd15
- languageName: node
- linkType: hard
-
"unique-slug@npm:^5.0.0":
version: 5.0.0
resolution: "unique-slug@npm:5.0.0"
@@ -9194,7 +8055,7 @@ __metadata:
languageName: node
linkType: hard
-"unique-string@npm:^2.0.0, unique-string@npm:~2.0.0":
+"unique-string@npm:~2.0.0":
version: 2.0.0
resolution: "unique-string@npm:2.0.0"
dependencies:
@@ -9203,13 +8064,6 @@ __metadata:
languageName: node
linkType: hard
-"universalify@npm:^0.1.0":
- version: 0.1.2
- resolution: "universalify@npm:0.1.2"
- checksum: 40cdc60f6e61070fe658ca36016a8f4ec216b29bf04a55dce14e3710cc84c7448538ef4dad3728d0bfe29975ccd7bfb5f414c45e7b78883567fb31b246f02dff
- languageName: node
- linkType: hard
-
"universalify@npm:^1.0.0":
version: 1.0.0
resolution: "universalify@npm:1.0.0"
@@ -9268,15 +8122,6 @@ __metadata:
languageName: node
linkType: hard
-"uuid@npm:^8.0.0, uuid@npm:^8.3.2":
- version: 8.3.2
- resolution: "uuid@npm:8.3.2"
- bin:
- uuid: dist/bin/uuid
- checksum: 5575a8a75c13120e2f10e6ddc801b2c7ed7d8f3c8ac22c7ed0c7b2ba6383ec0abda88c905085d630e251719e0777045ae3236f04c812184b7c765f63a70e58df
- languageName: node
- linkType: hard
-
"validate-npm-package-name@npm:^5.0.0":
version: 5.0.1
resolution: "validate-npm-package-name@npm:5.0.1"
@@ -9330,13 +8175,6 @@ __metadata:
languageName: node
linkType: hard
-"webidl-conversions@npm:^3.0.0":
- version: 3.0.1
- resolution: "webidl-conversions@npm:3.0.1"
- checksum: c92a0a6ab95314bde9c32e1d0a6dfac83b578f8fa5f21e675bc2706ed6981bc26b7eb7e6a1fab158e5ce4adf9caa4a0aee49a52505d4d13c7be545f15021b17c
- languageName: node
- linkType: hard
-
"webidl-conversions@npm:^5.0.0":
version: 5.0.0
resolution: "webidl-conversions@npm:5.0.0"
@@ -9362,27 +8200,6 @@ __metadata:
languageName: node
linkType: hard
-"whatwg-url@npm:^5.0.0":
- version: 5.0.0
- resolution: "whatwg-url@npm:5.0.0"
- dependencies:
- tr46: ~0.0.3
- webidl-conversions: ^3.0.0
- checksum: b8daed4ad3356cc4899048a15b2c143a9aed0dfae1f611ebd55073310c7b910f522ad75d727346ad64203d7e6c79ef25eafd465f4d12775ca44b90fa82ed9e2c
- languageName: node
- linkType: hard
-
-"which@npm:^1.2.9":
- version: 1.3.1
- resolution: "which@npm:1.3.1"
- dependencies:
- isexe: ^2.0.0
- bin:
- which: ./bin/which
- checksum: f2e185c6242244b8426c9df1510e86629192d93c1a986a7d2a591f2c24869e7ffd03d6dac07ca863b2e4c06f59a4cc9916c585b72ee9fa1aa609d0124df15e04
- languageName: node
- linkType: hard
-
"which@npm:^2.0.1":
version: 2.0.2
resolution: "which@npm:2.0.2"
From a4c262acd6cbe4178b02c7c275a8d65169b78bf7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Mateusz=20Kopci=C5=84ski?=
Date: Thu, 8 May 2025 14:40:32 +0200
Subject: [PATCH 2/3] fixed S2T streaming improved error handling, minor
refactoring
---
examples/llama/ios/llama/Info.plist | 81 ----
examples/llm/ios/Podfile.lock | 88 +++-
.../llm/ios/llm.xcodeproj/project.pbxproj | 10 +-
.../xcshareddata/WorkspaceSettings.xcsettings | 8 +
examples/llm/ios/llm/Info.plist | 2 +
examples/llm/package.json | 4 +-
examples/llm/screens/LLMScreen.tsx | 94 ++---
examples/llm/yarn.lock | 288 ++-----------
src/Error.ts | 13 +-
src/constants/sttDefaults.ts | 6 +
src/controllers/SpeechToTextController.ts | 384 +++++++++++-------
.../useSpeechToText.ts | 11 +
src/index.tsx | 1 +
src/native/NativeSpeechToText.ts | 2 +-
14 files changed, 438 insertions(+), 554 deletions(-)
delete mode 100644 examples/llama/ios/llama/Info.plist
create mode 100644 examples/llm/ios/llm.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
diff --git a/examples/llama/ios/llama/Info.plist b/examples/llama/ios/llama/Info.plist
deleted file mode 100644
index 1febd3e0..00000000
--- a/examples/llama/ios/llama/Info.plist
+++ /dev/null
@@ -1,81 +0,0 @@
-
-
-
-
- CADisableMinimumFrameDurationOnPhone
-
- CFBundleDevelopmentRegion
- $(DEVELOPMENT_LANGUAGE)
- CFBundleDisplayName
- llama
- CFBundleExecutable
- $(EXECUTABLE_NAME)
- CFBundleIdentifier
- $(PRODUCT_BUNDLE_IDENTIFIER)
- CFBundleInfoDictionaryVersion
- 6.0
- CFBundleName
- $(PRODUCT_NAME)
- CFBundlePackageType
- $(PRODUCT_BUNDLE_PACKAGE_TYPE)
- CFBundleShortVersionString
- 1.0.0
- CFBundleSignature
- ????
- CFBundleURLTypes
-
-
- CFBundleURLSchemes
-
- com.anonymous.llama
-
-
-
- CFBundleVersion
- 1
- LSMinimumSystemVersion
- 12.0
- LSRequiresIPhoneOS
-
- NSAppTransportSecurity
-
- NSAllowsArbitraryLoads
-
- NSAllowsLocalNetworking
-
-
- NSMicrophoneUsageDescription
- We need your permission to use the microphone.
- UIAppFonts
-
- Aeonik-Regular.otf
- Aeonik-Medium.otf
-
- UILaunchStoryboardName
- SplashScreen
- UIRequiredDeviceCapabilities
-
- arm64
-
- UIRequiresFullScreen
-
- UIStatusBarStyle
- UIStatusBarStyleDefault
- UISupportedInterfaceOrientations
-
- UIInterfaceOrientationPortrait
- UIInterfaceOrientationPortraitUpsideDown
-
- UISupportedInterfaceOrientations~ipad
-
- UIInterfaceOrientationPortrait
- UIInterfaceOrientationPortraitUpsideDown
- UIInterfaceOrientationLandscapeLeft
- UIInterfaceOrientationLandscapeRight
-
- UIUserInterfaceStyle
- Light
- UIViewControllerBasedStatusBarAppearance
-
-
-
diff --git a/examples/llm/ios/Podfile.lock b/examples/llm/ios/Podfile.lock
index b217a449..6df6b89a 100644
--- a/examples/llm/ios/Podfile.lock
+++ b/examples/llm/ios/Podfile.lock
@@ -1401,7 +1401,7 @@ PODS:
- React-jsiexecutor
- React-RCTFBReactNativeSpec
- ReactCommon/turbomodule/core
- - react-native-executorch (0.3.1-stt-7):
+ - react-native-executorch (0.3.3):
- DoubleConversion
- glog
- hermes-engine
@@ -1823,6 +1823,82 @@ PODS:
- React-logger (= 0.79.2)
- React-perflogger (= 0.79.2)
- React-utils (= 0.79.2)
+ - RNAudioAPI (0.5.7):
+ - DoubleConversion
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.11.18.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-hermes
+ - React-ImageManager
+ - React-jsi
+ - React-NativeModulesApple
+ - React-RCTFabric
+ - React-renderercss
+ - React-rendererdebug
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/bridging
+ - ReactCommon/turbomodule/core
+ - RNAudioAPI/audioapi (= 0.5.7)
+ - Yoga
+ - RNAudioAPI/audioapi (0.5.7):
+ - DoubleConversion
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.11.18.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-hermes
+ - React-ImageManager
+ - React-jsi
+ - React-NativeModulesApple
+ - React-RCTFabric
+ - React-renderercss
+ - React-rendererdebug
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/bridging
+ - ReactCommon/turbomodule/core
+ - RNAudioAPI/audioapi/ios (= 0.5.7)
+ - Yoga
+ - RNAudioAPI/audioapi/ios (0.5.7):
+ - DoubleConversion
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.11.18.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-hermes
+ - React-ImageManager
+ - React-jsi
+ - React-NativeModulesApple
+ - React-RCTFabric
+ - React-renderercss
+ - React-rendererdebug
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/bridging
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - RNLiveAudioStream (1.1.1):
+ - React
- RNReanimated (3.17.5):
- DoubleConversion
- glog
@@ -2083,6 +2159,8 @@ DEPENDENCIES:
- ReactAppDependencyProvider (from `build/generated/ios`)
- ReactCodegen (from `build/generated/ios`)
- ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`)
+ - RNAudioAPI (from `../node_modules/react-native-audio-api`)
+ - RNLiveAudioStream (from `../node_modules/react-native-live-audio-stream`)
- RNReanimated (from `../node_modules/react-native-reanimated`)
- RNSVG (from `../node_modules/react-native-svg`)
- Yoga (from `../node_modules/react-native/ReactCommon/yoga`)
@@ -2256,6 +2334,10 @@ EXTERNAL SOURCES:
:path: build/generated/ios
ReactCommon:
:path: "../node_modules/react-native/ReactCommon"
+ RNAudioAPI:
+ :path: "../node_modules/react-native-audio-api"
+ RNLiveAudioStream:
+ :path: "../node_modules/react-native-live-audio-stream"
RNReanimated:
:path: "../node_modules/react-native-reanimated"
RNSVG:
@@ -2313,7 +2395,7 @@ SPEC CHECKSUMS:
React-logger: 8edfcedc100544791cd82692ca5a574240a16219
React-Mapbuffer: c3f4b608e4a59dd2f6a416ef4d47a14400194468
React-microtasksnativemodule: 054f34e9b82f02bd40f09cebd4083828b5b2beb6
- react-native-executorch: 8bca350ccbb66246dd7366fb6514fed57083930e
+ react-native-executorch: d0c3dffa0a4a4111ea9c7b97f3fbf088a48d3b2a
react-native-safe-area-context: 562163222d999b79a51577eda2ea8ad2c32b4d06
React-NativeModulesApple: 2c4377e139522c3d73f5df582e4f051a838ff25e
React-oscompat: ef5df1c734f19b8003e149317d041b8ce1f7d29c
@@ -2346,6 +2428,8 @@ SPEC CHECKSUMS:
ReactAppDependencyProvider: 04d5eb15eb46be6720e17a4a7fa92940a776e584
ReactCodegen: c63eda03ba1d94353fb97b031fc84f75a0d125ba
ReactCommon: 76d2dc87136d0a667678668b86f0fca0c16fdeb0
+ RNAudioAPI: 2e3fd4bf75aa5717791babb30126707504996f09
+ RNLiveAudioStream: 93ac2bb6065be9018d0b00157b220f11cebc1513
RNReanimated: 2313402fe27fecb7237619e9c6fcee3177f08a65
RNSVG: 794f269526df9ddc1f79b3d1a202b619df0368e3
SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748
diff --git a/examples/llm/ios/llm.xcodeproj/project.pbxproj b/examples/llm/ios/llm.xcodeproj/project.pbxproj
index 9a546b96..cb65f305 100644
--- a/examples/llm/ios/llm.xcodeproj/project.pbxproj
+++ b/examples/llm/ios/llm.xcodeproj/project.pbxproj
@@ -23,8 +23,8 @@
13B07F961A680F5B00A75B9A /* llm.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = llm.app; sourceTree = BUILT_PRODUCTS_DIR; };
13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = llm/Images.xcassets; sourceTree = ""; };
13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = llm/Info.plist; sourceTree = ""; };
- 52F93D50E948F855530BE970 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = llm/PrivacyInfo.xcprivacy; sourceTree = ""; };
- 66FD0DA88DE041D4B2294CB4 /* Aeonik-Medium.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "Aeonik-Medium.otf"; path = "../assets/fonts/Aeonik-Medium.otf"; sourceTree = ""; };
+ 52F93D50E948F855530BE970 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xml; name = PrivacyInfo.xcprivacy; path = llm/PrivacyInfo.xcprivacy; sourceTree = ""; };
+ 66FD0DA88DE041D4B2294CB4 /* Aeonik-Medium.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Aeonik-Medium.otf"; path = "../assets/fonts/Aeonik-Medium.otf"; sourceTree = ""; };
99F00DD47E42AF45816C58B8 /* Pods-llm.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-llm.release.xcconfig"; path = "Target Support Files/Pods-llm/Pods-llm.release.xcconfig"; sourceTree = ""; };
A8F7447548358E44DADA5029 /* Pods-llm.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-llm.debug.xcconfig"; path = "Target Support Files/Pods-llm/Pods-llm.debug.xcconfig"; sourceTree = ""; };
AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = SplashScreen.storyboard; path = llm/SplashScreen.storyboard; sourceTree = ""; };
@@ -33,7 +33,7 @@
ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; };
F11748412D0307B40044C1D9 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = AppDelegate.swift; path = llm/AppDelegate.swift; sourceTree = ""; };
F11748442D0722820044C1D9 /* llm-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "llm-Bridging-Header.h"; path = "llm/llm-Bridging-Header.h"; sourceTree = ""; };
- F73A1A19BDF34985A5AAA585 /* Aeonik-Regular.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "Aeonik-Regular.otf"; path = "../assets/fonts/Aeonik-Regular.otf"; sourceTree = ""; };
+ F73A1A19BDF34985A5AAA585 /* Aeonik-Regular.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Aeonik-Regular.otf"; path = "../assets/fonts/Aeonik-Regular.otf"; sourceTree = ""; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -117,7 +117,6 @@
66FD0DA88DE041D4B2294CB4 /* Aeonik-Medium.otf */,
);
name = Resources;
- path = "";
sourceTree = "";
};
B83BB53798F9A57DA3D5DBEC /* Pods */ = {
@@ -126,7 +125,6 @@
A8F7447548358E44DADA5029 /* Pods-llm.debug.xcconfig */,
99F00DD47E42AF45816C58B8 /* Pods-llm.release.xcconfig */,
);
- name = Pods;
path = Pods;
sourceTree = "";
};
@@ -353,6 +351,7 @@
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = llm/llm.entitlements;
CURRENT_PROJECT_VERSION = 1;
+ DEVELOPMENT_TEAM = J5FM626PE2;
ENABLE_BITCODE = NO;
GCC_PREPROCESSOR_DEFINITIONS = (
"$(inherited)",
@@ -389,6 +388,7 @@
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = llm/llm.entitlements;
CURRENT_PROJECT_VERSION = 1;
+ DEVELOPMENT_TEAM = J5FM626PE2;
INFOPLIST_FILE = llm/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 15.1;
LD_RUNPATH_SEARCH_PATHS = (
diff --git a/examples/llm/ios/llm.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/examples/llm/ios/llm.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
new file mode 100644
index 00000000..08de0be8
--- /dev/null
+++ b/examples/llm/ios/llm.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded
+
+
+
diff --git a/examples/llm/ios/llm/Info.plist b/examples/llm/ios/llm/Info.plist
index 5b589e2d..86608be4 100644
--- a/examples/llm/ios/llm/Info.plist
+++ b/examples/llm/ios/llm/Info.plist
@@ -52,6 +52,8 @@
Allow $(PRODUCT_NAME) to access your reminders
NSRemindersUsageDescription
Allow $(PRODUCT_NAME) to access your reminders
+ NSMicrophoneUsageDescription
+ We need your permission to use the microphone.
UIAppFonts
Aeonik-Regular.otf
diff --git a/examples/llm/package.json b/examples/llm/package.json
index f92475f7..1bf51f4a 100644
--- a/examples/llm/package.json
+++ b/examples/llm/package.json
@@ -19,7 +19,9 @@
"metro-config": "^0.81.0",
"react": "19.0.0",
"react-native": "^0.79.2",
- "react-native-executorch": "/Users/kopcion/swm-ai/react-native-executorch/react-native-executorch-0.3.1-stt-7.tgz",
+ "react-native-audio-api": "0.5.7",
+ "react-native-executorch": "^0.3.1",
+ "react-native-live-audio-stream": "^1.1.1",
"react-native-loading-spinner-overlay": "^3.0.1",
"react-native-markdown-display": "^7.0.2",
"react-native-reanimated": "^3.17.5",
diff --git a/examples/llm/screens/LLMScreen.tsx b/examples/llm/screens/LLMScreen.tsx
index 3f528c5b..4155cfe1 100644
--- a/examples/llm/screens/LLMScreen.tsx
+++ b/examples/llm/screens/LLMScreen.tsx
@@ -1,4 +1,4 @@
-import { useEffect, useRef, useState } from 'react';
+import { useRef, useState } from 'react';
import {
Keyboard,
KeyboardAvoidingView,
@@ -14,12 +14,12 @@ import { SafeAreaView } from 'react-native-safe-area-context';
import SWMIcon from '../assets/icons/swm_icon.svg';
import Spinner from 'react-native-loading-spinner-overlay';
import {
- // STREAMING_ACTION,
+ STREAMING_ACTION,
useSpeechToText,
- LLAMA3_2_1B_QLORA,
- LLAMA3_2_1B_TOKENIZER,
useLLM,
- LLAMA3_2_TOKENIZER_CONFIG,
+ QWEN3_0_6B_QUANTIZED,
+ QWEN3_TOKENIZER,
+ QWEN3_TOKENIZER_CONFIG,
} from 'react-native-executorch';
import PauseIcon from '../assets/icons/pause_icon.svg';
import MicIcon from '../assets/icons/mic_icon.svg';
@@ -29,7 +29,6 @@ import ColorPalette from '../colors';
import Messages from '../components/Messages';
import LiveAudioStream from 'react-native-live-audio-stream';
import { Buffer } from 'buffer';
-// import * as Speech from 'expo-speech';
const audioStreamOptions = {
sampleRate: 16000,
@@ -59,34 +58,36 @@ const float32ArrayFromPCMBinaryBuffer = (b64EncodedBuffer: string) => {
return float32Array;
};
-export default function ChatScreen() {
- // const [currentMessage, setCurrentMessage] = useState('');
+export default function LLMScreen({
+ setIsGenerating,
+}: {
+ setIsGenerating: React.Dispatch>;
+}) {
const [isRecording, setIsRecording] = useState(false);
const [isTextInputFocused, setIsTextInputFocused] = useState(false);
const [userInput, setUserInput] = useState('');
const textInputRef = useRef(null);
const messageRecorded = useRef(false);
const llm = useLLM({
- modelSource: LLAMA3_2_1B_QLORA,
- tokenizerSource: LLAMA3_2_1B_TOKENIZER,
- tokenizerConfigSource: LLAMA3_2_TOKENIZER_CONFIG,
+ modelSource: QWEN3_0_6B_QUANTIZED,
+ tokenizerSource: QWEN3_TOKENIZER,
+ tokenizerConfigSource: QWEN3_TOKENIZER_CONFIG,
chatConfig: {
contextWindowLength: 6,
},
});
const speechToText = useSpeechToText({
- modelName: 'whisper',
- windowSize: 5,
+ modelName: 'moonshine',
+ windowSize: 3,
overlapSeconds: 1.2,
});
const onChunk = (data: string) => {
const float32Chunk = float32ArrayFromPCMBinaryBuffer(data);
- speechToText.transcribe(Array.from(float32Chunk));
- // speechToText.streamingTranscribe(
- // STREAMING_ACTION.DATA,
- // Array.from(float32Chunk)
- // );
+ speechToText.streamingTranscribe(
+ STREAMING_ACTION.DATA,
+ Array.from(float32Chunk)
+ );
};
const handleRecordPress = async () => {
@@ -94,25 +95,20 @@ export default function ChatScreen() {
setIsRecording(false);
LiveAudioStream.stop();
messageRecorded.current = true;
- // await llm.generate(
- // await speechToText.streamingTranscribe(STREAMING_ACTION.STOP)
- // );
+ await llm.sendMessage(
+ await speechToText.streamingTranscribe(STREAMING_ACTION.STOP)
+ );
} else {
setIsRecording(true);
startStreamingAudio(audioStreamOptions, onChunk);
- // await speechToText.streamingTranscribe(STREAMING_ACTION.START);
+ await speechToText.streamingTranscribe(STREAMING_ACTION.START);
}
};
- // const sendMessage = async () => {
- // setUserInput('');
- // textInputRef.current?.clear();
- // try {
- // await llm.sendMessage(userInput);
- // } catch (e) {
- // console.error(e);
- // }
- // };
+ useEffect(() => {
+ setIsGenerating(llm.isGenerating);
+ }, [llm.isGenerating, setIsGenerating]);
+
const sendMessage = async () => {
if (userInput) {
llm.sendMessage(userInput);
@@ -122,28 +118,6 @@ export default function ChatScreen() {
}
};
- // useEffect(() => {
- // if (llm.response && !llm.isGenerating) {
- // appendToMessageHistory(llm.response, 'assistant');
- // }
- // }, [llm.response, llm.isGenerating]);
-
- // const modifyLastMessage = (content: string) => {
- // setCurrentMessage((prevMessage) => prevMessage + content);
- // };
-
- useEffect(() => {
- if (speechToText.sequence.length && !speechToText.isGenerating) {
- llm.sendMessage(speechToText.sequence);
- }
- }, [speechToText.sequence, speechToText.isGenerating, llm.sendMessage]); //eslint-disable-line react-hooks/exhaustive-deps
-
- // const appendToMessageHistory = (content: string, role: SenderType) => {
- // setChatHistory((prevHistory) => [...prevHistory, { role, content }]);
- // if (role == 'assistant' && messageRecorded.current)
- // Speech.speak(content, { language: 'en-US' });
- // };
-
return !llm.isReady || !speechToText.isReady ? (
llm 3.2 1B QLoRA x Whisper
- {llm.messageHistory.length ? (
+ {llm.messageHistory.length || speechToText.sequence ? (
{
+export const getError = (e: unknown | ETError | Error): string => {
if (typeof e === 'number') {
if (e in ETError) return ETError[e] as string;
return ETError[ETError.UndefinedError] as string;
@@ -43,9 +48,13 @@ export const getError = (e: unknown | ETError): string => {
// try to extract number from message (can contain false positives)
const error = e as Error;
const errorCode = parseInt(error.message, 10);
+ const message = Number.isNaN(errorCode)
+ ? error.message
+ : ' ' + error.message.slice(`${errorCode}`.length).trimStart();
+
const ETErrorMessage = (
errorCode in ETError ? ETError[errorCode] : ETError[ETError.UndefinedError]
) as string;
- return ETErrorMessage + error.message;
+ return ETErrorMessage + message;
};
diff --git a/src/constants/sttDefaults.ts b/src/constants/sttDefaults.ts
index 119e5d2e..db1bffc3 100644
--- a/src/constants/sttDefaults.ts
+++ b/src/constants/sttDefaults.ts
@@ -78,3 +78,9 @@ export const MODES = {
};
export const NUM_TOKENS_TO_SLICE = 3;
+
+export enum STREAMING_ACTION {
+ START,
+ DATA,
+ STOP,
+}
diff --git a/src/controllers/SpeechToTextController.ts b/src/controllers/SpeechToTextController.ts
index 13b50203..001aae72 100644
--- a/src/controllers/SpeechToTextController.ts
+++ b/src/controllers/SpeechToTextController.ts
@@ -4,27 +4,32 @@ import {
SECOND,
MODES,
NUM_TOKENS_TO_SLICE,
+ STREAMING_ACTION,
} from '../constants/sttDefaults';
import { AvailableModels, ModelConfig } from '../types/stt';
-import {
- SpeechToTextNativeModule,
- TokenizerNativeModule,
-} from '../native/RnExecutorchModules';
+import { SpeechToTextNativeModule } from '../native/RnExecutorchModules';
import { ResourceSource } from '../types/common';
import { ResourceFetcher } from '../utils/ResourceFetcher';
import { longCommonInfPref } from '../utils/stt';
import { SpeechToTextLanguage } from '../types/stt';
+import { ETError, getError } from '../Error';
+import { TokenizerModule } from '../modules/natural_language_processing/TokenizerModule';
export class SpeechToTextController {
private speechToTextNativeModule = SpeechToTextNativeModule;
- private overlapSeconds!: number;
- private windowSize!: number;
- private chunks: number[][] = [];
public sequence: number[] = [];
public isReady = false;
public isGenerating = false;
- private nativeTokenizer = TokenizerNativeModule;
+
+ private overlapSeconds!: number;
+ private windowSize!: number;
+ private chunks: number[][] = [];
+ private seqs: number[][] = [];
+ private prevSeq: number[] = [];
+ private waveform: number[] = [];
+ private numOfChunks = 0;
+ private streaming = false;
// User callbacks
private decodedTranscribeCallback: (sequence: number[]) => void;
@@ -100,9 +105,7 @@ export class SpeechToTextController {
);
// The tokenizer native module does not accept the file:// prefix
- await this.nativeTokenizer.loadModule(
- tokenizerUri.replace('file://', '')
- );
+ TokenizerModule.load(tokenizerUri.replace('file://', ''));
} catch (e) {
this.onErrorCallback?.(e);
return;
@@ -153,36 +156,36 @@ export class SpeechToTextController {
this.windowSize = 30 * SECOND - 2 * this.overlapSeconds;
}
}
- private chunkWaveform(waveform: number[]) {
- this.chunks = [];
- const numOfChunks = Math.ceil(waveform.length / this.windowSize);
- for (let i = 0; i < numOfChunks; i++) {
- let chunk = waveform.slice(
- Math.max(this.windowSize * i - this.overlapSeconds, 0),
- Math.min(
- this.windowSize * (i + 1) + this.overlapSeconds,
- waveform.length
- )
+
+ private chunkWaveform() {
+ this.numOfChunks = Math.ceil(this.waveform.length / this.windowSize);
+ for (let i = 0; i < this.numOfChunks; i++) {
+ let chunk: number[] = [];
+ const left = Math.max(this.windowSize * i - this.overlapSeconds, 0);
+ const right = Math.min(
+ this.windowSize * (i + 1) + this.overlapSeconds,
+ this.waveform.length
);
+ chunk = this.waveform.slice(left, right);
this.chunks.push(chunk);
}
}
- private checkCanTranscribe() {
- if (!this.isReady) {
- throw Error('Model is not yet ready');
- }
- if (this.isGenerating) {
- throw Error('Model is already transcribing');
- }
- }
-
- public async encode(waveform: number[]) {
- return await this.speechToTextNativeModule.encode(waveform);
+ private resetState() {
+ this.sequence = [];
+ this.seqs = [];
+ this.waveform = [];
+ this.prevSeq = [];
+ this.chunks = [];
+ this.decodedTranscribeCallback([]);
+ this.onErrorCallback?.(undefined);
}
- public async decode(seq: number[], encodings: number[]) {
- return await this.speechToTextNativeModule.decode(seq, encodings);
+ private expectedChunkLength() {
+ //only first chunk can be of shorter length, for first chunk there are no seqs decoded
+ return this.seqs.length
+ ? this.windowSize + 2 * this.overlapSeconds
+ : this.windowSize + this.overlapSeconds;
}
private async getStartingTokenIds(audioLanguage?: string): Promise {
@@ -194,13 +197,10 @@ export class SpeechToTextController {
return [this.config.tokenizer.bos];
}
// FIXME: I should use .getTokenId for the BOS as well, should remove it from config
- const langTokenId = await this.nativeTokenizer.tokenToId(
- `<|${audioLanguage}|>`
- );
- const transcribeTokenId =
- await this.nativeTokenizer.tokenToId('<|transcribe|>');
+ const langTokenId = await TokenizerModule.tokenToId(`<|${audioLanguage}|>`);
+ const transcribeTokenId = await TokenizerModule.tokenToId('<|transcribe|>');
const noTimestampsTokenId =
- await this.nativeTokenizer.tokenToId('<|notimestamps|>');
+ await TokenizerModule.tokenToId('<|notimestamps|>');
const startingTokenIds = [
this.config.tokenizer.bos,
langTokenId,
@@ -210,123 +210,142 @@ export class SpeechToTextController {
return startingTokenIds;
}
- public async transcribe(
- waveform: number[],
+ private async decodeChunk(
+ chunk: number[],
audioLanguage?: SpeechToTextLanguage
- ): Promise {
+ ): Promise {
+ const seq = await this.getStartingTokenIds(audioLanguage);
+ let prevSeqTokenIdx = 0;
+ this.prevSeq = this.sequence.slice();
try {
- this.checkCanTranscribe();
- } catch (e) {
- this.onErrorCallback?.(e);
- return '';
+ await this.encode(chunk);
+ } catch (error) {
+ this.onErrorCallback?.(new Error(getError(error) + ' encoding error'));
+ return [];
}
+ let lastToken = seq.at(-1) as number;
+ while (lastToken !== this.config.tokenizer.eos) {
+ try {
+ lastToken = await this.decode(seq);
+ } catch (error) {
+ this.onErrorCallback?.(new Error(getError(error) + ' decoding error'));
+ return [...seq, this.config.tokenizer.eos];
+ }
+ seq.push(lastToken);
+ if (
+ this.seqs.length > 0 &&
+ seq.length < this.seqs.at(-1)!.length &&
+ seq.length % 3 !== 0
+ ) {
+ this.prevSeq.push(this.seqs.at(-1)![prevSeqTokenIdx++]!);
+ this.decodedTranscribeCallback(this.prevSeq);
+ }
+ }
+ return seq;
+ }
+
+ private async handleOverlaps(seqs: number[][]): Promise {
+ const maxInd = longCommonInfPref(
+ seqs.at(-2)!,
+ seqs.at(-1)!,
+ HAMMING_DIST_THRESHOLD
+ );
+ this.sequence = [...this.sequence, ...seqs.at(-2)!.slice(0, maxInd)];
+ this.decodedTranscribeCallback(this.sequence);
+ return this.sequence.slice();
+ }
+
+ private trimLeft(numOfTokensToSlice: number) {
+ for (let idx = 1; idx < this.seqs.length; idx++) {
+ if (this.seqs[idx]![0] === this.config.tokenizer.bos)
+ this.seqs[idx] = this.seqs[idx]!.slice(numOfTokensToSlice);
+ }
+ }
+
+ private trimRight(numOfTokensToSlice: number) {
+ for (let idx = 0; idx < this.seqs.length - 1; idx++) {
+ if (this.seqs[idx]!.at(-1) === this.config.tokenizer.eos)
+ this.seqs[idx] = this.seqs[idx]!.slice(0, -numOfTokensToSlice);
+ }
+ }
+
+ private async trimSequences(audioLanguage?: string) {
+ const numSpecialTokens = (await this.getStartingTokenIds(audioLanguage))
+ .length;
+ this.trimLeft(numSpecialTokens + NUM_TOKENS_TO_SLICE);
+ this.trimRight(numSpecialTokens + NUM_TOKENS_TO_SLICE);
+ }
- if (!audioLanguage && this.config.isMultilingual) {
+ // if last chunk is too short combine it with second to last to improve quality
+ private validateAndFixLastChunk() {
+ const lastChunkLength = this.chunks.at(-1)!.length / SECOND;
+ const secondToLastChunkLength = this.chunks.at(-2)!.length / SECOND;
+ if (lastChunkLength < 5 && secondToLastChunkLength + lastChunkLength < 30) {
+ this.chunks[this.chunks.length - 2] = [
+ ...this.chunks.at(-2)!.slice(0, -this.overlapSeconds * 2),
+ ...this.chunks.at(-1)!,
+ ];
+ this.chunks = this.chunks.slice(0, -1);
+ }
+ }
+
+ private async tokenIdsToText(tokenIds: number[]): Promise {
+ try {
+ return TokenizerModule.decode(tokenIds, true);
+ } catch (e) {
this.onErrorCallback?.(
- new Error(
- 'Language parameter was not provided for a multilingual model. Please pass lang parameter to the transcribe.'
- )
+ new Error(`An error has occurred when decoding the token ids: ${e}`)
);
return '';
- } else if (audioLanguage && !this.config.isMultilingual) {
- this.onErrorCallback?.(
- new Error(
- 'Language parameter was passed to a non-multilingual model. Please either use a multilingual version or delete the lang parameter.'
- )
- );
+ }
+ }
+
+ public async transcribe(
+ waveform: number[],
+ audioLanguage?: SpeechToTextLanguage
+ ): Promise {
+ try {
+ if (!this.isReady) throw Error(getError(ETError.ModuleNotLoaded));
+ if (this.isGenerating || this.streaming)
+ throw Error(getError(ETError.ModelGenerating));
+ if (!!audioLanguage !== this.config.isMultilingual)
+ throw new Error(getError(ETError.MultilingualConfiguration));
+ } catch (e) {
+ this.onErrorCallback?.(e);
return '';
}
// Making sure that the error is not set when we get there
- this.onErrorCallback?.(undefined);
this.isGeneratingCallback(true);
- this.chunkWaveform(waveform);
+ this.resetState();
+ this.waveform = waveform;
+ this.chunkWaveform();
+ this.validateAndFixLastChunk();
- this.sequence = [];
- let seqs: number[][] = [];
- let prevSeq: number[] = [];
for (let chunkId = 0; chunkId < this.chunks.length; chunkId++) {
- let prevSeqTokenIdx = 0;
- let finalSeq: number[] = [];
-
- let seq = await this.getStartingTokenIds(audioLanguage);
- const numSpecialTokens = seq.length;
- let encoderOutput;
- try {
- encoderOutput = await this.speechToTextNativeModule.encode(
- this.chunks!.at(chunkId)!
- );
- } catch (error) {
- this.onErrorCallback?.(`An error has occurred while encoding ${error}`);
- return '';
- }
-
- let lastToken = seq.at(-1) as number;
- while (lastToken !== this.config.tokenizer.eos) {
- try {
- // Returns a single predicted token
- lastToken = await this.speechToTextNativeModule.decode(
- seq,
- encoderOutput
- );
- } catch (error) {
- this.onErrorCallback?.(
- `An error has occurred while decoding: ${error}`
- );
- return '';
- }
- seq.push(lastToken);
- if (
- seqs.length > 0 &&
- seq.length < seqs.at(-1)!.length &&
- seq.length % 3 !== 0
- ) {
- prevSeq.push(seqs.at(-1)![prevSeqTokenIdx++]!);
- this.decodedTranscribeCallback(prevSeq);
- }
- }
-
+ const seq = await this.decodeChunk(this.chunks!.at(chunkId)!);
+ // whole audio is inside one chunk, no processing required
if (this.chunks.length === 1) {
- finalSeq = seq;
- this.sequence = finalSeq;
- this.decodedTranscribeCallback(finalSeq);
+ this.sequence = seq;
+ this.decodedTranscribeCallback(seq);
break;
}
+ this.seqs.push(seq);
- // Remove starting tokenIds and 3 additional ones
- if (seqs.length === 0) {
- seqs = [seq.slice(0, -(numSpecialTokens + NUM_TOKENS_TO_SLICE))];
- } else if (seqs.length === this.chunks.length - 1) {
- seqs.push(seq.slice(numSpecialTokens + NUM_TOKENS_TO_SLICE));
- } else {
- seqs.push(
- seq.slice(
- numSpecialTokens + NUM_TOKENS_TO_SLICE,
- -(numSpecialTokens + NUM_TOKENS_TO_SLICE)
- )
- );
- }
- if (seqs.length < 2) {
- continue;
- }
+ // Remove starting tokenIds and some additional ones
+ await this.trimSequences(audioLanguage);
- const maxInd = longCommonInfPref(
- seqs.at(-2)!,
- seqs.at(-1)!,
- HAMMING_DIST_THRESHOLD
- );
- finalSeq = [...this.sequence, ...seqs.at(-2)!.slice(0, maxInd)];
- this.sequence = finalSeq;
- this.decodedTranscribeCallback(finalSeq);
- prevSeq = finalSeq;
+ if (this.seqs.length < 2) continue;
+
+ this.prevSeq = await this.handleOverlaps(this.seqs);
// last sequence processed
- if (seqs.length === this.chunks.length) {
- finalSeq = [...this.sequence, ...seqs.at(-1)!];
- this.sequence = finalSeq;
- this.decodedTranscribeCallback(finalSeq);
- prevSeq = finalSeq;
+ // overlaps are already handled, so just append the last seq
+ if (this.seqs.length === this.chunks.length) {
+ this.sequence = [...this.sequence, ...this.seqs.at(-1)!];
+ this.decodedTranscribeCallback(this.sequence);
+ this.prevSeq = this.sequence;
}
}
const decodedText = await this.tokenIdsToText(this.sequence);
@@ -334,14 +353,99 @@ export class SpeechToTextController {
return decodedText;
}
- private async tokenIdsToText(tokenIds: number[]): Promise {
+ public async streamingTranscribe(
+ streamAction: STREAMING_ACTION,
+ waveform?: number[],
+ audioLanguage?: SpeechToTextLanguage
+ ): Promise {
try {
- return this.nativeTokenizer.decode(tokenIds, true);
+ if (!this.isReady) throw Error(getError(ETError.ModuleNotLoaded));
+ if (!!audioLanguage !== this.config.isMultilingual)
+ throw new Error(getError(ETError.MultilingualConfiguration));
+
+ if (
+ streamAction === STREAMING_ACTION.START &&
+ !this.streaming &&
+ this.isGenerating
+ )
+ throw Error(getError(ETError.ModelGenerating));
+ if (streamAction === STREAMING_ACTION.START && this.streaming)
+ throw Error(getError(ETError.ModelGenerating));
+ if (streamAction === STREAMING_ACTION.DATA && !this.streaming)
+ throw Error(getError(ETError.StreamingNotStarted));
+ if (streamAction === STREAMING_ACTION.STOP && !this.streaming)
+ throw Error(getError(ETError.StreamingNotStarted));
+ if (streamAction === STREAMING_ACTION.DATA && !waveform)
+ throw new Error(getError(ETError.MissingDataChunk));
} catch (e) {
- this.onErrorCallback?.(
- new Error(`An error has occurred when decoding the token ids: ${e}`)
- );
+ this.onErrorCallback?.(e);
return '';
}
+
+ if (streamAction === STREAMING_ACTION.START) {
+ this.resetState();
+ this.streaming = true;
+ this.isGeneratingCallback(true);
+ }
+
+ this.waveform = [...this.waveform, ...(waveform || [])];
+
+ // while buffer has at least required size get chunk and decode
+ while (this.waveform.length >= this.expectedChunkLength()) {
+ const chunk = this.waveform.slice(
+ 0,
+ this.windowSize +
+ this.overlapSeconds * (1 + Number(this.seqs.length > 0))
+ );
+ this.chunks = [chunk]; //save last chunk for STREAMING_ACTION.STOP
+ this.waveform = this.waveform.slice(
+ this.windowSize - this.overlapSeconds * Number(this.seqs.length === 0)
+ );
+ const seq = await this.decodeChunk(chunk, audioLanguage);
+ this.seqs.push(seq);
+ await this.trimSequences(audioLanguage);
+
+ if (this.seqs.length < 2) continue;
+ await this.handleOverlaps(this.seqs);
+ }
+
+ // got final package, process all remaining waveform data
+ // since we run the loop above the waveform has at most one chunk in it
+ if (streamAction === STREAMING_ACTION.STOP) {
+ // pad remaining waveform data with previous chunk to this.windowSize + 2 * this.overlapSeconds
+ const chunk = this.chunks.length
+ ? [
+ ...this.chunks[0]!.slice(0, this.windowSize),
+ ...this.waveform,
+ ].slice(-this.windowSize - 2 * this.overlapSeconds)
+ : this.waveform;
+
+ this.waveform = [];
+ const seq = await this.decodeChunk(chunk, audioLanguage);
+ this.seqs.push(seq);
+ await this.trimSequences(audioLanguage);
+
+ if (this.seqs.length === 1) {
+ this.sequence = this.seqs[0]!;
+ } else {
+ await this.handleOverlaps(this.seqs);
+ this.sequence = [...this.sequence, ...this.seqs.at(-1)!];
+ }
+ this.decodedTranscribeCallback(this.sequence);
+ this.isGeneratingCallback(false);
+ this.streaming = false;
+ }
+
+ const decodedText = await this.tokenIdsToText(this.sequence);
+
+ return decodedText;
+ }
+
+ public async encode(waveform: number[]) {
+ return await this.speechToTextNativeModule.encode(waveform);
+ }
+
+ public async decode(seq: number[], encodings?: number[]) {
+ return await this.speechToTextNativeModule.decode(seq, encodings);
}
}
diff --git a/src/hooks/natural_language_processing/useSpeechToText.ts b/src/hooks/natural_language_processing/useSpeechToText.ts
index 536202f0..9a9f2455 100644
--- a/src/hooks/natural_language_processing/useSpeechToText.ts
+++ b/src/hooks/natural_language_processing/useSpeechToText.ts
@@ -1,6 +1,7 @@
import { useEffect, useState } from 'react';
import { SpeechToTextController } from '../../controllers/SpeechToTextController';
import { ResourceSource } from '../../types/common';
+import { STREAMING_ACTION } from '../../constants/sttDefaults';
import { AvailableModels, SpeechToTextLanguage } from '../../types/stt';
interface SpeechToTextModule {
@@ -14,6 +15,11 @@ interface SpeechToTextModule {
input: number[],
audioLanguage?: SpeechToTextLanguage
) => ReturnType;
+ streamingTranscribe: (
+ streamAction: STREAMING_ACTION,
+ input?: number[],
+ audioLanguage?: SpeechToTextLanguage
+ ) => ReturnType;
}
export const useSpeechToText = ({
@@ -80,5 +86,10 @@ export const useSpeechToText = ({
error,
transcribe: (waveform: number[], audioLanguage?: SpeechToTextLanguage) =>
model.transcribe(waveform, audioLanguage),
+ streamingTranscribe: (
+ streamAction: STREAMING_ACTION,
+ waveform?: number[],
+ audioLanguage?: SpeechToTextLanguage
+ ) => model.streamingTranscribe(streamAction, waveform, audioLanguage),
};
};
diff --git a/src/index.tsx b/src/index.tsx
index 9519e2aa..1871fd44 100644
--- a/src/index.tsx
+++ b/src/index.tsx
@@ -44,3 +44,4 @@ export { SpeechToTextLanguage };
export * from './constants/modelUrls';
export * from './constants/ocr/models';
export * from './constants/llmDefaults';
+export { STREAMING_ACTION, MODES } from './constants/sttDefaults';
diff --git a/src/native/NativeSpeechToText.ts b/src/native/NativeSpeechToText.ts
index b140eac3..279ab9eb 100644
--- a/src/native/NativeSpeechToText.ts
+++ b/src/native/NativeSpeechToText.ts
@@ -9,7 +9,7 @@ export interface Spec extends TurboModule {
): Promise;
generate(waveform: number[]): Promise;
encode(input: number[]): Promise;
- decode(prevTokens: number[], encoderOutput: number[]): Promise;
+ decode(prevTokens: number[], encoderOutput?: number[]): Promise;
readonly onToken: EventEmitter;
}
From 135eb72fe835863cdc3fa4c9d0731f0af935c023 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Mateusz=20Kopci=C5=84ski?=
Date: Thu, 15 May 2025 14:30:34 +0200
Subject: [PATCH 3/3] missing import
---
examples/llm/screens/LLMScreen.tsx | 159 ++++++++++++++---------------
1 file changed, 78 insertions(+), 81 deletions(-)
diff --git a/examples/llm/screens/LLMScreen.tsx b/examples/llm/screens/LLMScreen.tsx
index 5fde314f..c2f5d06e 100644
--- a/examples/llm/screens/LLMScreen.tsx
+++ b/examples/llm/screens/LLMScreen.tsx
@@ -1,4 +1,4 @@
-import { useRef, useState } from 'react';
+import { useEffect, useRef, useState } from 'react';
import {
Keyboard,
KeyboardAvoidingView,
@@ -10,7 +10,6 @@ import {
View,
TextInput,
} from 'react-native';
-import { SafeAreaView } from 'react-native-safe-area-context';
import SWMIcon from '../assets/icons/swm_icon.svg';
import Spinner from 'react-native-loading-spinner-overlay';
import {
@@ -125,88 +124,86 @@ export default function LLMScreen({
textContent={`Loading the model ${(llm.downloadProgress * 100).toFixed(0)} %\nLoading the speech model ${(speechToText.downloadProgress * 100).toFixed(0)} %`}
/>
) : (
-
-
-
-
-
- llm 3.2 1B QLoRA x Whisper
+
+
+
+
+ Qwen 3 x Whisper
+
+ {llm.messageHistory.length || speechToText.sequence ? (
+
+
+
+ ) : (
+
+ Hello! 👋
+
+ What can I help you with?
+
- {llm.messageHistory.length || speechToText.sequence ? (
-
-
-
+ )}
+
+ setIsTextInputFocused(true)}
+ onBlur={() => setIsTextInputFocused(false)}
+ editable={!isRecording && !llm.isGenerating}
+ style={{
+ ...styles.textInput,
+ borderColor: isTextInputFocused
+ ? ColorPalette.blueDark
+ : ColorPalette.blueLight,
+ display: isRecording ? 'none' : 'flex',
+ }}
+ placeholder="Your message"
+ placeholderTextColor={'#C1C6E5'}
+ multiline={true}
+ ref={textInputRef}
+ onChangeText={(text: string) => setUserInput(text)}
+ />
+ {llm.isGenerating ? (
+
+
+
+ ) : !userInput ? (
+
+ {isRecording ? (
+
+ ) : (
+
+ )}
+
) : (
-
- Hello! 👋
-
- What can I help you with?
-
-
+ !llm.isGenerating && (await sendMessage())}
+ >
+
+
)}
-
- setIsTextInputFocused(true)}
- onBlur={() => setIsTextInputFocused(false)}
- editable={!isRecording && !llm.isGenerating}
- style={{
- ...styles.textInput,
- borderColor: isTextInputFocused
- ? ColorPalette.blueDark
- : ColorPalette.blueLight,
- display: isRecording ? 'none' : 'flex',
- }}
- placeholder="Your message"
- placeholderTextColor={'#C1C6E5'}
- multiline={true}
- ref={textInputRef}
- onChangeText={(text: string) => setUserInput(text)}
- />
- {llm.isGenerating ? (
-
-
-
- ) : !userInput ? (
-
- {isRecording ? (
-
- ) : (
-
- )}
-
- ) : (
- !llm.isGenerating && (await sendMessage())}
- >
-
-
- )}
-
-
-
-
+
+
+
);
}