diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2fc9490..3e4eea1 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,37 @@
# Changelog
+## 2.1.7 (2025-11-17)
+
+* fix: Fix format rate error on iOS (#104) ([d8fe8b0](https://github.com/riderodd/react-native-vosk/commit/d8fe8b0)), closes [#104](https://github.com/riderodd/react-native-vosk/issues/104)
+* fix: ios does not asks for audio permission on startup, and model is unloaded properly ([dfa6911](https://github.com/riderodd/react-native-vosk/commit/dfa6911))
+* fix: ios record on simulator (#158) ([f2b1496](https://github.com/riderodd/react-native-vosk/commit/f2b1496)), closes [#158](https://github.com/riderodd/react-native-vosk/issues/158)
+* fix: yarn lockfile (#155) ([507e67d](https://github.com/riderodd/react-native-vosk/commit/507e67d)), closes [#155](https://github.com/riderodd/react-native-vosk/issues/155)
+* #67: replace file:// in name path, have a more descriptive log (#79) ([4e756da](https://github.com/riderodd/react-native-vosk/commit/4e756da)), closes [#67](https://github.com/riderodd/react-native-vosk/issues/67) [#79](https://github.com/riderodd/react-native-vosk/issues/79)
+* Add Expo support for react-native-vosk (#151) ([fec6fb9](https://github.com/riderodd/react-native-vosk/commit/fec6fb9)), closes [#151](https://github.com/riderodd/react-native-vosk/issues/151)
+* Create dependabot.yml (#71) ([8634eba](https://github.com/riderodd/react-native-vosk/commit/8634eba)), closes [#71](https://github.com/riderodd/react-native-vosk/issues/71)
+* fix crashes (#143) ([cc9ea78](https://github.com/riderodd/react-native-vosk/commit/cc9ea78)), closes [#143](https://github.com/riderodd/react-native-vosk/issues/143)
+* Fix expo ios model path (#156) ([e2877d9](https://github.com/riderodd/react-native-vosk/commit/e2877d9)), closes [#156](https://github.com/riderodd/react-native-vosk/issues/156)
+* Fix Expo plugin configuration and dependencies (#152) ([3fa62f7](https://github.com/riderodd/react-native-vosk/commit/3fa62f7)), closes [#152](https://github.com/riderodd/react-native-vosk/issues/152)
+* Fix ios pcm bitrate (#157) ([948534e](https://github.com/riderodd/react-native-vosk/commit/948534e)), closes [#157](https://github.com/riderodd/react-native-vosk/issues/157)
+* Fix/expo ios (#154) ([cbdf9eb](https://github.com/riderodd/react-native-vosk/commit/cbdf9eb)), closes [#154](https://github.com/riderodd/react-native-vosk/issues/154)
+* Fix/update version (#106) ([eeebd52](https://github.com/riderodd/react-native-vosk/commit/eeebd52)), closes [#106](https://github.com/riderodd/react-native-vosk/issues/106)
+* Try to make expo plugin works (#153) ([b54f844](https://github.com/riderodd/react-native-vosk/commit/b54f844)), closes [#153](https://github.com/riderodd/react-native-vosk/issues/153)
+* Update dependabot.yml (#72) ([4013cf3](https://github.com/riderodd/react-native-vosk/commit/4013cf3)), closes [#72](https://github.com/riderodd/react-native-vosk/issues/72)
+* Update issue templates (#76) ([9e4ac88](https://github.com/riderodd/react-native-vosk/commit/9e4ac88)), closes [#76](https://github.com/riderodd/react-native-vosk/issues/76)
+* Update to TurboModules with breaking changes (#150) ([4869ff0](https://github.com/riderodd/react-native-vosk/commit/4869ff0)), closes [#150](https://github.com/riderodd/react-native-vosk/issues/150)
+* Update Vosk Android library and model loading method (#149) ([3248919](https://github.com/riderodd/react-native-vosk/commit/3248919)), closes [#149](https://github.com/riderodd/react-native-vosk/issues/149)
+* docs: add Copilot Coding Agent onboarding instructions (#148) ([1881c34](https://github.com/riderodd/react-native-vosk/commit/1881c34)), closes [#148](https://github.com/riderodd/react-native-vosk/issues/148)
+* chore: release 0.3.2 (#80) ([37ec42a](https://github.com/riderodd/react-native-vosk/commit/37ec42a)), closes [#80](https://github.com/riderodd/react-native-vosk/issues/80)
+* chore: updated release it deps (#105) ([b73429c](https://github.com/riderodd/react-native-vosk/commit/b73429c)), closes [#105](https://github.com/riderodd/react-native-vosk/issues/105)
+* chore(deps-dev): bump @react-native/metro-config from 0.76.1 to 0.79.2 (#118) ([a14e95a](https://github.com/riderodd/react-native-vosk/commit/a14e95a)), closes [#118](https://github.com/riderodd/react-native-vosk/issues/118)
+
+
+### BREAKING CHANGE
+
+* the model is not searched in the android project by default anymore
+
+* chore: release 1.0.0
+
## 2.1.6 (2025-09-12)
* fix: Fix format rate error on iOS (#104) ([d8fe8b0](https://github.com/riderodd/react-native-vosk/commit/d8fe8b0)), closes [#104](https://github.com/riderodd/react-native-vosk/issues/104)
diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock
index c635995..7bce5c4 100644
--- a/example/ios/Podfile.lock
+++ b/example/ios/Podfile.lock
@@ -1835,7 +1835,7 @@ PODS:
- ReactCommon/turbomodule/core
- SocketRocket
- Yoga
- - react-native-vosk (2.1.5):
+ - react-native-vosk (2.1.6):
- boost
- DoubleConversion
- fast_float
@@ -2643,7 +2643,7 @@ SPEC CHECKSUMS:
React-Mapbuffer: 91e0eab42a6ae7f3e34091a126d70fc53bd3823e
React-microtasksnativemodule: 1ead4fe154df3b1ba34b5a9e35ef3c4bdfa72ccb
react-native-safe-area-context: c6e2edd1c1da07bdce287fa9d9e60c5f7b514616
- react-native-vosk: 797d9009626d4bfa1b0522b7b1aa84def66c1f17
+ react-native-vosk: 2b4cd09c20a18339315a34740341982aa8a4b645
React-NativeModulesApple: eff2eba56030eb0d107b1642b8f853bc36a833ac
React-oscompat: b12c633e9c00f1f99467b1e0e0b8038895dae436
React-perflogger: 58d12c4e5df1403030c97b9c621375c312cca454
@@ -2672,11 +2672,11 @@ SPEC CHECKSUMS:
React-timing: 97ada2c47b4c5932e7f773c7d239c52b90d6ca68
React-utils: f0949d247a46b4c09f03e5a3cb1167602d0b729a
ReactAppDependencyProvider: 3eb9096cb139eb433965693bbe541d96eb3d3ec9
- ReactCodegen: 4d203eddf6f977caa324640a20f92e70408d648b
+ ReactCodegen: e2251e4a041828c517fde8f6e1c062c4a89b88f4
ReactCommon: ce5d4226dfaf9d5dacbef57b4528819e39d3a120
SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748
Yoga: 11c9686a21e2cd82a094a723649d9f4507200fb0
PODFILE CHECKSUM: 605b934b5eb489405fbad7204a4924dc73596edb
-COCOAPODS: 1.16.2
+COCOAPODS: 1.15.2
diff --git a/ios/Vosk.mm b/ios/Vosk.mm
index 50e6762..8bbfdc2 100644
--- a/ios/Vosk.mm
+++ b/ios/Vosk.mm
@@ -33,9 +33,10 @@ - (instancetype)init {
dispatch_queue_create("recognizerQueue", DISPATCH_QUEUE_SERIAL);
dispatch_queue_set_specific(_processingQueue, kVoskProcessingQueueKey,
kVoskProcessingQueueKey, NULL);
- _audioEngine = [AVAudioEngine new];
- _inputNode = _audioEngine.inputNode;
- _formatInput = [_inputNode inputFormatForBus:0];
+ // Lazy initialization to avoid triggering microphone permission prompt
+ _audioEngine = nil;
+ _inputNode = nil;
+ _formatInput = nil;
_recognizer = NULL;
_currentModel = nil;
_lastPartial = nil;
@@ -93,6 +94,15 @@ - (void)start:(JS::NativeVosk::VoskOptions *_Nullable)options
_isStarting = YES;
_tapRetryCount = 0;
_pendingTap = NO;
+
+ // Lazy initialization of audio engine to avoid permission prompt at module load
+ if (!_audioEngine) {
+ _audioEngine = [AVAudioEngine new];
+ }
+ if (!_inputNode) {
+ _inputNode = _audioEngine.inputNode;
+ }
+
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
// Extract options (grammar, timeout) from the codegen structure
@@ -129,12 +139,14 @@ - (void)start:(JS::NativeVosk::VoskOptions *_Nullable)options
if (catErr) {
NSString *msg = [NSString stringWithFormat:@"Audio session category error: %@", catErr.localizedDescription];
[self emitOnError:msg];
+ _isStarting = NO;
reject(@"start", msg, catErr);
return;
}
} @catch (NSException *ex) {
NSString *msg = [NSString stringWithFormat:@"Exception setting category: %@", ex.reason ?: @"unknown"];
[self emitOnError:msg];
+ _isStarting = NO;
reject(@"start", msg, nil);
return;
}
@@ -145,6 +157,7 @@ - (void)start:(JS::NativeVosk::VoskOptions *_Nullable)options
dispatch_async(dispatch_get_main_queue(), ^{
NSString *msg = @"Microphone permission denied";
[self emitOnError:msg];
+ self->_isStarting = NO;
reject(@"start", msg, nil);
});
return;
@@ -154,6 +167,7 @@ - (void)start:(JS::NativeVosk::VoskOptions *_Nullable)options
if (![audioSession setActive:YES error:&actErr]) {
NSString *msg = [NSString stringWithFormat:@"Failed to activate audio session: %@", actErr.localizedDescription];
[self emitOnError:msg];
+ self->_isStarting = NO;
reject(@"start", msg, actErr);
return;
}
@@ -287,6 +301,12 @@ - (void)unload {
if (_isRunning) {
[self stopInternalWithoutEvents:NO];
}
+ // Reset all flags to ensure consistent state regardless of running state
+ _isStarting = NO;
+ _isRunning = NO;
+ _tapInstalled = NO;
+ _pendingTap = NO;
+ _tapRetryCount = 0;
_currentModel = nil;
}
@@ -303,18 +323,18 @@ - (void)removeListeners:(double)count {
// Internal cleanup
- (void)stopInternalWithoutEvents:(BOOL)withoutEvents {
- @try {
- [_inputNode removeTapOnBus:0];
- } @catch (...) {
- }
-
- if (!_isRunning) {
- // already stopped
- }
- _isRunning = NO; // prevents new buffers from being processed
+ // Reset flags immediately to allow restart
+ _isRunning = NO;
_isStarting = NO;
_tapInstalled = NO;
_pendingTap = NO;
+
+ @try {
+ if (_inputNode) {
+ [_inputNode removeTapOnBus:0];
+ }
+ } @catch (...) {
+ }
if (_audioEngine.isRunning) {
[_audioEngine stop];
diff --git a/package.json b/package.json
index 0108ce4..d33eb8d 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "react-native-vosk",
- "version": "2.1.6",
+ "version": "2.1.7",
"description": "Speech recognition module for react native using Vosk library",
"types": "lib/typescript/src/index.d.ts",
"main": "lib/commonjs/index.js",