From 91d11640ed27b8376c7e3409b7d3c675b6bad77b Mon Sep 17 00:00:00 2001 From: Neo <54811660+neooriginal@users.noreply.github.com> Date: Wed, 31 Dec 2025 13:50:18 +0100 Subject: [PATCH 1/2] fixes --- app/ios/Runner/AppDelegate.swift | 13 +++++++++++++ .../pages/settings/transcription_settings_page.dart | 11 ++++++++++- .../services/sockets/on_device_apple_provider.dart | 8 ++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/app/ios/Runner/AppDelegate.swift b/app/ios/Runner/AppDelegate.swift index 5840594f1d..c98fcca3d6 100644 --- a/app/ios/Runner/AppDelegate.swift +++ b/app/ios/Runner/AppDelegate.swift @@ -396,6 +396,19 @@ class SpeechRecognitionHandler: NSObject { let language = args["language"] as? String ?? "en-US" transcribe(filePath: path, language: language, result: result) + } else if call.method == "requestPermission" { + SFSpeechRecognizer.requestAuthorization { authStatus in + DispatchQueue.main.async { + switch authStatus { + case .authorized: + result(true) + case .denied, .restricted, .notDetermined: + result(false) + @unknown default: + result(false) + } + } + } } else { result(FlutterMethodNotImplemented) } diff --git a/app/lib/pages/settings/transcription_settings_page.dart b/app/lib/pages/settings/transcription_settings_page.dart index b67a675fd5..86e9a51960 100644 --- a/app/lib/pages/settings/transcription_settings_page.dart +++ b/app/lib/pages/settings/transcription_settings_page.dart @@ -19,6 +19,7 @@ import 'package:disk_space_2/disk_space_2.dart'; import 'package:path_provider/path_provider.dart'; import 'package:omi/services/services.dart'; import 'package:omi/services/sockets/transcription_service.dart'; +import 'package:omi/services/sockets/on_device_apple_provider.dart'; import 'package:omi/services/custom_stt_log_service.dart'; import 'package:omi/utils/l10n_extensions.dart'; import 'package:provider/provider.dart'; @@ -70,7 +71,13 @@ class _TranscriptionSettingsPageState extends State { SttProviderConfig get _currentConfig => SttProviderConfig.get(_selectedProvider); CustomSttConfig? get _currentProviderConfig => _configsPerProvider[_selectedProvider]; - String get _currentLanguage => _currentProviderConfig?.language ?? _currentConfig.defaultLanguage; + String get _currentLanguage { + final lang = _currentProviderConfig?.language ?? _currentConfig.defaultLanguage; + if (Platform.isIOS && lang == 'multi') { + return 'en'; + } + return lang; + } String get _currentModel => _currentProviderConfig?.model ?? _currentConfig.defaultModel; String get _currentRequestJson => _requestJsonPerProvider[_selectedProvider] ?? '{}'; String get _currentSchemaJson => _schemaJsonPerProvider[_selectedProvider] ?? '{}'; @@ -1037,6 +1044,8 @@ class _TranscriptionSettingsPageState extends State { _selectedProvider = SttProvider.onDeviceWhisper; if (!isIOS) { _checkLocalModel(); + } else { + OnDeviceAppleProvider.requestPermission(); } MixpanelManager().transcriptionSourceSelected(source: isIOS ? 'custom_on_device_ios' : 'custom_on_device'); }); diff --git a/app/lib/services/sockets/on_device_apple_provider.dart b/app/lib/services/sockets/on_device_apple_provider.dart index c43514ab7a..11404c0871 100644 --- a/app/lib/services/sockets/on_device_apple_provider.dart +++ b/app/lib/services/sockets/on_device_apple_provider.dart @@ -15,6 +15,14 @@ class OnDeviceAppleProvider implements ISttProvider { this.language = 'en', }); + static Future requestPermission() async { + try { + await _channel.invokeMethod('requestPermission'); + } catch (e) { + CustomSttLogService.instance.error('OnDeviceApple', 'Permission request error: $e'); + } + } + @override Future transcribe( Uint8List audioData, { From 2758b7c612ed7d99c8828b4837bbe19077efb7b7 Mon Sep 17 00:00:00 2001 From: Neo <54811660+neooriginal@users.noreply.github.com> Date: Thu, 1 Jan 2026 15:52:19 +0100 Subject: [PATCH 2/2] fix gemini issues --- .../pages/settings/transcription_settings_page.dart | 11 +++++++++-- .../services/sockets/on_device_apple_provider.dart | 9 +++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/app/lib/pages/settings/transcription_settings_page.dart b/app/lib/pages/settings/transcription_settings_page.dart index 86e9a51960..8bde8f9e74 100644 --- a/app/lib/pages/settings/transcription_settings_page.dart +++ b/app/lib/pages/settings/transcription_settings_page.dart @@ -1044,11 +1044,18 @@ class _TranscriptionSettingsPageState extends State { _selectedProvider = SttProvider.onDeviceWhisper; if (!isIOS) { _checkLocalModel(); - } else { - OnDeviceAppleProvider.requestPermission(); } MixpanelManager().transcriptionSourceSelected(source: isIOS ? 'custom_on_device_ios' : 'custom_on_device'); }); + + if (isIOS) { + final granted = await OnDeviceAppleProvider.requestPermission(); + if (!granted && mounted) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text('Speech recognition permission is required. Please enable it in Settings.')), + ); + } + } } Widget _buildSourceSelector() { diff --git a/app/lib/services/sockets/on_device_apple_provider.dart b/app/lib/services/sockets/on_device_apple_provider.dart index 11404c0871..22edaaafb2 100644 --- a/app/lib/services/sockets/on_device_apple_provider.dart +++ b/app/lib/services/sockets/on_device_apple_provider.dart @@ -15,11 +15,16 @@ class OnDeviceAppleProvider implements ISttProvider { this.language = 'en', }); - static Future requestPermission() async { + static Future requestPermission() async { try { - await _channel.invokeMethod('requestPermission'); + final bool? granted = await _channel.invokeMethod('requestPermission'); + if (granted == false) { + CustomSttLogService.instance.warning('OnDeviceApple', 'Speech recognition permission not granted.'); + } + return granted ?? false; } catch (e) { CustomSttLogService.instance.error('OnDeviceApple', 'Permission request error: $e'); + return false; } }