Android için ses ve kelime tanıma

Bu eğitim, bir Android uygulamasında sesleri ve konuşulan kelimeleri tanımak için TensorFlow Lite'ı önceden oluşturulmuş makine öğrenimi modelleriyle nasıl kullanacağınızı gösterir. Bu eğitimde gösterilenlere benzer ses sınıflandırma modelleri, etkinliği tespit etmek, eylemleri tanımlamak veya sesli komutları tanımak için kullanılabilir.

Ses tanıma animasyonlu demosu Bu eğitimde örnek kodu nasıl indireceğiniz, projeyi Android Studio'ya nasıl yükleyeceğiniz gösterilir ve bu işlevselliği kendi uygulamanıza eklemeye başlayabilmeniz için kod örneğinin önemli bölümleri açıklanır. Örnek uygulama kodu, ses verisi kaydının ve ön işlemesinin çoğunu gerçekleştiren TensorFlow Task Library for Audio'yu kullanır. Sesin makine öğrenimi modelleriyle kullanılmak üzere nasıl önceden işlendiği hakkında daha fazla bilgi için bkz. Ses Verilerini Hazırlama ve Artırma .

Makine öğrenimi ile ses sınıflandırması

Bu eğitimdeki makine öğrenimi modeli, bir Android cihazda mikrofonla kaydedilen ses örneklerindeki sesleri veya kelimeleri tanır. Bu eğitimdeki örnek uygulama, sesleri tanıyan bir model olan YAMNet/classifier ile TensorFlow Lite Model Maker aracı kullanılarak eğitilmiş belirli konuşulan sözcükleri tanıyan bir model arasında geçiş yapmanıza olanak tanır. Modeller, klip başına 15600 ayrı örnek içeren ve yaklaşık 1 saniye uzunluğundaki ses klipleri üzerinde tahminler çalıştırıyor.

Kurulum ve çalıştırma örneği

Bu eğitimin ilk bölümünde örneği GitHub'dan indirip Android Studio'yu kullanarak çalıştıracaksınız. Bu eğitimin aşağıdaki bölümleri, örneğin ilgili bölümlerini inceliyor; böylece bunları kendi Android uygulamalarınıza uygulayabilirsiniz.

Sistem gereksinimleri

  • Android Studio sürüm 2021.1.1 (Bumblebee) veya üzeri.
  • Android SDK sürüm 31 veya üzeri
  • Geliştirici modunun etkin olduğu, minimum işletim sistemi sürümü SDK 24'e (Android 7.0 - Nougat) sahip Android cihazı.

Örnek kodu alın

Örnek kodun yerel bir kopyasını oluşturun. Android Studio'da proje oluşturup örnek uygulamayı çalıştırmak için bu kodu kullanacaksınız.

Örnek kodu klonlamak ve ayarlamak için:

  1. Git deposu
    git clone https://github.com/tensorflow/examples.git
    
    klonlayın
  2. İsteğe bağlı olarak, git örneğinizi seyrek ödeme kullanacak şekilde yapılandırın, böylece yalnızca örnek uygulamaya ait dosyalara sahip olursunuz:

    cd examples
    git sparse-checkout init --cone
    git sparse-checkout set lite/examples/audio_classification/android
    

Projeyi içe aktarın ve çalıştırın

İndirilen örnek koddan bir proje oluşturun, projeyi derleyin ve ardından çalıştırın.

Örnek kod projesini içe aktarmak ve oluşturmak için:

  1. Android Studio'yu başlatın.
  2. Android Studio'da Dosya > Yeni > Projeyi İçe Aktar'ı seçin.
  3. build.gradle dosyasını içeren örnek kod dizinine gidin ( .../examples/lite/examples/audio_classification/android/build.gradle ) ve bu dizini seçin.

Doğru dizini seçerseniz Android Studio yeni bir proje oluşturur ve onu derler. Bu işlem, bilgisayarınızın hızına ve Android Studio'yu başka projeler için kullanıp kullanmadığınıza bağlı olarak birkaç dakika sürebilir. Derleme tamamlandığında Android Studio, Derleme Çıktısı durum panelinde OLUŞTURMA BUILD SUCCESSFUL mesajını görüntüler.

Projeyi çalıştırmak için:

  1. Android Studio'dan Run > Run 'app' seçeneğini seçerek projeyi çalıştırın.
  2. Uygulamayı test etmek için mikrofonlu bağlı bir Android cihazı seçin.

Sonraki bölümlerde, bu örnek uygulamayı referans noktası olarak kullanarak, bu işlevselliği kendi uygulamanıza eklemek için mevcut projenizde yapmanız gereken değişiklikleri gösterir.

Proje bağımlılıkları ekleyin

Kendi uygulamanızda, TensorFlow Lite makine öğrenimi modellerini çalıştırmak için belirli proje bağımlılıkları eklemeniz ve ses gibi standart veri formatlarını, kullandığınız model tarafından işlenebilecek bir tensör veri formatına dönüştüren yardımcı program işlevlerine erişmeniz gerekir.

Örnek uygulama aşağıdaki TensorFlow Lite kitaplıklarını kullanır:

Aşağıdaki talimatlar, gerekli proje bağımlılıklarını kendi Android uygulama projenize nasıl ekleyeceğinizi gösterir.

Modül bağımlılıkları eklemek için:

  1. TensorFlow Lite kullanan modülde, modülün build.gradle dosyasını aşağıdaki bağımlılıkları içerecek şekilde güncelleyin. Örnek kodda bu dosya burada bulunur: .../examples/lite/examples/audio_classification/android/build.gradle

    dependencies {
    ...
        implementation 'org.tensorflow:tensorflow-lite-task-audio'
    }
    
  2. Android Studio'da, şunu seçerek proje bağımlılıklarını senkronize edin: File > Sync Project with Gradle Files .

ML modelini başlat

Android uygulamanızda, tahminleri modelle çalıştırmadan önce TensorFlow Lite makine öğrenimi modelini parametrelerle başlatmanız gerekir. Bu başlatma parametreleri modele bağlıdır ve tahminler için varsayılan minimum doğruluk eşikleri ve modelin tanıyabileceği kelimeler veya sesler için etiketler gibi ayarları içerebilir.

TensorFlow Lite modeli, modeli içeren bir *.tflite dosyası içerir. Model dosyası tahmin mantığını içerir ve genellikle tahmin sınıfı adları gibi tahmin sonuçlarının nasıl yorumlanacağına ilişkin meta verileri içerir. Model dosyaları, kod örneğinde olduğu gibi, geliştirme projenizin src/main/assets dizininde saklanmalıdır:

  • <project>/src/main/assets/yamnet.tflite

Kolaylık ve kod okunabilirliği için örnek, modelin ayarlarını tanımlayan bir tamamlayıcı nesneyi bildirir.

Modeli uygulamanızda başlatmak için:

  1. Modelin ayarlarını tanımlamak için bir tamamlayıcı nesne oluşturun:

    companion object {
      const val DISPLAY_THRESHOLD = 0.3f
      const val DEFAULT_NUM_OF_RESULTS = 2
      const val DEFAULT_OVERLAP_VALUE = 0.5f
      const val YAMNET_MODEL = "yamnet.tflite"
      const val SPEECH_COMMAND_MODEL = "speech.tflite"
    }
    
  2. Bir AudioClassifier.AudioClassifierOptions nesnesi oluşturarak modelin ayarlarını oluşturun:

    val options = AudioClassifier.AudioClassifierOptions.builder()
      .setScoreThreshold(classificationThreshold)
      .setMaxResults(numOfResults)
      .setBaseOptions(baseOptionsBuilder.build())
      .build()
    
  3. Modeli içeren bir TensorFlow Lite AudioClassifier nesnesi oluşturmak için bu ayarlar nesnesini kullanın:

    classifier = AudioClassifier.createFromFileAndOptions(context, "yamnet.tflite", options)
    

Donanım hızlandırmayı etkinleştir

Uygulamanızda bir TensorFlow Lite modelini başlatırken, modelin tahmin hesaplamalarını hızlandırmak için donanım hızlandırma özelliklerini kullanmayı düşünmelisiniz. TensorFlow Lite delegeleri , grafik işleme birimi (GPU'lar) veya tensör işleme birimleri (TPU'lar) gibi bir mobil cihazda özel işleme donanımını kullanarak makine öğrenimi modellerinin yürütülmesini hızlandıran yazılım modülleridir. Kod örneği, model yürütmenin donanım hızlandırmasını yönetmek için NNAPI Temsilcisini kullanır:

val baseOptionsBuilder = BaseOptions.builder()
   .setNumThreads(numThreads)
...
when (currentDelegate) {
   DELEGATE_CPU -> {
       // Default
   }
   DELEGATE_NNAPI -> {
       baseOptionsBuilder.useNnapi()
   }
}

TensorFlow Lite modellerini çalıştırmak için delegelerin kullanılması önerilir ancak zorunlu değildir. Temsilcileri TensorFlow Lite ile kullanma hakkında daha fazla bilgi için bkz. TensorFlow Lite Temsilcileri .

Model için veri hazırlama

Android uygulamanızda kodunuz, ses klipleri gibi mevcut verileri modeliniz tarafından işlenebilecek bir Tensor veri formatına dönüştürerek yorumlanmak üzere modele veri sağlar. Bir modele ilettiğiniz Tensördeki verilerin, modeli eğitmek için kullanılan veri formatıyla eşleşen belirli boyutlara veya şekle sahip olması gerekir.

Bu kod örneğinde kullanılan YAMNet/sınıflandırıcı modeli ve özelleştirilmiş konuşma komutları modelleri, 0,975 saniyelik kliplerde (15600 örnek) 16 kHz'de kaydedilen tek kanallı veya mono ses kliplerini temsil eden Tensor veri nesnelerini kabul eder. Yeni ses verileri üzerinde tahminler çalıştırarak uygulamanızın bu ses verilerini bu boyut ve şekildeki Tensor veri nesnelerine dönüştürmesi gerekir. TensorFlow Lite Görev Kitaplığı Ses API'si veri dönüşümünü sizin için yönetir.

Örnek kod AudioClassificationHelper sınıfında uygulama, bir Android AudioRecord nesnesi kullanarak cihaz mikrofonlarından canlı ses kaydeder. Kod, modele uygun bir örnekleme oranında ses kaydedecek nesneyi oluşturmak ve yapılandırmak için AudioClassifier'ı kullanır. Kod ayrıca dönüştürülmüş ses verilerini depolamak üzere bir TensorAudio nesnesi oluşturmak için AudioClassifier'ı kullanır. Daha sonra TensorAudio nesnesi analiz için modele iletilir.

ML modeline ses verileri sağlamak için:

  • Bir TensorAudio nesnesi ve bir AudioRecord nesnesi oluşturmak için AudioClassifier nesnesini kullanın:

    fun initClassifier() {
    ...
      try {
        classifier = AudioClassifier.createFromFileAndOptions(context, currentModel, options)
        // create audio input objects
        tensorAudio = classifier.createInputTensorAudio()
        recorder = classifier.createAudioRecord()
      }
    

Tahminleri çalıştır

Android uygulamanızda, bir AudioRecord nesnesini ve bir TensorAudio nesnesini bir AudioClassifier nesnesine bağladıktan sonra, bir tahmin veya çıkarım oluşturmak için modeli bu verilere karşı çalıştırabilirsiniz. Bu öğreticinin örnek kodu, canlı olarak kaydedilmiş bir ses giriş akışındaki klipler üzerinde belirli bir hızda tahminler çalıştırır.

Model yürütme önemli miktarda kaynak tükettiğinden, ML model tahminlerini ayrı bir arka plan iş parçacığında çalıştırmak önemlidir. Örnek uygulama, model işlemeyi uygulamanın diğer işlevlerinden ayırmak için bir [ScheduledThreadPoolExecutor](https://developer.android.com/reference/java/util/concurrent/ScheduledThreadPoolExecutor) nesnesini kullanır.

Kelimeler gibi net bir başlangıcı ve sonu olan sesleri tanıyan ses sınıflandırma modelleri, örtüşen ses kliplerini analiz ederek gelen bir ses akışı hakkında daha doğru tahminler üretebilir. Bu yaklaşım, modelin bir klibin sonunda kesilen kelimelere ilişkin tahminlerin kaçırılmasını önlemesine yardımcı olur. Örnek uygulamada, bir tahmini her çalıştırdığınızda kod, ses kayıt arabelleğinden en son 0,975 saniyelik klibi alır ve analiz eder. Model analizi iş parçacığı yürütme havuzu interval değerini, analiz edilen kliplerin uzunluğundan daha kısa bir uzunluğa ayarlayarak, modelin çakışan ses kliplerini analiz etmesini sağlayabilirsiniz. Örneğin, modeliniz 1 saniyelik klipleri analiz ediyorsa ve aralığı 500 milisaniyeye ayarlarsanız, model her seferinde önceki klibin son yarısını ve 500 milisaniyelik yeni ses verilerini analiz ederek %50'lik bir klip analizi çakışması oluşturur.

Tahminleri ses verileri üzerinde çalıştırmaya başlamak için:

  1. Model için ses kaydını başlatmak için AudioClassificationHelper.startAudioClassification() yöntemini kullanın:

    fun startAudioClassification() {
      if (recorder.recordingState == AudioRecord.RECORDSTATE_RECORDING) {
        return
      }
      recorder.startRecording()
    }
    
  2. ScheduledThreadPoolExecutor nesnesinde sabit bir hız interval ayarlayarak modelin ses kliplerinden ne sıklıkta çıkarım oluşturacağını ayarlayın:

    executor = ScheduledThreadPoolExecutor(1)
    executor.scheduleAtFixedRate(
      classifyRunnable,
      0,
      interval,
      TimeUnit.MILLISECONDS)
    
  3. Yukarıdaki kodda bulunan classifyRunnable nesnesi, kaydediciden mevcut en son ses verilerini yükleyen ve bir tahmin gerçekleştiren AudioClassificationHelper.classifyAudio() yöntemini yürütür:

    private fun classifyAudio() {
      tensorAudio.load(recorder)
      val output = classifier.classify(tensorAudio)
      ...
    }
    

Tahmin işlemeyi durdur

Uygulamanızın ses işleme Parçası veya Etkinliği odağı kaybettiğinde uygulama kodunuzun ses sınıflandırması yapmayı bıraktığından emin olun. Bir makine öğrenimi modelini sürekli olarak çalıştırmak, Android cihazın pil ömrü üzerinde önemli bir etkiye sahiptir. Ses kaydını ve tahmin işlemeyi durdurmak için ses sınıflandırmasıyla ilişkili Android etkinliğinin veya parçasının onPause() yöntemini kullanın.

Ses kaydını ve sınıflandırmayı durdurmak için:

  • Aşağıda AudioFragment sınıfında gösterildiği gibi, kaydı ve model yürütmeyi durdurmak için AudioClassificationHelper.stopAudioClassification() yöntemini kullanın:

    override fun onPause() {
      super.onPause()
      if (::audioHelper.isInitialized ) {
        audioHelper.stopAudioClassification()
      }
    }
    

Model çıktısını işle

Android uygulamanızda, bir ses klibini işledikten sonra model, ek iş mantığını yürüterek, sonuçları kullanıcıya görüntüleyerek veya başka eylemler gerçekleştirerek uygulama kodunuzun işlemesi gereken tahminlerin bir listesini üretir. Herhangi bir TensorFlow Lite modelinin çıktısı, ürettiği tahminlerin sayısına (bir veya daha fazla) ve her tahmin için tanımlayıcı bilgilere göre değişir. Örnek uygulamadaki modellerde tahminler ya tanınan seslerin ya da kelimelerin bir listesidir. Kod örneğinde kullanılan AudioClassifier seçenekleri nesnesi , ML modelini başlatma bölümünde gösterildiği gibi setMaxResults() yöntemiyle maksimum tahmin sayısını ayarlamanıza olanak tanır.

Modelden tahmin sonuçlarını almak için:

  1. AudioClassifier nesnesinin classify() yönteminin sonuçlarını alın ve bunları dinleyici nesnesine iletin (kod referansı):

    private fun classifyAudio() {
      ...
      val output = classifier.classify(tensorAudio)
      listener.onResult(output[0].categories, inferenceTime)
    }
    
  2. İş mantığını yürüterek veya sonuçları kullanıcıya görüntüleyerek çıktıyı işlemek için dinleyicinin onResult() işlevini kullanın:

    private val audioClassificationListener = object : AudioClassificationListener {
      override fun onResult(results: List<Category>, inferenceTime: Long) {
        requireActivity().runOnUiThread {
          adapter.categoryList = results
          adapter.notifyDataSetChanged()
          fragmentAudioBinding.bottomSheetLayout.inferenceTimeVal.text =
            String.format("%d ms", inferenceTime)
        }
      }
    

Bu örnekte kullanılan model, sınıflandırılmış ses veya kelime için bir etiket içeren bir tahmin listesi ve tahminin güvenirliğini temsil eden bir Kayan Nokta olarak 0 ile 1 arasında bir tahmin puanı oluşturur; 1, en yüksek güven derecesidir. Genel olarak, puanı %50'nin (0,5) altında olan tahminler sonuçsuz kabul edilir. Ancak düşük değerli tahmin sonuçlarını nasıl ele alacağınız size ve uygulamanızın ihtiyaçlarına bağlıdır.

Model bir dizi tahmin sonucu döndürdüğünde uygulamanız, sonucu kullanıcınıza sunarak veya ek mantık yürüterek bu tahminlere göre hareket edebilir. Örnek kodda uygulama, tanımlanan sesleri veya kelimeleri uygulama kullanıcı arayüzünde listeler.

Sonraki adımlar

Ses işleme için ek TensorFlow Lite modellerini TensorFlow Hub'da ve Önceden eğitilmiş modeller kılavuz sayfasında bulabilirsiniz. TensorFlow Lite ile mobil uygulamanızda makine öğrenimini uygulamaya ilişkin daha fazla bilgi için TensorFlow Lite Geliştirici Kılavuzu'na bakın.