Flutter & Mobil İle İleri Düzey Sesli Komut Algılama Sistemi Nasıl Yapılır?

Flutter & Mobil İle İleri Düzey Sesli Komut Algılama Sistemi Nasıl Yapılır?
Flutter & Mobil İle İleri Düzey Sesli Komut Algılama Sistemi Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Bu projeye başlamadan önce Flutter SDK'nızın 3.24 veya daha güncel bir sürümde olduğundan emin olmalısınız. Sesli komut algılama sistemleri, cihazın mikrofonuna doğrudan erişim gerektirdiği için hem Android hem de iOS tarafında özel izin yapılandırmaları zorunludur.

  • Flutter SDK 3.24+
  • Dart 3.5+
  • Android: AndroidManifest.xml dosyasında RECORD_AUDIO izni.
  • iOS: Info.plist dosyasında NSSpeechRecognitionUsageDescription ve NSMicrophoneUsageDescription anahtarları.

Gerekli bağımlılıkları pubspec.yaml dosyanıza ekleyerek işe başlayın. İleri düzey bir yapı için speech_to_text kütüphanesini kullanacağız.

dependencies:
  flutter:
    sdk: flutter
  speech_to_text: ^7.0.0

Adım Adım Sesli Komut Motorunu Kurma

Sesli komut motorunu başlatmak için bir servis sınıfı oluşturmak, kodun sürdürülebilirliği açısından en iyi pratiktir. Bu sınıf, mikrofon erişimini kontrol edecek ve dinleme durumunu yönetecektir.

import 'package:speech_to_text/speech_to_text.dart';

class SesliKomutServisi {
  final SpeechToText _speech = SpeechToText();
  bool _isAvailable = false;

  Future baslat() async {
    _isAvailable = await _speech.initialize(
      onStatus: (status) => print('Durum: $status'),
      onError: (error) => print('Hata: $error'),
    );
    return _isAvailable;
  }
}

Yukarıdaki kod bloğu, cihazın ses tanıma yeteneğini kontrol eder ve başlatır. initialize metodu, kullanıcının mikrofon izinlerini onaylamasını bekler ve başarılı olursa true döner.

Sesli Veriyi İşleme ve Komutlara Dönüştürme

Ses metne dönüştürüldükten sonra, bu metnin içerisinde belirli anahtar kelimeleri arayarak aksiyon almanız gerekir. İleri düzey bir sistemde, basit bir if-else yapısı yerine bir "Komut Yöneticisi" (Command Manager) kullanmalısınız.

void komutIsle(String metin) {
  String temizMetin = metin.toLowerCase();
  
  if (temizMetin.contains("ışıkları aç")) {
    // Işıkları açma fonksiyonunu çağır
  } else if (temizMetin.contains("müzik çal")) {
    // Müzik oynatıcıyı başlat
  } else {
    print("Komut anlaşılamadı: $metin");
  }
}

Bu yaklaşım, kullanıcıdan gelen doğal dili belirli bir mantıksal yapıya oturtur. Ancak, büyük projelerde bu yapıyı bir harita (Map) veya strateji tasarım deseni ile yönetmeniz, kodun okunabilirliğini artıracaktır.

Sesli Komut Algılama Yöntemlerinin Karşılaştırması

Yöntem Avantaj Dezavantaj
Cihaz İçi (On-Device) Çevrimdışı çalışır, hızlıdır. Düşük doğruluk oranı.
Bulut Tabanlı (Cloud) Yüksek doğruluk, geniş dil desteği. İnternet bağımlılığı, gecikme.

Güvenlik ve Gizlilik Uyarıları

Kritik Uyarı: Sesli komut verileri hassas kişisel veriler içerebilir. Kullanıcıdan ses verisi alırken mutlaka gizlilik politikanızı belirtin ve verileri sunucuya gönderiyorsanız mutlaka uçtan uca şifreleme (TLS) kullanın. Ses verilerini asla izinsiz arka planda kaydetmeyin.

Uygulamanızda sesli komutları işlerken, kullanıcıya görsel bir geri bildirim (örneğin animasyonlu bir mikrofon ikonu) sunmak, sistemin o an aktif olduğunu anlamasını sağlar. Bu, kullanıcı deneyimi (UX) açısından hayati bir detaydır.

Hata Yönetimi ve Debug İpuçları

Sesli komut sistemlerinde en sık karşılaşılan hata, mikrofon izinlerinin reddedilmesi veya gürültülü ortamlardır. onError callback'ini kullanarak bu hataları yakalamalı ve kullanıcıyı yönlendirmelisiniz.

_speech.listen(
  onResult: (result) {
    if (result.finalResult) {
      komutIsle(result.recognizedWords);
    }
  },
  listenFor: Duration(seconds: 5),
  pauseFor: Duration(seconds: 2),
);

listenFor ve pauseFor parametreleri, sistemin ne kadar süre dinleyeceğini ve sessizlik anında ne zaman duracağını belirler. Bu değerleri uygulamanızın kullanım senaryosuna göre optimize etmelisiniz.

Sıkça Sorulan Sorular

Sesli komutlar Türkçe dilinde ne kadar başarılı?

Modern Flutter paketleri, Google ve Apple'ın yerel konuşma tanıma motorlarını kullandığı için Türkçe dilinde oldukça yüksek başarı oranına sahiptir. Ancak, yerel şiveler veya çok gürültülü ortamlar başarıyı düşürebilir.

Uygulama arka planda çalışırken ses dinleyebilir mi?

Evet, ancak bu işlem için platforma özel servisler (Android için Foreground Service, iOS için Background Task) kullanmanız gerekir. Aksi takdirde işletim sistemi pil tasarrufu için uygulamanızı durduracaktır.

Ses verilerini sunucuya göndermek güvenli mi?

Eğer veriyi sunucuya gönderiyorsanız, GDPR ve KVKK uyumluluğu gereği veriyi anonimleştirmeli ve güvenli bir API üzerinden iletmelisiniz. Mümkünse cihaz üzerinde işleme (On-Device) tercih edilmelidir.

Komutları nasıl daha akıllı hale getirebilirim?

Basit anahtar kelime eşleşmesi yerine, OpenAI API veya yerel bir LLM (Large Language Model) kullanarak metni analiz edebilir ve kullanıcının niyetini (intent) daha doğru tahmin edebilirsiniz.

Mikrofon izni reddedilirse ne yapmalıyım?

Kullanıcıya ayarlar menüsüne yönlendiren bir uyarı penceresi (Dialog) göstermeli ve uygulamanın neden bu izne ihtiyaç duyduğunu açıklamalısınız.

Yasal Sorumluluk Reddi: Bu rehberdeki kod örnekleri eğitim amaçlıdır. Uygulamanızda kullanacağınız sesli komut sistemlerinin güvenliği ve veri gizliliği tamamen geliştiricinin sorumluluğundadır. Kullanıcı verilerinin korunması konusunda yerel yasal düzenlemelere (KVKK vb.) uyunuz.

Sesli Komut Sistemlerinde Performans Optimizasyonu

Sesli komut algılama süreçlerinde en büyük darboğaz, cihazın CPU kullanımı ve ağ gecikmeleridir. Özellikle sürekli dinleme modunda (continuous listening) çalışan uygulamalarda, pil tüketimini minimize etmek için stratejik optimizasyonlar yapmanız gerekir.

Aktif Dinleme Sürelerini Kısıtlama

Kullanıcı uygulama içinde aktif bir işlem yapmadığı sürece mikrofonu sürekli açık tutmak, hem gizlilik risklerini artırır hem de cihazın pilini hızla tüketir. Bunun yerine, "Uyandırma Kelimesi" (Wake-word) mantığını kullanmalı veya mikrofonu yalnızca belirli bir buton tetiklendiğinde aktif etmelisiniz.

// Performans odaklı dinleme başlatma fonksiyonu
void startOptimizedListening() {
  if (!_speech.isListening) {
    _speech.listen(
      onResult: (result) => _processCommand(result.recognizedWords),
      listenMode: ListenMode.confirmation, // Kısa komutlar için optimize edilmiş mod
      cancelOnError: true,
      partialResults: false, // Sadece final sonuçları alarak işlem yükünü azaltır
    );
  }
}

Sesli Komut Sistemleri İçin Test Senaryoları

Sesli komut sistemlerinin başarısı, gürültülü ortamlarda ve farklı aksanlarda nasıl tepki verdiğine bağlıdır. Uygulamanızı yayına almadan önce aşağıdaki test matrisini uygulamanız önerilir.

Test Senaryosu Beklenen Sonuç Kritiklik
Düşük internet hızı (Edge/3G) Hata mesajı yerine "Bağlantı zayıf" uyarısı Orta
Arka plan gürültüsü (Trafik/Müzik) Komutun yanlış anlaşılması veya reddi Yüksek
Hızlı konuşma Komutun tutarlı bir şekilde ayrıştırılması Yüksek

Gürültü Filtreleme ve Ses Ön İşleme

Flutter'da doğrudan ham ses verisi üzerinde gürültü engelleme yapmak zordur. Bu nedenle, speech_to_text gibi kütüphanelerin sağladığı yerel API yeteneklerini (Native Speech Recognizer) kullanmak en verimli yöntemdir. Eğer çok spesifik bir gürültü ortamında çalışıyorsanız, ses verisini işlemeden önce bir AudioProcessor katmanı ekleyerek sesin genliğini normalize edebilirsiniz.

// Basit bir ses seviyesi kontrolü ile hatalı tetiklemeleri engelleme
void checkAudioLevel(double level) {
  // Eğer ortam sesi çok yüksekse (gürültü), komut almayı durdur
  if (level > 8.0) {
    stopListening();
    showSnackBar("Çok fazla gürültü algılandı, lütfen sessiz bir ortamda deneyin.");
  }
}

Canlı Test İpuçları

  • Farklı Cihazlar: Uygulamanızı mutlaka farklı mikrofon kalitesine sahip giriş seviyesi ve amiral gemisi cihazlarda test edin.
  • Aksan Çeşitliliği: Türkçe'nin farklı bölgelerindeki ağız yapılarını test etmek için farklı kullanıcılardan geri bildirim alın.
  • Hata Loglama: Kullanıcıların "anlaşılamayan" komutlarını (Firebase Crashlytics veya Analytics kullanarak) anonim olarak kaydedin ve bu verileri modelinizi iyileştirmek için kullanın.

Sonuç

Flutter ile sesli komut algılama sistemi kurmak, doğru araçlar ve dikkatli bir mimari ile oldukça erişilebilir bir süreçtir. Bu rehberde, temel kurulumdan hata yönetimine kadar izlemeniz gereken adımları inceledik. Bir sonraki adım olarak, sesli komutlarınıza yapay zeka entegrasyonu ekleyerek, uygulamanızın kullanıcı niyetlerini anlayan çok daha akıllı bir asistan haline gelmesini sağlayabilirsiniz.

Bu yazıya tepkinizi paylaşın:
Selin Korkmaz

Kendin yap (DIY) projeleri ve sürdürülebilir yaşam ipuçları üzerine odaklanıyorum. Okuyucularıma bütçe dostu ve yaratıcı çözüm önerileri sunmaktan keyif alıyorum.

Yorumlar (0)

Yorum Yaz