react-native-wakeword 1.1.79 → 1.1.81

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.
@@ -2,6 +2,7 @@
2
2
 
3
3
  #import "KeyWordRNBridge.h"
4
4
  #import <AVFoundation/AVFoundation.h>
5
+ #import <Speech/Speech.h>
5
6
  #import <React/RCTBridge.h>
6
7
  #import <React/RCTLog.h>
7
8
  #import <React/RCTEventEmitter.h>
@@ -389,6 +390,11 @@ static BOOL KWRNBHasMicPermission(void) {
389
390
  return permission == AVAudioSessionRecordPermissionGranted;
390
391
  }
391
392
 
393
+ static BOOL KWRNBHasSpeechRecognitionPermission(void) {
394
+ SFSpeechRecognizerAuthorizationStatus status = [SFSpeechRecognizer authorizationStatus];
395
+ return status == SFSpeechRecognizerAuthorizationStatusAuthorized;
396
+ }
397
+
392
398
  @interface KeyWordRNBridge () <RCTBridgeModule>
393
399
 
394
400
  @property (nonatomic, strong) NSMutableDictionary *instances;
@@ -967,6 +973,54 @@ RCT_EXPORT_METHOD(requestMicPermissions:(nonnull NSNumber *)wait_timeout
967
973
  });
968
974
  }
969
975
 
976
+ RCT_EXPORT_METHOD(hasSpeechRecognitionPermissions:(RCTPromiseResolveBlock)resolve
977
+ rejecter:(RCTPromiseRejectBlock)reject)
978
+ {
979
+ resolve(@(KWRNBHasSpeechRecognitionPermission()));
980
+ }
981
+
982
+ RCT_EXPORT_METHOD(requestSpeechRecognitionPermissions:(nonnull NSNumber *)wait_timeout
983
+ resolver:(RCTPromiseResolveBlock)resolve
984
+ rejecter:(RCTPromiseRejectBlock)reject)
985
+ {
986
+ dispatch_async(dispatch_get_main_queue(), ^{
987
+ SFSpeechRecognizerAuthorizationStatus status = [SFSpeechRecognizer authorizationStatus];
988
+ if (status == SFSpeechRecognizerAuthorizationStatusAuthorized) {
989
+ resolve(@YES);
990
+ return;
991
+ }
992
+
993
+ if (status == SFSpeechRecognizerAuthorizationStatusDenied ||
994
+ status == SFSpeechRecognizerAuthorizationStatusRestricted) {
995
+ resolve(@NO);
996
+ return;
997
+ }
998
+
999
+ NSTimeInterval timeoutSeconds = MAX(wait_timeout.doubleValue, 0.0) / 1000.0;
1000
+ __block BOOL didResolve = NO;
1001
+ void (^finish)(BOOL) = ^(BOOL granted) {
1002
+ if (didResolve) {
1003
+ return;
1004
+ }
1005
+ didResolve = YES;
1006
+ resolve(@(granted));
1007
+ };
1008
+
1009
+ if (timeoutSeconds > 0.0) {
1010
+ dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(timeoutSeconds * NSEC_PER_SEC)),
1011
+ dispatch_get_main_queue(), ^{
1012
+ finish(KWRNBHasSpeechRecognitionPermission());
1013
+ });
1014
+ }
1015
+
1016
+ [SFSpeechRecognizer requestAuthorization:^(SFSpeechRecognizerAuthorizationStatus updatedStatus) {
1017
+ dispatch_async(dispatch_get_main_queue(), ^{
1018
+ finish(updatedStatus == SFSpeechRecognizerAuthorizationStatusAuthorized);
1019
+ });
1020
+ }];
1021
+ });
1022
+ }
1023
+
970
1024
  RCT_EXPORT_METHOD(setKeywordDetectionLicense:(NSString *)instanceId licenseKey:(NSString *)licenseKey resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
971
1025
  {
972
1026
  KeyWordsDetectionWrapper *wrapper = self.instances[instanceId];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-wakeword",
3
- "version": "1.1.79",
3
+ "version": "1.1.81",
4
4
  "description": "Voice/Wake-word detection library for React Native",
5
5
  "main": "wakewords/index.js",
6
6
  "types": "wakewords/index.d.ts",
@@ -49,5 +49,7 @@ export function restartListeningAfterDucking(): Promise<void>;
49
49
  export function initAudioSessAndDuckManage(): Promise<void>;
50
50
  export function hasIOSMicPermissions(): Promise<any>;
51
51
  export function requestIOSMicPermissions(wait_timeout: any): Promise<any>;
52
+ export function hasIOSSpeechRecognitionPermissions(): Promise<any>;
53
+ export function requestIOSSpeechRecognitionPermissions(wait_timeout: any): Promise<any>;
52
54
  export function disableDuckingAndCleanup(): Promise<void>;
53
55
  export function setWakewordAudioRoutingConfig(config: any): Promise<any>;
@@ -283,6 +283,14 @@ export const requestIOSMicPermissions = async (wait_timeout) => {
283
283
  return await KeyWordRNBridge.requestMicPermissions(wait_timeout);
284
284
  }
285
285
 
286
+ export const hasIOSSpeechRecognitionPermissions = async () => {
287
+ return await KeyWordRNBridge.hasSpeechRecognitionPermissions();
288
+ }
289
+
290
+ export const requestIOSSpeechRecognitionPermissions = async (wait_timeout) => {
291
+ return await KeyWordRNBridge.requestSpeechRecognitionPermissions(wait_timeout);
292
+ }
293
+
286
294
  export const disableDuckingAndCleanup = async () => {
287
295
  if (Platform.OS === 'ios') {
288
296
  await KeyWordRNBridge.disableDuckingAndCleanup();
@@ -3,6 +3,10 @@ import { enableDucking } from './KeyWordRNBridge';
3
3
  import { disableDucking } from './KeyWordRNBridge';
4
4
  import { initAudioSessAndDuckManage } from './KeyWordRNBridge';
5
5
  import { restartListeningAfterDucking } from './KeyWordRNBridge';
6
+ import { hasIOSMicPermissions } from './KeyWordRNBridge';
7
+ import { requestIOSMicPermissions } from './KeyWordRNBridge';
8
+ import { hasIOSSpeechRecognitionPermissions } from './KeyWordRNBridge';
9
+ import { requestIOSSpeechRecognitionPermissions } from './KeyWordRNBridge';
6
10
  import { pauseDetection } from './KeyWordRNBridge';
7
11
  import { unPauseDetection } from './KeyWordRNBridge';
8
12
  import { removeAllRNBridgeListeners } from './KeyWordRNBridge';
@@ -18,7 +22,7 @@ import { onSpeakerVerificationOnboardingDone } from './SpeakerVerificationRNBrid
18
22
  import { onSpeakerVerificationVerifyResult } from './SpeakerVerificationRNBridge';
19
23
  import { onSpeakerVerificationError } from './SpeakerVerificationRNBridge';
20
24
  import useModel from './useModel';
21
- export { enableDucking, disableDucking, initAudioSessAndDuckManage, restartListeningAfterDucking, pauseDetection, unPauseDetection, removeAllRNBridgeListeners, createKeyWordRNBridgeInstance, KeyWordRNBridgeInstance, setWakewordAudioRoutingConfig, createSpeakerVerificationInstance, SpeakerVerificationRNBridgeInstance, createSpeakerVerificationMicController, SpeakerVerificationMicController, onSpeakerVerificationOnboardingProgress, onSpeakerVerificationOnboardingDone, onSpeakerVerificationVerifyResult, onSpeakerVerificationError, useModel };
25
+ export { enableDucking, disableDucking, initAudioSessAndDuckManage, restartListeningAfterDucking, hasIOSMicPermissions, requestIOSMicPermissions, hasIOSSpeechRecognitionPermissions, requestIOSSpeechRecognitionPermissions, pauseDetection, unPauseDetection, removeAllRNBridgeListeners, createKeyWordRNBridgeInstance, KeyWordRNBridgeInstance, setWakewordAudioRoutingConfig, createSpeakerVerificationInstance, SpeakerVerificationRNBridgeInstance, createSpeakerVerificationMicController, SpeakerVerificationMicController, onSpeakerVerificationOnboardingProgress, onSpeakerVerificationOnboardingDone, onSpeakerVerificationVerifyResult, onSpeakerVerificationError, useModel };
22
26
 
23
27
  // Re-export routing types for consumers:
24
28
  export type { AudioRoutingConfig, RouteConfigEntry } from './audioRoutingConfig';
@@ -9,6 +9,10 @@ import {
9
9
  disableDucking,
10
10
  initAudioSessAndDuckManage,
11
11
  restartListeningAfterDucking,
12
+ hasIOSMicPermissions,
13
+ requestIOSMicPermissions,
14
+ hasIOSSpeechRecognitionPermissions,
15
+ requestIOSSpeechRecognitionPermissions,
12
16
  pauseDetection,
13
17
  unPauseDetection,
14
18
  setWakewordAudioRoutingConfig, // ← NEW
@@ -30,6 +34,10 @@ export { enableDucking }
30
34
  export { disableDucking }
31
35
  export { initAudioSessAndDuckManage }
32
36
  export { restartListeningAfterDucking }
37
+ export { hasIOSMicPermissions }
38
+ export { requestIOSMicPermissions }
39
+ export { hasIOSSpeechRecognitionPermissions }
40
+ export { requestIOSSpeechRecognitionPermissions }
33
41
  export { pauseDetection }
34
42
  export { unPauseDetection }
35
43
  export { removeAllRNBridgeListeners }