@@ -4069,8 +4069,14 @@ RCT_EXPORT_METHOD(start:(RCTPromiseResolveBlock)resolve
40694069 }
40704070
40714071 self.latestTranscript = @"";
4072− self.recognizer = [[SFSpeechRecognizer alloc] initWithLocale:[NSLocale currentLocale]];
4073− NSLog(@"[SpeechRecognition] Recognizer available: %d, locale: %@", self.recognizer.isAvailable, self.recognizer.locale.localeIdentifier);
4072+ // Use en-US explicitly — currentLocale can return region-specific locales that
4073+ // on-device speech recognition doesn't support
4074+ NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en-US"];
4075+ self.recognizer = [[SFSpeechRecognizer alloc] initWithLocale:locale];
4076+ NSLog(@"[SpeechRecognition] Recognizer available: %d, supportsOnDevice: %d, locale: %@",
4077+ self.recognizer.isAvailable,
4078+ self.recognizer.supportsOnDeviceRecognition,
4079+ self.recognizer.locale.localeIdentifier);
40744080
40754081 if (!self.recognizer.isAvailable) {
40764082 reject(@"UNAVAILABLE", @"Speech recognizer is not available for this locale", nil);
@@ -4080,19 +4086,24 @@ RCT_EXPORT_METHOD(start:(RCTPromiseResolveBlock)resolve
40804086 self.audioEngine = [[AVAudioEngine alloc] init];
40814087 self.recognitionRequest = [[SFSpeechAudioBufferRecognitionRequest alloc] init];
40824088 self.recognitionRequest.shouldReportPartialResults = YES;
4089+ // Do NOT require on-device — let it use server-based recognition
4090+ // On-device may not have the language model downloaded
4091+ self.recognitionRequest.requiresOnDeviceRecognition = NO;
40834092
40844093 AVAudioInputNode *inputNode = self.audioEngine.inputNode;
4094+ // Use nil format — let the system pick the right format for the input node
40854095 AVAudioFormat *format = [inputNode outputFormatForBus:0];
4086− NSLog(@"[SpeechRecognition] Audio format: %@", format);
4096+ NSLog(@"[SpeechRecognition] Audio format: sampleRate=%f channels=%u", format.sampleRate, format.channelCount);
40874097
4088− [inputNode installTapOnBus:0 bufferSize:1024 format:format block:^(AVAudioPCMBuffer *buffer, AVAudioTime *when) {
4098+ [inputNode installTapOnBus:0 bufferSize:4096 format:format block:^(AVAudioPCMBuffer *buffer, AVAudioTime *when) {
40894099 [self.recognitionRequest appendAudioPCMBuffer:buffer];
40904100 }];
40914101
40924102 self.recognitionTask = [self.recognizer recognitionTaskWithRequest:self.recognitionRequest
40934103 resultHandler:^(SFSpeechRecognitionResult *result, NSError *error) {
40944104 if (error) {
4095− NSLog(@"[SpeechRecognition] Error: %@", error.localizedDescription);
4105+ NSLog(@"[SpeechRecognition] Error: %@ (code: %ld, domain: %@)",
4106+ error.localizedDescription, (long)error.code, error.domain);
40964107 }
40974108 if (result) {
40984109 self.latestTranscript = result.bestTranscription.formattedString;