react-native-srschat 0.1.43 → 0.1.44
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -0
- package/lib/commonjs/utils/audioRecorder.js +49 -21
- package/lib/commonjs/utils/audioRecorder.js.map +1 -1
- package/lib/module/utils/audioRecorder.js +50 -22
- package/lib/module/utils/audioRecorder.js.map +1 -1
- package/lib/typescript/utils/audioRecorder.d.ts.map +1 -1
- package/package.json +5 -5
- package/src/utils/audioRecorder.js +52 -27
package/README.md
CHANGED
|
@@ -70,11 +70,29 @@ Add all wanted permissions to your app android/app/src/main/AndroidManifest.xml
|
|
|
70
70
|
|
|
71
71
|
<uses-permission android:name="android.permission.RECORD_AUDIO" />
|
|
72
72
|
|
|
73
|
+
<queries>
|
|
74
|
+
<package android:name="com.google.android.googlequicksearchbox"/>
|
|
75
|
+
</queries>
|
|
76
|
+
<queries>
|
|
77
|
+
<intent>
|
|
78
|
+
<action android:name="android.speech.RecognitionService"/>
|
|
79
|
+
</intent>
|
|
80
|
+
</queries>
|
|
81
|
+
<queries>
|
|
82
|
+
<intent>
|
|
83
|
+
<action android:name="android.speech.SpeechRecognizer"/>
|
|
84
|
+
</intent>
|
|
85
|
+
</queries>
|
|
86
|
+
|
|
73
87
|
<!-- … -->
|
|
74
88
|
|
|
75
89
|
</manifest>
|
|
76
90
|
```
|
|
77
91
|
|
|
92
|
+
Note:Even after all the permissions are correct in Android, there is one last thing to make sure this libray is working fine on Android. Please make sure the device has Google Speech Recognizing Engine such as com.google.android.googlequicksearchbox.
|
|
93
|
+
|
|
94
|
+
Please ask users to install Google Search App (Google App).
|
|
95
|
+
|
|
78
96
|
### Example Use
|
|
79
97
|
|
|
80
98
|
```
|
|
@@ -12,7 +12,7 @@ exports.setPermissionStatusHandlers = setPermissionStatusHandlers;
|
|
|
12
12
|
exports.startRecording = startRecording;
|
|
13
13
|
exports.stopRecording = stopRecording;
|
|
14
14
|
var _reactNative = require("react-native");
|
|
15
|
-
var _voice = _interopRequireDefault(require("@react-native-
|
|
15
|
+
var _voice = _interopRequireDefault(require("@react-native-voice/voice"));
|
|
16
16
|
var _reactNativePermissions = require("react-native-permissions");
|
|
17
17
|
var _useAsyncStorage = _interopRequireDefault(require("../hooks/useAsyncStorage"));
|
|
18
18
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
@@ -42,6 +42,12 @@ async function initVoice(onResult) {
|
|
|
42
42
|
resultCallback = onResult;
|
|
43
43
|
finalResult = '';
|
|
44
44
|
|
|
45
|
+
// Check if Voice module is available
|
|
46
|
+
if (!_voice.default) {
|
|
47
|
+
console.error('Voice module is not available');
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
|
|
45
51
|
// First check if speech recognition is available
|
|
46
52
|
const isAvailable = await _voice.default.isAvailable();
|
|
47
53
|
if (!isAvailable) {
|
|
@@ -80,7 +86,8 @@ async function initVoice(onResult) {
|
|
|
80
86
|
};
|
|
81
87
|
_voice.default.onSpeechError = async e => {
|
|
82
88
|
var _e$error, _e$error2;
|
|
83
|
-
console.error('onSpeechError: ', e);
|
|
89
|
+
// console.error('onSpeechError: ', e);
|
|
90
|
+
|
|
84
91
|
if (silenceTimer) {
|
|
85
92
|
clearTimeout(silenceTimer);
|
|
86
93
|
silenceTimer = null;
|
|
@@ -91,14 +98,13 @@ async function initVoice(onResult) {
|
|
|
91
98
|
await cleanupVoiceSession();
|
|
92
99
|
|
|
93
100
|
// Only send error to callback if it's not a "No speech detected" error
|
|
94
|
-
if (!isNoSpeechError) {
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
}
|
|
101
|
+
// if (!isNoSpeechError) {
|
|
102
|
+
// resultCallback(null, e.error?.message || 'Speech recognition error');
|
|
103
|
+
// } else {
|
|
104
|
+
// console.log('No speech detected, ignoring error');
|
|
105
|
+
// // Optionally, call the callback with null parameters or a special indicator
|
|
106
|
+
// resultCallback(null, null); // This won't trigger an error alert in the component
|
|
107
|
+
// }
|
|
102
108
|
};
|
|
103
109
|
_voice.default.onSpeechResults = e => {
|
|
104
110
|
console.log('onSpeechResults: ', e);
|
|
@@ -157,6 +163,12 @@ const cleanupVoiceSession = async () => {
|
|
|
157
163
|
silenceTimer = null;
|
|
158
164
|
}
|
|
159
165
|
try {
|
|
166
|
+
// Check if Voice module is available
|
|
167
|
+
if (!_voice.default) {
|
|
168
|
+
console.log('Voice module not available during cleanup');
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
|
|
160
172
|
// First try to stop if still recognizing
|
|
161
173
|
const isRecognizing = await _voice.default.isRecognizing();
|
|
162
174
|
if (isRecognizing) {
|
|
@@ -182,7 +194,9 @@ const cleanupVoiceSession = async () => {
|
|
|
182
194
|
console.error('Error in cleanupVoiceSession:', error);
|
|
183
195
|
// Final attempt to destroy on error
|
|
184
196
|
try {
|
|
185
|
-
|
|
197
|
+
if (_voice.default) {
|
|
198
|
+
await _voice.default.destroy();
|
|
199
|
+
}
|
|
186
200
|
} catch (e) {
|
|
187
201
|
console.error('Final destroy attempt failed:', e);
|
|
188
202
|
}
|
|
@@ -191,6 +205,12 @@ const cleanupVoiceSession = async () => {
|
|
|
191
205
|
};
|
|
192
206
|
async function startRecording() {
|
|
193
207
|
try {
|
|
208
|
+
// Check if Voice module is available
|
|
209
|
+
if (!_voice.default) {
|
|
210
|
+
console.error('Voice module is not available');
|
|
211
|
+
return false;
|
|
212
|
+
}
|
|
213
|
+
|
|
194
214
|
// Ensure cleanup of any existing session
|
|
195
215
|
await cleanupVoiceSession();
|
|
196
216
|
const hasPermission = await requestAudioPermission();
|
|
@@ -209,7 +229,7 @@ async function startRecording() {
|
|
|
209
229
|
}
|
|
210
230
|
async function stopRecording() {
|
|
211
231
|
try {
|
|
212
|
-
if (!isCurrentlyRecording) return;
|
|
232
|
+
if (!isCurrentlyRecording || !_voice.default) return;
|
|
213
233
|
|
|
214
234
|
// Set this first to prevent race conditions
|
|
215
235
|
isCurrentlyRecording = false;
|
|
@@ -245,6 +265,7 @@ async function stopRecording() {
|
|
|
245
265
|
}
|
|
246
266
|
async function cancelRecording() {
|
|
247
267
|
try {
|
|
268
|
+
if (!_voice.default) return;
|
|
248
269
|
await _voice.default.cancel();
|
|
249
270
|
await cleanupVoiceSession();
|
|
250
271
|
} catch (error) {
|
|
@@ -279,19 +300,20 @@ async function requestAudioPermission() {
|
|
|
279
300
|
}
|
|
280
301
|
async function requestAndroidPermission() {
|
|
281
302
|
try {
|
|
282
|
-
//
|
|
303
|
+
// Request microphone permission
|
|
304
|
+
const micPermission = await (0, _reactNativePermissions.request)(_reactNativePermissions.PERMISSIONS.ANDROID.RECORD_AUDIO);
|
|
305
|
+
if (micPermission !== _reactNativePermissions.RESULTS.GRANTED) {
|
|
306
|
+
console.log('Microphone permission denied');
|
|
307
|
+
return false;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
// Skip checking speech recognition services which is causing errors
|
|
283
311
|
const services = await _voice.default.getSpeechRecognitionServices();
|
|
284
312
|
if (!services || services.length === 0) {
|
|
285
313
|
console.error('No speech recognition services available');
|
|
286
314
|
return false;
|
|
287
315
|
}
|
|
288
|
-
|
|
289
|
-
title: 'Microphone Permission',
|
|
290
|
-
message: 'This app needs access to your microphone for voice recognition.',
|
|
291
|
-
buttonPositive: 'OK',
|
|
292
|
-
buttonNegative: 'Cancel'
|
|
293
|
-
});
|
|
294
|
-
return granted === _reactNative.PermissionsAndroid.RESULTS.GRANTED;
|
|
316
|
+
return true;
|
|
295
317
|
} catch (error) {
|
|
296
318
|
console.error('Error requesting Android permission:', error);
|
|
297
319
|
return false;
|
|
@@ -326,13 +348,19 @@ function resetStoredPermission() {
|
|
|
326
348
|
return false;
|
|
327
349
|
}
|
|
328
350
|
function cleanup() {
|
|
351
|
+
if (!_voice.default) {
|
|
352
|
+
console.log('Voice module not available during cleanup');
|
|
353
|
+
return;
|
|
354
|
+
}
|
|
329
355
|
_voice.default.destroy().then(() => {
|
|
330
356
|
_voice.default.removeAllListeners();
|
|
331
357
|
cleanupVoiceSession();
|
|
332
358
|
}).catch(error => {
|
|
333
359
|
console.error('Error in cleanup:', error);
|
|
334
360
|
// Try one more time
|
|
335
|
-
_voice.default
|
|
361
|
+
if (_voice.default) {
|
|
362
|
+
_voice.default.destroy().catch(e => console.error('Final cleanup attempt failed:', e));
|
|
363
|
+
}
|
|
336
364
|
});
|
|
337
365
|
}
|
|
338
366
|
//# sourceMappingURL=audioRecorder.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_reactNative","require","_voice","_interopRequireDefault","_reactNativePermissions","_useAsyncStorage","e","__esModule","default","resultCallback","silenceTimer","isCurrentlyRecording","finalResult","SILENCE_DURATION","PERMISSION_STORAGE_KEY","permissionStatusGetter","permissionStatusSetter","setPermissionStatusHandlers","getter","setter","initVoice","onResult","
|
|
1
|
+
{"version":3,"names":["_reactNative","require","_voice","_interopRequireDefault","_reactNativePermissions","_useAsyncStorage","e","__esModule","default","resultCallback","silenceTimer","isCurrentlyRecording","finalResult","SILENCE_DURATION","PERMISSION_STORAGE_KEY","permissionStatusGetter","permissionStatusSetter","setPermissionStatusHandlers","getter","setter","initVoice","onResult","Voice","console","error","isAvailable","onSpeechStart","log","clearTimeout","onSpeechRecognized","isFinal","handleFinalResult","onSpeechEnd","onSpeechError","_e$error","_e$error2","isNoSpeechError","code","message","includes","cleanupVoiceSession","onSpeechResults","value","length","handleSilenceDetection","onSpeechPartialResults","Platform","OS","onSpeechVolumeChanged","setTimeout","stopRecording","isRecognizing","stop","Promise","resolve","destroy","stillRecognizing","startRecording","hasPermission","requestAudioPermission","start","cancelRecording","cancel","storedPermission","permissionResult","requestAndroidPermission","requestIOSPermission","micPermission","request","PERMISSIONS","ANDROID","RECORD_AUDIO","RESULTS","GRANTED","services","getSpeechRecognitionServices","IOS","MICROPHONE","speechPermission","SPEECH_RECOGNITION","resetStoredPermission","cleanup","then","removeAllListeners","catch"],"sourceRoot":"../../../src","sources":["utils/audioRecorder.js"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// audioRecorder.js
|
|
2
2
|
|
|
3
|
-
import { Platform
|
|
4
|
-
import Voice from '@react-native-
|
|
3
|
+
import { Platform } from 'react-native';
|
|
4
|
+
import Voice from '@react-native-voice/voice';
|
|
5
5
|
import { check, PERMISSIONS, request, RESULTS } from 'react-native-permissions';
|
|
6
6
|
import useAsyncStorage from '../hooks/useAsyncStorage';
|
|
7
7
|
let resultCallback = null;
|
|
@@ -28,6 +28,12 @@ export async function initVoice(onResult) {
|
|
|
28
28
|
resultCallback = onResult;
|
|
29
29
|
finalResult = '';
|
|
30
30
|
|
|
31
|
+
// Check if Voice module is available
|
|
32
|
+
if (!Voice) {
|
|
33
|
+
console.error('Voice module is not available');
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
|
|
31
37
|
// First check if speech recognition is available
|
|
32
38
|
const isAvailable = await Voice.isAvailable();
|
|
33
39
|
if (!isAvailable) {
|
|
@@ -66,7 +72,8 @@ export async function initVoice(onResult) {
|
|
|
66
72
|
};
|
|
67
73
|
Voice.onSpeechError = async e => {
|
|
68
74
|
var _e$error, _e$error2;
|
|
69
|
-
console.error('onSpeechError: ', e);
|
|
75
|
+
// console.error('onSpeechError: ', e);
|
|
76
|
+
|
|
70
77
|
if (silenceTimer) {
|
|
71
78
|
clearTimeout(silenceTimer);
|
|
72
79
|
silenceTimer = null;
|
|
@@ -77,14 +84,13 @@ export async function initVoice(onResult) {
|
|
|
77
84
|
await cleanupVoiceSession();
|
|
78
85
|
|
|
79
86
|
// Only send error to callback if it's not a "No speech detected" error
|
|
80
|
-
if (!isNoSpeechError) {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
}
|
|
87
|
+
// if (!isNoSpeechError) {
|
|
88
|
+
// resultCallback(null, e.error?.message || 'Speech recognition error');
|
|
89
|
+
// } else {
|
|
90
|
+
// console.log('No speech detected, ignoring error');
|
|
91
|
+
// // Optionally, call the callback with null parameters or a special indicator
|
|
92
|
+
// resultCallback(null, null); // This won't trigger an error alert in the component
|
|
93
|
+
// }
|
|
88
94
|
};
|
|
89
95
|
Voice.onSpeechResults = e => {
|
|
90
96
|
console.log('onSpeechResults: ', e);
|
|
@@ -143,6 +149,12 @@ const cleanupVoiceSession = async () => {
|
|
|
143
149
|
silenceTimer = null;
|
|
144
150
|
}
|
|
145
151
|
try {
|
|
152
|
+
// Check if Voice module is available
|
|
153
|
+
if (!Voice) {
|
|
154
|
+
console.log('Voice module not available during cleanup');
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
|
|
146
158
|
// First try to stop if still recognizing
|
|
147
159
|
const isRecognizing = await Voice.isRecognizing();
|
|
148
160
|
if (isRecognizing) {
|
|
@@ -168,7 +180,9 @@ const cleanupVoiceSession = async () => {
|
|
|
168
180
|
console.error('Error in cleanupVoiceSession:', error);
|
|
169
181
|
// Final attempt to destroy on error
|
|
170
182
|
try {
|
|
171
|
-
|
|
183
|
+
if (Voice) {
|
|
184
|
+
await Voice.destroy();
|
|
185
|
+
}
|
|
172
186
|
} catch (e) {
|
|
173
187
|
console.error('Final destroy attempt failed:', e);
|
|
174
188
|
}
|
|
@@ -177,6 +191,12 @@ const cleanupVoiceSession = async () => {
|
|
|
177
191
|
};
|
|
178
192
|
export async function startRecording() {
|
|
179
193
|
try {
|
|
194
|
+
// Check if Voice module is available
|
|
195
|
+
if (!Voice) {
|
|
196
|
+
console.error('Voice module is not available');
|
|
197
|
+
return false;
|
|
198
|
+
}
|
|
199
|
+
|
|
180
200
|
// Ensure cleanup of any existing session
|
|
181
201
|
await cleanupVoiceSession();
|
|
182
202
|
const hasPermission = await requestAudioPermission();
|
|
@@ -195,7 +215,7 @@ export async function startRecording() {
|
|
|
195
215
|
}
|
|
196
216
|
export async function stopRecording() {
|
|
197
217
|
try {
|
|
198
|
-
if (!isCurrentlyRecording) return;
|
|
218
|
+
if (!isCurrentlyRecording || !Voice) return;
|
|
199
219
|
|
|
200
220
|
// Set this first to prevent race conditions
|
|
201
221
|
isCurrentlyRecording = false;
|
|
@@ -231,6 +251,7 @@ export async function stopRecording() {
|
|
|
231
251
|
}
|
|
232
252
|
export async function cancelRecording() {
|
|
233
253
|
try {
|
|
254
|
+
if (!Voice) return;
|
|
234
255
|
await Voice.cancel();
|
|
235
256
|
await cleanupVoiceSession();
|
|
236
257
|
} catch (error) {
|
|
@@ -265,19 +286,20 @@ export async function requestAudioPermission() {
|
|
|
265
286
|
}
|
|
266
287
|
async function requestAndroidPermission() {
|
|
267
288
|
try {
|
|
268
|
-
//
|
|
289
|
+
// Request microphone permission
|
|
290
|
+
const micPermission = await request(PERMISSIONS.ANDROID.RECORD_AUDIO);
|
|
291
|
+
if (micPermission !== RESULTS.GRANTED) {
|
|
292
|
+
console.log('Microphone permission denied');
|
|
293
|
+
return false;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
// Skip checking speech recognition services which is causing errors
|
|
269
297
|
const services = await Voice.getSpeechRecognitionServices();
|
|
270
298
|
if (!services || services.length === 0) {
|
|
271
299
|
console.error('No speech recognition services available');
|
|
272
300
|
return false;
|
|
273
301
|
}
|
|
274
|
-
|
|
275
|
-
title: 'Microphone Permission',
|
|
276
|
-
message: 'This app needs access to your microphone for voice recognition.',
|
|
277
|
-
buttonPositive: 'OK',
|
|
278
|
-
buttonNegative: 'Cancel'
|
|
279
|
-
});
|
|
280
|
-
return granted === PermissionsAndroid.RESULTS.GRANTED;
|
|
302
|
+
return true;
|
|
281
303
|
} catch (error) {
|
|
282
304
|
console.error('Error requesting Android permission:', error);
|
|
283
305
|
return false;
|
|
@@ -312,13 +334,19 @@ export function resetStoredPermission() {
|
|
|
312
334
|
return false;
|
|
313
335
|
}
|
|
314
336
|
export function cleanup() {
|
|
337
|
+
if (!Voice) {
|
|
338
|
+
console.log('Voice module not available during cleanup');
|
|
339
|
+
return;
|
|
340
|
+
}
|
|
315
341
|
Voice.destroy().then(() => {
|
|
316
342
|
Voice.removeAllListeners();
|
|
317
343
|
cleanupVoiceSession();
|
|
318
344
|
}).catch(error => {
|
|
319
345
|
console.error('Error in cleanup:', error);
|
|
320
346
|
// Try one more time
|
|
321
|
-
Voice
|
|
347
|
+
if (Voice) {
|
|
348
|
+
Voice.destroy().catch(e => console.error('Final cleanup attempt failed:', e));
|
|
349
|
+
}
|
|
322
350
|
});
|
|
323
351
|
}
|
|
324
352
|
//# sourceMappingURL=audioRecorder.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Platform","
|
|
1
|
+
{"version":3,"names":["Platform","Voice","check","PERMISSIONS","request","RESULTS","useAsyncStorage","resultCallback","silenceTimer","isCurrentlyRecording","finalResult","SILENCE_DURATION","PERMISSION_STORAGE_KEY","permissionStatusGetter","permissionStatusSetter","setPermissionStatusHandlers","getter","setter","initVoice","onResult","console","error","isAvailable","onSpeechStart","e","log","clearTimeout","onSpeechRecognized","isFinal","handleFinalResult","onSpeechEnd","onSpeechError","_e$error","_e$error2","isNoSpeechError","code","message","includes","cleanupVoiceSession","onSpeechResults","value","length","handleSilenceDetection","onSpeechPartialResults","OS","onSpeechVolumeChanged","setTimeout","stopRecording","isRecognizing","stop","Promise","resolve","destroy","stillRecognizing","startRecording","hasPermission","requestAudioPermission","start","cancelRecording","cancel","storedPermission","permissionResult","requestAndroidPermission","requestIOSPermission","micPermission","ANDROID","RECORD_AUDIO","GRANTED","services","getSpeechRecognitionServices","IOS","MICROPHONE","speechPermission","SPEECH_RECOGNITION","resetStoredPermission","cleanup","then","removeAllListeners","catch"],"sourceRoot":"../../../src","sources":["utils/audioRecorder.js"],"mappings":"AAAA;;AAEA,SAASA,QAAQ,QAAQ,cAAc;AACvC,OAAOC,KAAK,MAAM,2BAA2B;AAC7C,SAASC,KAAK,EAAEC,WAAW,EAAEC,OAAO,EAAEC,OAAO,QAAQ,0BAA0B;AAC/E,OAAOC,eAAe,MAAM,0BAA0B;AAEtD,IAAIC,cAAc,GAAG,IAAI;AACzB,IAAIC,YAAY,GAAG,IAAI;AACvB,IAAIC,oBAAoB,GAAG,KAAK;AAChC,IAAIC,WAAW,GAAG,EAAE;AACpB,MAAMC,gBAAgB,GAAG,IAAI,CAAC,CAAC;;AAE/B;AACA,MAAMC,sBAAsB,GAAG,0BAA0B;;AAEzD;AACA;AACA,IAAIC,sBAAsB,GAAG,IAAI;AACjC,IAAIC,sBAAsB,GAAG,IAAI;AAEjC,OAAO,SAASC,2BAA2BA,CAACC,MAAM,EAAEC,MAAM,EAAE;EAC1DJ,sBAAsB,GAAGG,MAAM;EAC/BF,sBAAsB,GAAGG,MAAM;AACjC;;AAEA;AACA,OAAO,eAAeC,SAASA,CAACC,QAAQ,EAAE;EACxC,IAAI;IACFZ,cAAc,GAAGY,QAAQ;IACzBT,WAAW,GAAG,EAAE;;IAEhB;IACA,IAAI,CAACT,KAAK,EAAE;MACVmB,OAAO,CAACC,KAAK,CAAC,+BAA+B,CAAC;MAC9C,OAAO,KAAK;IACd;;IAEA;IACA,MAAMC,WAAW,GAAG,MAAMrB,KAAK,CAACqB,WAAW,CAAC,CAAC;IAC7C,IAAI,CAACA,WAAW,EAAE;MAChBF,OAAO,CAACC,KAAK,CAAC,oDAAoD,CAAC;MACnE,OAAO,KAAK;IACd;;IAEA;IACApB,KAAK,CAACsB,aAAa,GAAIC,CAAC,IAAK;MAC3BJ,OAAO,CAACK,GAAG,CAAC,iBAAiB,EAAED,CAAC,CAAC;MACjCf,oBAAoB,GAAG,IAAI;MAC3BC,WAAW,GAAG,EAAE;MAEhB,IAAIF,YAAY,EAAE;QAChBkB,YAAY,CAAClB,YAAY,CAAC;QAC1BA,YAAY,GAAG,IAAI;MACrB;IACF,CAAC;IAEDP,KAAK,CAAC0B,kBAAkB,GAAIH,CAAC,IAAK;MAChCJ,OAAO,CAACK,GAAG,CAAC,sBAAsB,EAAED,CAAC,CAAC;MACtC,IAAIA,CAAC,CAACI,OAAO,EAAE;QACbR,OAAO,CAACK,GAAG,CAAC,0BAA0B,CAAC;QACvCI,iBAAiB,CAAC,CAAC;MACrB;IACF,CAAC;IAED5B,KAAK,CAAC6B,WAAW,GAAG,MAAON,CAAC,IAAK;MAC/BJ,OAAO,CAACK,GAAG,CAAC,eAAe,EAAED,CAAC,CAAC;MAE/B,IAAIhB,YAAY,EAAE;QAChBkB,YAAY,CAAClB,YAAY,CAAC;QAC1BA,YAAY,GAAG,IAAI;MACrB;;MAEA;MACA,IAAIC,oBAAoB,EAAE;QACxB,MAAMoB,iBAAiB,CAAC,CAAC;MAC3B;IACF,CAAC;IAED5B,KAAK,CAAC8B,aAAa,GAAG,MAAOP,CAAC,IAAK;MAAA,IAAAQ,QAAA,EAAAC,SAAA;MACjC;;MAEA,IAAIzB,YAAY,EAAE;QAChBkB,YAAY,CAAClB,YAAY,CAAC;QAC1BA,YAAY,GAAG,IAAI;MACrB;;MAEA;MACA,MAAM0B,eAAe,GAAG,EAAAF,QAAA,GAAAR,CAAC,CAACH,KAAK,cAAAW,QAAA,uBAAPA,QAAA,CAASG,IAAI,MAAK,kBAAkB,MAAAF,SAAA,GACpCT,CAAC,CAACH,KAAK,cAAAY,SAAA,gBAAAA,SAAA,GAAPA,SAAA,CAASG,OAAO,cAAAH,SAAA,uBAAhBA,SAAA,CAAkBI,QAAQ,CAAC,oBAAoB,CAAC;MAExE,MAAMC,mBAAmB,CAAC,CAAC;;MAE3B;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IACF,CAAC;IAEDrC,KAAK,CAACsC,eAAe,GAAIf,CAAC,IAAK;MAC7BJ,OAAO,CAACK,GAAG,CAAC,mBAAmB,EAAED,CAAC,CAAC;MACnC,IAAIA,CAAC,CAACgB,KAAK,IAAIhB,CAAC,CAACgB,KAAK,CAACC,MAAM,GAAG,CAAC,EAAE;QACjC/B,WAAW,GAAGc,CAAC,CAACgB,KAAK,CAAC,CAAC,CAAC;QACxBE,sBAAsB,CAAC,CAAC;MAC1B;IACF,CAAC;IAEDzC,KAAK,CAAC0C,sBAAsB,GAAInB,CAAC,IAAK;MACpCJ,OAAO,CAACK,GAAG,CAAC,0BAA0B,EAAED,CAAC,CAAC;MAE1C,IAAIhB,YAAY,EAAE;QAChBkB,YAAY,CAAClB,YAAY,CAAC;MAC5B;MAEA,IAAIgB,CAAC,CAACgB,KAAK,IAAIhB,CAAC,CAACgB,KAAK,CAACC,MAAM,GAAG,CAAC,EAAE;QACjC/B,WAAW,GAAGc,CAAC,CAACgB,KAAK,CAAC,CAAC,CAAC;QACxBE,sBAAsB,CAAC,CAAC;MAC1B;IACF,CAAC;IAED,IAAI1C,QAAQ,CAAC4C,EAAE,KAAK,SAAS,EAAE;MAC7B3C,KAAK,CAAC4C,qBAAqB,GAAIrB,CAAC,IAAK;QACnCJ,OAAO,CAACK,GAAG,CAAC,yBAAyB,EAAED,CAAC,CAAC;MAC3C,CAAC;IACH;IAEA,OAAO,IAAI;EACb,CAAC,CAAC,OAAOH,KAAK,EAAE;IACdD,OAAO,CAACC,KAAK,CAAC,2BAA2B,EAAEA,KAAK,CAAC;IACjD,OAAO,KAAK;EACd;AACF;AAEA,MAAMqB,sBAAsB,GAAGA,CAAA,KAAM;EACnC,IAAIlC,YAAY,EAAE;IAChBkB,YAAY,CAAClB,YAAY,CAAC;EAC5B;EAEAA,YAAY,GAAGsC,UAAU,CAAC,YAAY;IACpC,IAAIrC,oBAAoB,EAAE;MACxB,MAAMoB,iBAAiB,CAAC,CAAC;IAC3B;EACF,CAAC,EAAElB,gBAAgB,CAAC;AACtB,CAAC;AAED,MAAMkB,iBAAiB,GAAG,MAAAA,CAAA,KAAY;EACpC,IAAI,CAACpB,oBAAoB,EAAE;EAE3B,IAAIC,WAAW,EAAE;IACfH,cAAc,CAACG,WAAW,CAAC;EAC7B;;EAEA;EACA,MAAMqC,aAAa,CAAC,CAAC;;EAErB;EACA,MAAMT,mBAAmB,CAAC,CAAC;AAC7B,CAAC;AAED,MAAMA,mBAAmB,GAAG,MAAAA,CAAA,KAAY;EACtC7B,oBAAoB,GAAG,KAAK;EAE5B,IAAID,YAAY,EAAE;IAChBkB,YAAY,CAAClB,YAAY,CAAC;IAC1BA,YAAY,GAAG,IAAI;EACrB;EAEA,IAAI;IACF;IACA,IAAI,CAACP,KAAK,EAAE;MACVmB,OAAO,CAACK,GAAG,CAAC,2CAA2C,CAAC;MACxD;IACF;;IAEA;IACA,MAAMuB,aAAa,GAAG,MAAM/C,KAAK,CAAC+C,aAAa,CAAC,CAAC;IACjD,IAAIA,aAAa,EAAE;MACjB,IAAI;QACF,MAAM/C,KAAK,CAACgD,IAAI,CAAC,CAAC;QAClB,MAAM,IAAIC,OAAO,CAACC,OAAO,IAAIL,UAAU,CAACK,OAAO,EAAE,GAAG,CAAC,CAAC;MACxD,CAAC,CAAC,OAAO3B,CAAC,EAAE;QACVJ,OAAO,CAACC,KAAK,CAAC,4BAA4B,EAAEG,CAAC,CAAC;MAChD;IACF;;IAEA;IACA,MAAMvB,KAAK,CAACmD,OAAO,CAAC,CAAC;IACrB,MAAM,IAAIF,OAAO,CAACC,OAAO,IAAIL,UAAU,CAACK,OAAO,EAAE,GAAG,CAAC,CAAC;;IAEtD;IACA,MAAME,gBAAgB,GAAG,MAAMpD,KAAK,CAAC+C,aAAa,CAAC,CAAC;IACpD,IAAIK,gBAAgB,EAAE;MACpB,MAAMpD,KAAK,CAACmD,OAAO,CAAC,CAAC;MACrB,MAAM,IAAIF,OAAO,CAACC,OAAO,IAAIL,UAAU,CAACK,OAAO,EAAE,GAAG,CAAC,CAAC;IACxD;EACF,CAAC,CAAC,OAAO9B,KAAK,EAAE;IACdD,OAAO,CAACC,KAAK,CAAC,+BAA+B,EAAEA,KAAK,CAAC;IACrD;IACA,IAAI;MACF,IAAIpB,KAAK,EAAE;QACT,MAAMA,KAAK,CAACmD,OAAO,CAAC,CAAC;MACvB;IACF,CAAC,CAAC,OAAO5B,CAAC,EAAE;MACVJ,OAAO,CAACC,KAAK,CAAC,+BAA+B,EAAEG,CAAC,CAAC;IACnD;EACF;EAEAd,WAAW,GAAG,EAAE;AAClB,CAAC;AAED,OAAO,eAAe4C,cAAcA,CAAA,EAAG;EACrC,IAAI;IACF;IACA,IAAI,CAACrD,KAAK,EAAE;MACVmB,OAAO,CAACC,KAAK,CAAC,+BAA+B,CAAC;MAC9C,OAAO,KAAK;IACd;;IAEA;IACA,MAAMiB,mBAAmB,CAAC,CAAC;IAE3B,MAAMiB,aAAa,GAAG,MAAMC,sBAAsB,CAAC,CAAC;IACpD,IAAI,CAACD,aAAa,EAAE;MAClBnC,OAAO,CAACC,KAAK,CAAC,+BAA+B,CAAC;MAC9C,OAAO,KAAK;IACd;IAEA,MAAMpB,KAAK,CAACwD,KAAK,CAAC,OAAO,CAAC;IAC1BhD,oBAAoB,GAAG,IAAI;IAC3B,OAAO,IAAI;EACb,CAAC,CAAC,OAAOY,KAAK,EAAE;IACdD,OAAO,CAACC,KAAK,CAAC,mCAAmC,EAAEA,KAAK,CAAC;IACzD,MAAMiB,mBAAmB,CAAC,CAAC;IAC3B,OAAO,KAAK;EACd;AACF;AAEA,OAAO,eAAeS,aAAaA,CAAA,EAAG;EACpC,IAAI;IACF,IAAI,CAACtC,oBAAoB,IAAI,CAACR,KAAK,EAAE;;IAErC;IACAQ,oBAAoB,GAAG,KAAK;IAE5B,IAAID,YAAY,EAAE;MAChBkB,YAAY,CAAClB,YAAY,CAAC;MAC1BA,YAAY,GAAG,IAAI;IACrB;;IAEA;IACA,IAAI;MACF,MAAMP,KAAK,CAACgD,IAAI,CAAC,CAAC;MAClB;MACA,MAAM,IAAIC,OAAO,CAACC,OAAO,IAAIL,UAAU,CAACK,OAAO,EAAE,GAAG,CAAC,CAAC;IACxD,CAAC,CAAC,OAAO9B,KAAK,EAAE;MACdD,OAAO,CAACC,KAAK,CAAC,uBAAuB,EAAEA,KAAK,CAAC;IAC/C;;IAEA;IACA,IAAI;MACF,MAAMpB,KAAK,CAACmD,OAAO,CAAC,CAAC;MACrB,MAAM,IAAIF,OAAO,CAACC,OAAO,IAAIL,UAAU,CAACK,OAAO,EAAE,GAAG,CAAC,CAAC;IACxD,CAAC,CAAC,OAAO9B,KAAK,EAAE;MACdD,OAAO,CAACC,KAAK,CAAC,yBAAyB,EAAEA,KAAK,CAAC;IACjD;;IAEA;IACA,MAAMiB,mBAAmB,CAAC,CAAC;EAC7B,CAAC,CAAC,OAAOjB,KAAK,EAAE;IACdD,OAAO,CAACC,KAAK,CAAC,yBAAyB,EAAEA,KAAK,CAAC;IAC/C;IACA,MAAMiB,mBAAmB,CAAC,CAAC;EAC7B;AACF;AAEA,OAAO,eAAeoB,eAAeA,CAAA,EAAG;EACtC,IAAI;IACF,IAAI,CAACzD,KAAK,EAAE;IACZ,MAAMA,KAAK,CAAC0D,MAAM,CAAC,CAAC;IACpB,MAAMrB,mBAAmB,CAAC,CAAC;EAC7B,CAAC,CAAC,OAAOjB,KAAK,EAAE;IACdD,OAAO,CAACC,KAAK,CAAC,oCAAoC,EAAEA,KAAK,CAAC;IAC1D,MAAMiB,mBAAmB,CAAC,CAAC;EAC7B;AACF;AAEA,OAAO,eAAekB,sBAAsBA,CAAA,EAAG;EAC7C,IAAI;IACF;IACA,MAAMI,gBAAgB,GAAG/C,sBAAsB,GAAGA,sBAAsB,CAAC,CAAC,GAAG,IAAI;IAEjF,IAAI+C,gBAAgB,KAAK,QAAQ,EAAE;MACjCxC,OAAO,CAACK,GAAG,CAAC,sCAAsC,CAAC;MACnD,OAAO,KAAK;IACd;IAEA,IAAIoC,gBAAgB,GAAG,KAAK;IAC5B,IAAI7D,QAAQ,CAAC4C,EAAE,KAAK,SAAS,EAAE;MAC7BiB,gBAAgB,GAAG,MAAMC,wBAAwB,CAAC,CAAC;IACrD,CAAC,MAAM,IAAI9D,QAAQ,CAAC4C,EAAE,KAAK,KAAK,EAAE;MAChCiB,gBAAgB,GAAG,MAAME,oBAAoB,CAAC,CAAC;IACjD;;IAEA;IACA,IAAIjD,sBAAsB,EAAE;MAC1BA,sBAAsB,CAAC+C,gBAAgB,GAAG,SAAS,GAAG,QAAQ,CAAC;IACjE;IAEA,OAAOA,gBAAgB;EACzB,CAAC,CAAC,OAAOxC,KAAK,EAAE;IACdD,OAAO,CAACC,KAAK,CAAC,mCAAmC,EAAEA,KAAK,CAAC;IACzD,OAAO,KAAK;EACd;AACF;AAEA,eAAeyC,wBAAwBA,CAAA,EAAG;EACxC,IAAI;IAGF;IACA,MAAME,aAAa,GAAG,MAAM5D,OAAO,CAACD,WAAW,CAAC8D,OAAO,CAACC,YAAY,CAAC;IACrE,IAAIF,aAAa,KAAK3D,OAAO,CAAC8D,OAAO,EAAE;MACrC/C,OAAO,CAACK,GAAG,CAAC,8BAA8B,CAAC;MAC3C,OAAO,KAAK;IACd;;IAEI;IACJ,MAAM2C,QAAQ,GAAG,MAAMnE,KAAK,CAACoE,4BAA4B,CAAC,CAAC;IAC3D,IAAI,CAACD,QAAQ,IAAIA,QAAQ,CAAC3B,MAAM,KAAK,CAAC,EAAE;MACtCrB,OAAO,CAACC,KAAK,CAAC,0CAA0C,CAAC;MACzD,OAAO,KAAK;IACd;IACA,OAAO,IAAI;EACb,CAAC,CAAC,OAAOA,KAAK,EAAE;IACdD,OAAO,CAACC,KAAK,CAAC,sCAAsC,EAAEA,KAAK,CAAC;IAC5D,OAAO,KAAK;EACd;AACF;AAEA,eAAe0C,oBAAoBA,CAAA,EAAG;EACpC,IAAI;IACF;IACA,MAAMC,aAAa,GAAG,MAAM5D,OAAO,CAACD,WAAW,CAACmE,GAAG,CAACC,UAAU,CAAC;IAC/D,IAAIP,aAAa,KAAK3D,OAAO,CAAC8D,OAAO,EAAE;MACrC/C,OAAO,CAACK,GAAG,CAAC,8BAA8B,CAAC;MAC3C,OAAO,KAAK;IACd;;IAEA;IACA,MAAM+C,gBAAgB,GAAG,MAAMpE,OAAO,CAACD,WAAW,CAACmE,GAAG,CAACG,kBAAkB,CAAC;IAC1E,IAAID,gBAAgB,KAAKnE,OAAO,CAAC8D,OAAO,EAAE;MACxC/C,OAAO,CAACK,GAAG,CAAC,sCAAsC,CAAC;MACnD,OAAO,KAAK;IACd;IAEA,OAAO,IAAI;EACb,CAAC,CAAC,OAAOJ,KAAK,EAAE;IACdD,OAAO,CAACC,KAAK,CAAC,mCAAmC,EAAEA,KAAK,CAAC;IACzD,OAAO,KAAK;EACd;AACF;AAEA,OAAO,SAASqD,qBAAqBA,CAAA,EAAG;EACtC,IAAI5D,sBAAsB,EAAE;IAC1BA,sBAAsB,CAAC,IAAI,CAAC;IAC5B,OAAO,IAAI;EACb;EACA,OAAO,KAAK;AACd;AAEA,OAAO,SAAS6D,OAAOA,CAAA,EAAG;EACxB,IAAI,CAAC1E,KAAK,EAAE;IACVmB,OAAO,CAACK,GAAG,CAAC,2CAA2C,CAAC;IACxD;EACF;EAEAxB,KAAK,CAACmD,OAAO,CAAC,CAAC,CAACwB,IAAI,CAAC,MAAM;IACzB3E,KAAK,CAAC4E,kBAAkB,CAAC,CAAC;IAC1BvC,mBAAmB,CAAC,CAAC;EACvB,CAAC,CAAC,CAACwC,KAAK,CAACzD,KAAK,IAAI;IAChBD,OAAO,CAACC,KAAK,CAAC,mBAAmB,EAAEA,KAAK,CAAC;IACzC;IACA,IAAIpB,KAAK,EAAE;MACTA,KAAK,CAACmD,OAAO,CAAC,CAAC,CAAC0B,KAAK,CAACtD,CAAC,IAAIJ,OAAO,CAACC,KAAK,CAAC,+BAA+B,EAAEG,CAAC,CAAC,CAAC;IAC/E;EACF,CAAC,CAAC;AACJ","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audioRecorder.d.ts","sourceRoot":"","sources":["../../../src/utils/audioRecorder.js"],"names":[],"mappings":"AAqBA,4EAGC;AAGD,
|
|
1
|
+
{"version":3,"file":"audioRecorder.d.ts","sourceRoot":"","sources":["../../../src/utils/audioRecorder.js"],"names":[],"mappings":"AAqBA,4EAGC;AAGD,2DA4GC;AA+ED,mDAyBC;AAED,+CAoCC;AAED,iDASC;AAED,2DA2BC;AAiDD,iDAMC;AAED,gCAgBC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-srschat",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.44",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "A modern, sophisticated chat interface for React Native",
|
|
6
6
|
"main": "lib/commonjs/index",
|
|
@@ -63,19 +63,19 @@
|
|
|
63
63
|
"@react-native-async-storage/async-storage": "^2.1.1",
|
|
64
64
|
"@react-native-community/audio-toolkit": "^2.0.3",
|
|
65
65
|
"@react-native-community/cli": "^15.0.0",
|
|
66
|
-
"@react-native-community/voice": "^1.1.9",
|
|
67
66
|
"@react-native-picker/picker": "^2.11.0",
|
|
67
|
+
"@react-native-voice/voice": "^3.2.4",
|
|
68
68
|
"axios": "^1.7.9",
|
|
69
|
+
"cloudinary-react-native": "^0.3.0",
|
|
69
70
|
"react-native-audio-recorder-player": "^3.6.12",
|
|
71
|
+
"react-native-eject": "^1.0.2",
|
|
70
72
|
"react-native-keyboard-aware-scroll-view": "^0.9.5",
|
|
71
73
|
"react-native-markdown-display": "^7.0.2",
|
|
72
74
|
"react-native-permissions": "^5.2.6",
|
|
73
|
-
"react-native-eject": "^1.0.2",
|
|
74
75
|
"react-native-uuid": "^2.0.3",
|
|
75
76
|
"react-native-vector-icons": "^10.2.0",
|
|
76
77
|
"react-native-video": "^6.10.2",
|
|
77
|
-
"react-native-web": "~0.19.10"
|
|
78
|
-
"cloudinary-react-native": "^0.3.0"
|
|
78
|
+
"react-native-web": "~0.19.10"
|
|
79
79
|
},
|
|
80
80
|
"react-native-builder-bob": {
|
|
81
81
|
"source": "src",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// audioRecorder.js
|
|
2
2
|
|
|
3
|
-
import { Platform
|
|
4
|
-
import Voice from '@react-native-
|
|
3
|
+
import { Platform } from 'react-native';
|
|
4
|
+
import Voice from '@react-native-voice/voice';
|
|
5
5
|
import { check, PERMISSIONS, request, RESULTS } from 'react-native-permissions';
|
|
6
6
|
import useAsyncStorage from '../hooks/useAsyncStorage';
|
|
7
7
|
|
|
@@ -30,6 +30,12 @@ export async function initVoice(onResult) {
|
|
|
30
30
|
resultCallback = onResult;
|
|
31
31
|
finalResult = '';
|
|
32
32
|
|
|
33
|
+
// Check if Voice module is available
|
|
34
|
+
if (!Voice) {
|
|
35
|
+
console.error('Voice module is not available');
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
|
|
33
39
|
// First check if speech recognition is available
|
|
34
40
|
const isAvailable = await Voice.isAvailable();
|
|
35
41
|
if (!isAvailable) {
|
|
@@ -72,7 +78,7 @@ export async function initVoice(onResult) {
|
|
|
72
78
|
};
|
|
73
79
|
|
|
74
80
|
Voice.onSpeechError = async (e) => {
|
|
75
|
-
console.error('onSpeechError: ', e);
|
|
81
|
+
// console.error('onSpeechError: ', e);
|
|
76
82
|
|
|
77
83
|
if (silenceTimer) {
|
|
78
84
|
clearTimeout(silenceTimer);
|
|
@@ -86,13 +92,13 @@ export async function initVoice(onResult) {
|
|
|
86
92
|
await cleanupVoiceSession();
|
|
87
93
|
|
|
88
94
|
// Only send error to callback if it's not a "No speech detected" error
|
|
89
|
-
if (!isNoSpeechError) {
|
|
90
|
-
|
|
91
|
-
} else {
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
}
|
|
95
|
+
// if (!isNoSpeechError) {
|
|
96
|
+
// resultCallback(null, e.error?.message || 'Speech recognition error');
|
|
97
|
+
// } else {
|
|
98
|
+
// console.log('No speech detected, ignoring error');
|
|
99
|
+
// // Optionally, call the callback with null parameters or a special indicator
|
|
100
|
+
// resultCallback(null, null); // This won't trigger an error alert in the component
|
|
101
|
+
// }
|
|
96
102
|
};
|
|
97
103
|
|
|
98
104
|
Voice.onSpeechResults = (e) => {
|
|
@@ -164,6 +170,12 @@ const cleanupVoiceSession = async () => {
|
|
|
164
170
|
}
|
|
165
171
|
|
|
166
172
|
try {
|
|
173
|
+
// Check if Voice module is available
|
|
174
|
+
if (!Voice) {
|
|
175
|
+
console.log('Voice module not available during cleanup');
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
|
|
167
179
|
// First try to stop if still recognizing
|
|
168
180
|
const isRecognizing = await Voice.isRecognizing();
|
|
169
181
|
if (isRecognizing) {
|
|
@@ -189,7 +201,9 @@ const cleanupVoiceSession = async () => {
|
|
|
189
201
|
console.error('Error in cleanupVoiceSession:', error);
|
|
190
202
|
// Final attempt to destroy on error
|
|
191
203
|
try {
|
|
192
|
-
|
|
204
|
+
if (Voice) {
|
|
205
|
+
await Voice.destroy();
|
|
206
|
+
}
|
|
193
207
|
} catch (e) {
|
|
194
208
|
console.error('Final destroy attempt failed:', e);
|
|
195
209
|
}
|
|
@@ -200,6 +214,12 @@ const cleanupVoiceSession = async () => {
|
|
|
200
214
|
|
|
201
215
|
export async function startRecording() {
|
|
202
216
|
try {
|
|
217
|
+
// Check if Voice module is available
|
|
218
|
+
if (!Voice) {
|
|
219
|
+
console.error('Voice module is not available');
|
|
220
|
+
return false;
|
|
221
|
+
}
|
|
222
|
+
|
|
203
223
|
// Ensure cleanup of any existing session
|
|
204
224
|
await cleanupVoiceSession();
|
|
205
225
|
|
|
@@ -221,7 +241,7 @@ export async function startRecording() {
|
|
|
221
241
|
|
|
222
242
|
export async function stopRecording() {
|
|
223
243
|
try {
|
|
224
|
-
if (!isCurrentlyRecording) return;
|
|
244
|
+
if (!isCurrentlyRecording || !Voice) return;
|
|
225
245
|
|
|
226
246
|
// Set this first to prevent race conditions
|
|
227
247
|
isCurrentlyRecording = false;
|
|
@@ -259,13 +279,13 @@ export async function stopRecording() {
|
|
|
259
279
|
|
|
260
280
|
export async function cancelRecording() {
|
|
261
281
|
try {
|
|
282
|
+
if (!Voice) return;
|
|
262
283
|
await Voice.cancel();
|
|
263
284
|
await cleanupVoiceSession();
|
|
264
285
|
} catch (error) {
|
|
265
286
|
console.error('Error canceling voice recognition:', error);
|
|
266
287
|
await cleanupVoiceSession();
|
|
267
288
|
}
|
|
268
|
-
|
|
269
289
|
}
|
|
270
290
|
|
|
271
291
|
export async function requestAudioPermission() {
|
|
@@ -299,24 +319,22 @@ export async function requestAudioPermission() {
|
|
|
299
319
|
|
|
300
320
|
async function requestAndroidPermission() {
|
|
301
321
|
try {
|
|
302
|
-
|
|
322
|
+
|
|
323
|
+
|
|
324
|
+
// Request microphone permission
|
|
325
|
+
const micPermission = await request(PERMISSIONS.ANDROID.RECORD_AUDIO);
|
|
326
|
+
if (micPermission !== RESULTS.GRANTED) {
|
|
327
|
+
console.log('Microphone permission denied');
|
|
328
|
+
return false;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
// Skip checking speech recognition services which is causing errors
|
|
303
332
|
const services = await Voice.getSpeechRecognitionServices();
|
|
304
333
|
if (!services || services.length === 0) {
|
|
305
334
|
console.error('No speech recognition services available');
|
|
306
335
|
return false;
|
|
307
336
|
}
|
|
308
|
-
|
|
309
|
-
const granted = await PermissionsAndroid.request(
|
|
310
|
-
PermissionsAndroid.PERMISSIONS.RECORD_AUDIO,
|
|
311
|
-
{
|
|
312
|
-
title: 'Microphone Permission',
|
|
313
|
-
message: 'This app needs access to your microphone for voice recognition.',
|
|
314
|
-
buttonPositive: 'OK',
|
|
315
|
-
buttonNegative: 'Cancel',
|
|
316
|
-
}
|
|
317
|
-
);
|
|
318
|
-
|
|
319
|
-
return granted === PermissionsAndroid.RESULTS.GRANTED;
|
|
337
|
+
return true;
|
|
320
338
|
} catch (error) {
|
|
321
339
|
console.error('Error requesting Android permission:', error);
|
|
322
340
|
return false;
|
|
@@ -355,13 +373,20 @@ export function resetStoredPermission() {
|
|
|
355
373
|
}
|
|
356
374
|
|
|
357
375
|
export function cleanup() {
|
|
376
|
+
if (!Voice) {
|
|
377
|
+
console.log('Voice module not available during cleanup');
|
|
378
|
+
return;
|
|
379
|
+
}
|
|
380
|
+
|
|
358
381
|
Voice.destroy().then(() => {
|
|
359
382
|
Voice.removeAllListeners();
|
|
360
383
|
cleanupVoiceSession();
|
|
361
384
|
}).catch(error => {
|
|
362
385
|
console.error('Error in cleanup:', error);
|
|
363
386
|
// Try one more time
|
|
364
|
-
Voice
|
|
387
|
+
if (Voice) {
|
|
388
|
+
Voice.destroy().catch(e => console.error('Final cleanup attempt failed:', e));
|
|
389
|
+
}
|
|
365
390
|
});
|
|
366
391
|
}
|
|
367
392
|
|