Skip to content

Commit f6784c4

Browse files
jakmroMateusz Kopciński
authored andcommitted
feat: use react-native-audio-api in llm voice chat (#592)
Changes: - use react-native-audio-api in llm voice chat example app - add audio recording permission - [ ] Yes - [x] No - [x] Bug fix (change which fixes an issue) - [ ] New feature (change which adds functionality) - [ ] Documentation update (improves or adds clarity to existing documentation) - [ ] Other (chores, tests, code style improvements etc.) - [x] iOS - [x] Android - [x] I have performed a self-review of my code - [x] I have commented my code, particularly in hard-to-understand areas - [ ] I have updated the documentation accordingly - [x] My changes generate no new warnings
1 parent aa00456 commit f6784c4

File tree

11 files changed

+135
-97
lines changed

11 files changed

+135
-97
lines changed

apps/llm/android/app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
<uses-permission android:name="android.permission.WRITE_CALENDAR"/>
88
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
99
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
10+
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
1011
<queries>
1112
<intent>
1213
<action android:name="android.intent.action.VIEW"/>

apps/llm/app.json

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,22 @@
2323
"calendarPermission": "The app needs to access your calendar."
2424
}
2525
],
26-
"expo-router"
26+
"expo-router",
27+
[
28+
"react-native-audio-api",
29+
{
30+
"iosBackgroundMode": true,
31+
"iosMicrophonePermission": "This app requires access to the microphone to record audio.",
32+
"androidPermissions": [
33+
"android.permission.MODIFY_AUDIO_SETTINGS",
34+
"android.permission.FOREGROUND_SERVICE",
35+
"android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK",
36+
"android.permission.RECORD_AUDIO"
37+
],
38+
"androidForegroundService": true,
39+
"androidFSTypes": ["mediaPlayback"]
40+
}
41+
]
2742
],
2843
"newArchEnabled": true,
2944
"splash": {

apps/llm/app/voice_chat/index.tsx

Lines changed: 22 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -22,38 +22,10 @@ import MicIcon from '../../assets/icons/mic_icon.svg';
2222
import StopIcon from '../../assets/icons/stop_icon.svg';
2323
import ColorPalette from '../../colors';
2424
import Messages from '../../components/Messages';
25-
import LiveAudioStream from 'react-native-live-audio-stream';
25+
import { AudioManager, AudioRecorder } from 'react-native-audio-api';
2626
import DeviceInfo from 'react-native-device-info';
27-
import { Buffer } from 'buffer';
2827
import { useIsFocused } from '@react-navigation/native';
2928
import { GeneratingContext } from '../../context';
30-
const audioStreamOptions = {
31-
sampleRate: 16000,
32-
channels: 1,
33-
bitsPerSample: 16,
34-
audioSource: 1,
35-
bufferSize: 16000,
36-
};
37-
38-
const startStreamingAudio = (options: any, onChunk: (data: string) => void) => {
39-
LiveAudioStream.init(options);
40-
LiveAudioStream.on('data', onChunk);
41-
LiveAudioStream.start();
42-
};
43-
44-
const float32ArrayFromPCMBinaryBuffer = (b64EncodedBuffer: string) => {
45-
const b64DecodedChunk = Buffer.from(b64EncodedBuffer, 'base64');
46-
const int16Array = new Int16Array(b64DecodedChunk.buffer);
47-
48-
const float32Array = new Float32Array(int16Array.length);
49-
for (let i = 0; i < int16Array.length; i++) {
50-
float32Array[i] = Math.max(
51-
-1,
52-
Math.min(1, (int16Array[i] / audioStreamOptions.bufferSize) * 8)
53-
);
54-
}
55-
return float32Array;
56-
};
5729

5830
export default function VoiceChatScreenWrapper() {
5931
const isFocused = useIsFocused();
@@ -63,6 +35,13 @@ export default function VoiceChatScreenWrapper() {
6335

6436
function VoiceChatScreen() {
6537
const [isRecording, setIsRecording] = useState(false);
38+
const [recorder] = useState(
39+
() =>
40+
new AudioRecorder({
41+
sampleRate: 16000,
42+
bufferLengthInSamples: 1600,
43+
})
44+
);
6645
const messageRecorded = useRef<boolean>(false);
6746
const { setGlobalGenerating } = useContext(GeneratingContext);
6847

@@ -75,20 +54,27 @@ function VoiceChatScreen() {
7554
setGlobalGenerating(llm.isGenerating || speechToText.isGenerating);
7655
}, [llm.isGenerating, speechToText.isGenerating, setGlobalGenerating]);
7756

78-
const onChunk = (data: string) => {
79-
const float32Chunk = float32ArrayFromPCMBinaryBuffer(data);
80-
speechToText.streamInsert(float32Chunk);
81-
};
57+
useEffect(() => {
58+
AudioManager.setAudioSessionOptions({
59+
iosCategory: 'playAndRecord',
60+
iosMode: 'spokenAudio',
61+
iosOptions: ['allowBluetooth', 'defaultToSpeaker'],
62+
});
63+
AudioManager.requestRecordingPermissions();
64+
}, []);
8265

8366
const handleRecordPress = async () => {
8467
if (isRecording) {
8568
setIsRecording(false);
86-
LiveAudioStream.stop();
69+
recorder.stop();
8770
messageRecorded.current = true;
88-
speechToText.streamStop();
71+
await speechToText.streamStop();
8972
} else {
9073
setIsRecording(true);
91-
startStreamingAudio(audioStreamOptions, onChunk);
74+
recorder.onAudioReady(async ({ buffer }) => {
75+
await speechToText.streamInsert(buffer.getChannelData(0));
76+
});
77+
recorder.start();
9278
const transcription = await speechToText.stream();
9379
await llm.sendMessage(transcription);
9480
}

apps/llm/ios/Podfile.lock

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1403,7 +1403,7 @@ PODS:
14031403
- React-jsiexecutor
14041404
- React-RCTFBReactNativeSpec
14051405
- ReactCommon/turbomodule/core
1406-
- react-native-executorch (0.5.2):
1406+
- react-native-executorch (0.5.0):
14071407
- DoubleConversion
14081408
- glog
14091409
- hermes-engine
@@ -1826,7 +1826,7 @@ PODS:
18261826
- React-logger (= 0.79.2)
18271827
- React-perflogger (= 0.79.2)
18281828
- React-utils (= 0.79.2)
1829-
- RNAudioAPI (0.5.7):
1829+
- RNAudioAPI (0.8.2):
18301830
- DoubleConversion
18311831
- glog
18321832
- hermes-engine
@@ -1849,9 +1849,9 @@ PODS:
18491849
- ReactCodegen
18501850
- ReactCommon/turbomodule/bridging
18511851
- ReactCommon/turbomodule/core
1852-
- RNAudioAPI/audioapi (= 0.5.7)
1852+
- RNAudioAPI/audioapi (= 0.8.2)
18531853
- Yoga
1854-
- RNAudioAPI/audioapi (0.5.7):
1854+
- RNAudioAPI/audioapi (0.8.2):
18551855
- DoubleConversion
18561856
- glog
18571857
- hermes-engine
@@ -1874,9 +1874,9 @@ PODS:
18741874
- ReactCodegen
18751875
- ReactCommon/turbomodule/bridging
18761876
- ReactCommon/turbomodule/core
1877-
- RNAudioAPI/audioapi/ios (= 0.5.7)
1877+
- RNAudioAPI/audioapi/ios (= 0.8.2)
18781878
- Yoga
1879-
- RNAudioAPI/audioapi/ios (0.5.7):
1879+
- RNAudioAPI/audioapi/ios (0.8.2):
18801880
- DoubleConversion
18811881
- glog
18821882
- hermes-engine
@@ -1926,8 +1926,6 @@ PODS:
19261926
- ReactCommon/turbomodule/bridging
19271927
- ReactCommon/turbomodule/core
19281928
- Yoga
1929-
- RNLiveAudioStream (1.1.1):
1930-
- React
19311929
- RNReanimated (3.17.5):
19321930
- DoubleConversion
19331931
- glog
@@ -2246,7 +2244,6 @@ DEPENDENCIES:
22462244
- RNAudioAPI (from `../../../node_modules/react-native-audio-api`)
22472245
- RNDeviceInfo (from `../../../node_modules/react-native-device-info`)
22482246
- RNGestureHandler (from `../../../node_modules/react-native-gesture-handler`)
2249-
- RNLiveAudioStream (from `../../../node_modules/react-native-live-audio-stream`)
22502247
- RNReanimated (from `../../../node_modules/react-native-reanimated`)
22512248
- RNScreens (from `../../../node_modules/react-native-screens`)
22522249
- RNSVG (from `../../../node_modules/react-native-svg`)
@@ -2430,8 +2427,6 @@ EXTERNAL SOURCES:
24302427
:path: "../../../node_modules/react-native-device-info"
24312428
RNGestureHandler:
24322429
:path: "../../../node_modules/react-native-gesture-handler"
2433-
RNLiveAudioStream:
2434-
:path: "../../../node_modules/react-native-live-audio-stream"
24352430
RNReanimated:
24362431
:path: "../../../node_modules/react-native-reanimated"
24372432
RNScreens:
@@ -2525,15 +2520,14 @@ SPEC CHECKSUMS:
25252520
ReactAppDependencyProvider: 04d5eb15eb46be6720e17a4a7fa92940a776e584
25262521
ReactCodegen: 7ea266ccd94436294f516247db7402b57b1214af
25272522
ReactCommon: 76d2dc87136d0a667678668b86f0fca0c16fdeb0
2528-
RNAudioAPI: 2e3fd4bf75aa5717791babb30126707504996f09
2523+
RNAudioAPI: 3e398c4e9d44bb6b0c0b00e902057613224fc024
25292524
RNDeviceInfo: d863506092aef7e7af3a1c350c913d867d795047
25302525
RNGestureHandler: 7d0931a61d7ba0259f32db0ba7d0963c3ed15d2b
2531-
RNLiveAudioStream: 93ac2bb6065be9018d0b00157b220f11cebc1513
25322526
RNReanimated: afd6a269a47d6f13ba295c46c6c0e14e3cbd0d8a
25332527
RNScreens: 482e9707f9826230810c92e765751af53826d509
25342528
RNSVG: 794f269526df9ddc1f79b3d1a202b619df0368e3
25352529
SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748
2536-
sqlite3: 83105acd294c9137c026e2da1931c30b4588ab81
2530+
sqlite3: 1d85290c3321153511f6e900ede7a1608718bbd5
25372531
Yoga: c758bfb934100bb4bf9cbaccb52557cee35e8bdf
25382532

25392533
PODFILE CHECKSUM: bba19a069e673f2259009e9d2caab44374fdebcf

apps/llm/ios/llm.xcodeproj/project.pbxproj

Lines changed: 56 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,11 @@
2828
B79E360E00239D910BF9B38D /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xml; name = PrivacyInfo.xcprivacy; path = llm/PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
2929
BB2F792C24A3F905000567C9 /* Expo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Expo.plist; sourceTree = "<group>"; };
3030
E8C01EF33FCE4105BBBC9DF6 /* Aeonik-Medium.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Aeonik-Medium.otf"; path = "../assets/fonts/Aeonik-Medium.otf"; sourceTree = "<group>"; };
31-
EA4529BE680FEB0AB7539557 /* 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 = "<group>"; };
3231
ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; };
3332
F11748412D0307B40044C1D9 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = AppDelegate.swift; path = llm/AppDelegate.swift; sourceTree = "<group>"; };
3433
F11748442D0722820044C1D9 /* llm-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "llm-Bridging-Header.h"; path = "llm/llm-Bridging-Header.h"; sourceTree = "<group>"; };
34+
F5CE0775ADE5923FA417B603 /* libPods-llm.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-llm.a"; sourceTree = BUILT_PRODUCTS_DIR; };
3535
F866B7979FB94C8797EE2E3D /* Aeonik-Regular.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Aeonik-Regular.otf"; path = "../assets/fonts/Aeonik-Regular.otf"; sourceTree = "<group>"; };
36-
FCA4A9AE0011869427989B32 /* libPods-llm.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-llm.a"; sourceTree = BUILT_PRODUCTS_DIR; };
3736
/* End PBXFileReference section */
3837

3938
/* Begin PBXFrameworksBuildPhase section */
@@ -96,6 +95,15 @@
9695
name = Frameworks;
9796
sourceTree = "<group>";
9897
};
98+
3014A6CAF64EC97E4003A2A3 /* Pods */ = {
99+
isa = PBXGroup;
100+
children = (
101+
4F489A14802F01369BFDDEFD /* Pods-llm.debug.xcconfig */,
102+
63C842393C3838DA2ECEFC7C /* Pods-llm.release.xcconfig */,
103+
);
104+
path = Pods;
105+
sourceTree = "<group>";
106+
};
99107
832341AE1AAA6A7D00B99B32 /* Libraries */ = {
100108
isa = PBXGroup;
101109
children = (
@@ -292,7 +300,52 @@
292300
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
293301
showEnvVarsInLog = 0;
294302
};
295-
E0CDBD4D0993974173A0E9FD /* [CP] Copy Pods Resources */ = {
303+
281D8603161F8B331E2BA335 /* [Expo] Configure project */ = {
304+
isa = PBXShellScriptBuildPhase;
305+
alwaysOutOfDate = 1;
306+
buildActionMask = 2147483647;
307+
files = (
308+
);
309+
inputFileListPaths = (
310+
);
311+
inputPaths = (
312+
);
313+
name = "[Expo] Configure project";
314+
outputFileListPaths = (
315+
);
316+
outputPaths = (
317+
);
318+
runOnlyForDeploymentPostprocessing = 0;
319+
shellPath = /bin/sh;
320+
shellScript = "# This script configures Expo modules and generates the modules provider file.\nbash -l -c \"./Pods/Target\\ Support\\ Files/Pods-llm/expo-configure-project.sh\"\n";
321+
};
322+
62055444ECB4CA2743E68CDC /* [CP] Embed Pods Frameworks */ = {
323+
isa = PBXShellScriptBuildPhase;
324+
buildActionMask = 2147483647;
325+
files = (
326+
);
327+
inputPaths = (
328+
"${PODS_ROOT}/Target Support Files/Pods-llm/Pods-llm-frameworks.sh",
329+
"${PODS_XCFRAMEWORKS_BUILD_DIR}/RNAudioAPI/libavcodec.framework/libavcodec",
330+
"${PODS_XCFRAMEWORKS_BUILD_DIR}/RNAudioAPI/libavformat.framework/libavformat",
331+
"${PODS_XCFRAMEWORKS_BUILD_DIR}/RNAudioAPI/libavutil.framework/libavutil",
332+
"${PODS_XCFRAMEWORKS_BUILD_DIR}/RNAudioAPI/libswresample.framework/libswresample",
333+
"${PODS_XCFRAMEWORKS_BUILD_DIR}/hermes-engine/Pre-built/hermes.framework/hermes",
334+
);
335+
name = "[CP] Embed Pods Frameworks";
336+
outputPaths = (
337+
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/libavcodec.framework",
338+
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/libavformat.framework",
339+
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/libavutil.framework",
340+
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/libswresample.framework",
341+
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hermes.framework",
342+
);
343+
runOnlyForDeploymentPostprocessing = 0;
344+
shellPath = /bin/sh;
345+
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-llm/Pods-llm-frameworks.sh\"\n";
346+
showEnvVarsInLog = 0;
347+
};
348+
800E24972A6A228C8D4807E9 /* [CP] Copy Pods Resources */ = {
296349
isa = PBXShellScriptBuildPhase;
297350
buildActionMask = 2147483647;
298351
files = (

apps/llm/metro.config.js

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,22 @@
11
const { getDefaultConfig } = require('expo/metro-config');
2+
const {
3+
wrapWithAudioAPIMetroConfig,
4+
} = require('react-native-audio-api/metro-config');
25

3-
module.exports = (() => {
4-
const config = getDefaultConfig(__dirname);
6+
const config = getDefaultConfig(__dirname);
57

6-
const { transformer, resolver } = config;
8+
const { transformer, resolver } = config;
79

8-
config.transformer = {
9-
...transformer,
10-
babelTransformerPath: require.resolve('react-native-svg-transformer/expo'),
11-
};
12-
config.resolver = {
13-
...resolver,
14-
assetExts: resolver.assetExts.filter((ext) => ext !== 'svg'),
15-
sourceExts: [...resolver.sourceExts, 'svg'],
16-
};
10+
config.transformer = {
11+
...transformer,
12+
babelTransformerPath: require.resolve('react-native-svg-transformer/expo'),
13+
};
14+
config.resolver = {
15+
...resolver,
16+
assetExts: resolver.assetExts.filter((ext) => ext !== 'svg'),
17+
sourceExts: [...resolver.sourceExts, 'svg'],
18+
};
1719

18-
config.resolver.assetExts.push('pte');
20+
config.resolver.assetExts.push('pte');
1921

20-
return config;
21-
})();
22+
module.exports = wrapWithAudioAPIMetroConfig(config);

apps/llm/package.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,10 @@
2828
"metro-config": "^0.81.0",
2929
"react": "19.0.0",
3030
"react-native": "0.79.2",
31-
"react-native-audio-api": "0.5.7",
31+
"react-native-audio-api": "^0.8.2",
3232
"react-native-device-info": "^14.0.4",
3333
"react-native-executorch": "workspace:*",
3434
"react-native-gesture-handler": "~2.24.0",
35-
"react-native-live-audio-stream": "^1.1.1",
3635
"react-native-loading-spinner-overlay": "^3.0.1",
3736
"react-native-markdown-display": "^7.0.2",
3837
"react-native-reanimated": "~3.17.4",

apps/speech-to-text/ios/Podfile.lock

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1395,7 +1395,7 @@ PODS:
13951395
- React-jsiexecutor
13961396
- React-RCTFBReactNativeSpec
13971397
- ReactCommon/turbomodule/core
1398-
- react-native-executorch (0.4.2):
1398+
- react-native-executorch (0.5.0):
13991399
- DoubleConversion
14001400
- glog
14011401
- hermes-engine
@@ -2382,7 +2382,7 @@ SPEC CHECKSUMS:
23822382
React-logger: 8edfcedc100544791cd82692ca5a574240a16219
23832383
React-Mapbuffer: c3f4b608e4a59dd2f6a416ef4d47a14400194468
23842384
React-microtasksnativemodule: 054f34e9b82f02bd40f09cebd4083828b5b2beb6
2385-
react-native-executorch: c18d209e226f0530a9ee88f1d60ce5837d4800ee
2385+
react-native-executorch: 3c871f7ed2e2b0ff92519ce38f06f0904784dbdb
23862386
react-native-safe-area-context: 562163222d999b79a51577eda2ea8ad2c32b4d06
23872387
React-NativeModulesApple: 2c4377e139522c3d73f5df582e4f051a838ff25e
23882388
React-oscompat: ef5df1c734f19b8003e149317d041b8ce1f7d29c

apps/speech-to-text/ios/speechtotext.xcodeproj/project.pbxproj

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,6 @@
276276
"${PODS_CONFIGURATION_BUILD_DIR}/React-cxxreact/React-cxxreact_privacy.bundle",
277277
"${PODS_CONFIGURATION_BUILD_DIR}/boost/boost_privacy.bundle",
278278
"${PODS_CONFIGURATION_BUILD_DIR}/glog/glog_privacy.bundle",
279-
"${PODS_CONFIGURATION_BUILD_DIR}/react-native-image-picker/RNImagePickerPrivacyInfo.bundle",
280279
);
281280
name = "[CP] Copy Pods Resources";
282281
outputPaths = (
@@ -290,7 +289,6 @@
290289
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/React-cxxreact_privacy.bundle",
291290
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/boost_privacy.bundle",
292291
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/glog_privacy.bundle",
293-
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RNImagePickerPrivacyInfo.bundle",
294292
);
295293
runOnlyForDeploymentPostprocessing = 0;
296294
shellPath = /bin/sh;
@@ -305,12 +303,10 @@
305303
inputPaths = (
306304
"${PODS_ROOT}/Target Support Files/Pods-speechtotext/Pods-speechtotext-frameworks.sh",
307305
"${PODS_XCFRAMEWORKS_BUILD_DIR}/hermes-engine/Pre-built/hermes.framework/hermes",
308-
"${PODS_XCFRAMEWORKS_BUILD_DIR}/react-native-executorch/ExecutorchLib.framework/ExecutorchLib",
309306
);
310307
name = "[CP] Embed Pods Frameworks";
311308
outputPaths = (
312309
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hermes.framework",
313-
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ExecutorchLib.framework",
314310
);
315311
runOnlyForDeploymentPostprocessing = 0;
316312
shellPath = /bin/sh;

0 commit comments

Comments
 (0)