Android için ses sınıflandırma kılavuzu

MediaPipe Ses Sınıflandırıcı görevi, ses verileri üzerinde sınıflandırma gerçekleştirmenizi sağlar. Bu görevi eğitilmiş bir dizi kategoriden ses etkinliklerini tanımlamak için kullanabilirsiniz. Bu talimatlarda, Android uygulamalarıyla Ses Sınıflandırıcı'nın nasıl kullanılacağı gösterilmektedir.

Bu görevin özellikleri, modelleri ve yapılandırma seçenekleri hakkında daha fazla bilgi için Genel Bakış'a bakın.

Kod örneği

MediaPipe Görevleri örnek kodu, Android için bir Ses Sınıflandırıcı uygulamasının basit bir uygulamasıdır. Örnek, sesleri sürekli olarak sınıflandırmak için fiziksel bir Android cihazın mikrofonunu kullanır ve sınıflandırıcıyı, cihazda depolanan ses dosyalarında da çalıştırabilir.

Uygulamayı kendi Android uygulamanız için başlangıç noktası olarak kullanabilir veya mevcut bir uygulamayı değiştirirken referans olarak kullanabilirsiniz. Ses Sınıflandırıcı örnek kodu GitHub'da barındırılmaktadır.

Kodu indirme

Aşağıdaki talimatlar, git komut satırı aracını kullanarak örnek kodun yerel bir kopyasını nasıl oluşturacağınızı göstermektedir.

Örnek kodu indirmek için:

  1. Aşağıdaki komutu kullanarak git deposunu klonlayın:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. İsteğe bağlı olarak, git örneğinizi az ödeme yöntemini kullanacak şekilde yapılandırın. Böylece yalnızca Ses Sınıflandırıcı örnek uygulamasının dosyalarına sahip olursunuz:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/audio_classifier/android
    

Örnek kodun yerel bir sürümünü oluşturduktan sonra projeyi Android Studio'ya aktarabilir ve uygulamayı çalıştırabilirsiniz. Talimatlar için Android için Kurulum Kılavuzu'na bakın.

Temel bileşenler

Aşağıdaki dosyalar, bu ses sınıflandırma örnek uygulaması için önemli kodu içerir:

Kurulum

Bu bölümde, geliştirme ortamınızı kurmanın temel adımları açıklanmaktadır. Projelerinizi özel olarak Ses Sınıflandırıcı'yı kullanmak için kodlayın. Platform sürümü gereksinimleri de dahil olmak üzere, MediaPipe görevlerini kullanmak amacıyla geliştirme ortamınızı ayarlama hakkında genel bilgiler için Android için kurulum kılavuzuna bakın.

Bağımlılıklar

Ses Sınıflandırıcı, com.google.mediapipe:tasks-audio kitaplığını kullanır. Bu bağımlılığı, Android uygulaması geliştirme projenizin build.gradle dosyasına ekleyin. Gerekli bağımlılıkları aşağıdaki kodla içe aktarın:

dependencies {
    ...
    implementation 'com.google.mediapipe:tasks-audio:latest.release'
}

Model

MediaPipe Ses Sınıflandırıcı görevi, bu görevle uyumlu, eğitilmiş bir model gerektirir. Ses Sınıflandırıcı için eğitilmiş modeller hakkında daha fazla bilgi almak isterseniz göreve genel bakış Modeller bölümüne bakın.

Modeli seçip indirin ve ardından proje dizininizde depolayın:

<dev-project-root>/src/main/assets

Modelin kullandığı yolu belirtmek için BaseOptions.Builder.setModelAssetPath() yöntemini kullanın. Bu yöntem, bir sonraki bölümde yer alan kod örneğinde ele alınmaktadır.

Ses Sınıflandırıcı örnek kodunda model, AudioClassifierHelper.kt dosyasında tanımlanmıştır.

Görevi oluşturma

Görevi oluşturmak için createFromOptions işlevini kullanabilirsiniz. createFromOptions işlevi; çalıştırma modu, görünen adlar yerel ayarı, maksimum sonuç sayısı, güven eşiği ve kategori izin verilenler listesi veya reddetme listesi dahil olmak üzere yapılandırma seçeneklerini kabul eder. Yapılandırma seçenekleri hakkında daha fazla bilgi için Yapılandırmaya Genel Bakış bölümüne bakın.

Ses Sınıflandırıcı görevi şu giriş verisi türlerini destekler: ses klipleri ve ses akışları. Bir görev oluştururken giriş verisi türünüze karşılık gelen çalışma modunu belirtmeniz gerekir. Görevi nasıl oluşturacağınızı ve çıkarımı nasıl yapacağınızı görmek için giriş verisi türünüze karşılık gelen sekmeyi seçin.

Ses klipleri

AudioClassifierOptions options =
    AudioClassifierOptions.builder()
        .setBaseOptions(
            BaseOptions.builder().setModelAssetPath("model.tflite").build())
        .setRunningMode(RunningMode.AUDIO_CLIPS)
        .setMaxResults(5)
        .build();
audioClassifier = AudioClassifier.createFromOptions(context, options);
    

Ses akışı

AudioClassifierOptions options =
    AudioClassifierOptions.builder()
        .setBaseOptions(
            BaseOptions.builder().setModelAssetPath("model.tflite").build())
        .setRunningMode(RunningMode.AUDIO_STREAM)
        .setMaxResults(5)
        .setResultListener(audioClassifierResult -> {
             // Process the classification result here.
        })
        .build();
audioClassifier = AudioClassifier.createFromOptions(context, options);
    

Ses Sınıflandırıcı örnek kod uygulaması, kullanıcının işleme modları arasında geçiş yapmasını sağlar. Bu yaklaşım, görev oluşturma kodunu daha karmaşık hale getirir ve sizin kullanım alanınıza uygun olmayabilir. Mod değiştirme kodunu AudioClassifierHelper öğesinin initClassifier() işlevinde görebilirsiniz.

Yapılandırma seçenekleri

Bu görev, Android uygulamaları için aşağıdaki yapılandırma seçeneklerine sahiptir:

Seçenek Adı Açıklama Değer Aralığı Varsayılan Değer
runningMode Görevin çalışma modunu ayarlar. Ses Sınıflandırıcı'nın iki modu vardır:

AUDIO_CLIPS: Ses görevini bağımsız ses kliplerinde çalıştırma modu.

AUDIO_STREAM: Ses görevini mikrofon gibi bir ses akışında çalıştırma modu. Bu modda, sınıflandırma sonuçlarını eşzamansız olarak almak için bir işleyici ayarlamak üzere resultListener çağrılmalıdır.
{AUDIO_CLIPS, AUDIO_STREAM} AUDIO_CLIPS
displayNamesLocale Varsa görev modelinin meta verilerinde sağlanan görünen adlar için kullanılacak etiketlerin dilini ayarlar. İngilizce için varsayılan değer en şeklindedir. TensorFlow Lite Metadata Writer API'yi kullanarak özel modelin meta verilerine yerelleştirilmiş etiketler ekleyebilirsiniz Yerel ayar kodu en
maxResults İsteğe bağlı olarak döndürülecek en yüksek puanlı sınıflandırma sonuçlarının isteğe bağlı maksimum sayısını ayarlar. < 0 ise mevcut tüm sonuçlar döndürülür. Pozitif sayılar -1
scoreThreshold Model meta verilerinde belirtilen eşiği (varsa) geçersiz kılan tahmin puanı eşiğini ayarlar. Bu değerin altındaki sonuçlar reddedilir. [0,0, 1,0] Belirlenmedi
categoryAllowlist İsteğe bağlı olarak izin verilen kategori adları listesini ayarlar. Boş değilse kategori adı bu grupta yer almayan sınıflandırma sonuçları filtrelenir. Yinelenen veya bilinmeyen kategori adları yoksayılır. Bu seçenek, categoryDenylist ile birlikte kullanılamaz ve her iki sonucun da kullanılması hataya neden olur. Herhangi bir dize Belirlenmedi
categoryDenylist İzin verilmeyen kategori adlarının isteğe bağlı listesini ayarlar. Boş değilse kategori adı bu kümede yer alan sınıflandırma sonuçları filtrelenir. Yinelenen veya bilinmeyen kategori adları yoksayılır. Bu seçenek categoryAllowlist ile birlikte kullanılamaz ve her iki sonucun da kullanılması hataya neden olur. Herhangi bir dize Belirlenmedi
resultListener Ses Sınıflandırıcı, ses akışı modundayken sonuç işleyiciyi, sınıflandırma sonuçlarını eşzamansız olarak alacak şekilde ayarlar. Yalnızca çalıştırma modu AUDIO_STREAM olarak ayarlandığında kullanılabilir Yok Belirlenmedi
errorListener İsteğe bağlı bir hata işleyici ayarlar. Yok Belirlenmedi

Verileri hazırlama

Ses Sınıflandırıcı, ses klipleriyle ve ses akışlarıyla çalışır. Görev; yeniden örnekleme, arabelleğe alma ve çerçeveleme dahil, veri girişi ön işlemesini yönetir. Ancak, giriş ses verilerini Ses Sınıflandırıcı görevine iletmeden önce bir com.google.mediapipe.tasks.components.containers.AudioData nesnesine dönüştürmeniz gerekir.

Ses klipleri

import com.google.mediapipe.tasks.components.containers.AudioData;

// Load an audio on the user’s device as a float array.

// Convert a float array to a MediaPipe’s AudioData object.
AudioData audioData =
    AudioData.create(
        AudioData.AudioDataFormat.builder()
            .setNumOfChannels(numOfChannels)
            .setSampleRate(sampleRate)
            .build(),
        floatData.length);
audioData.load(floatData);
    

Ses akışı

import android.media.AudioRecord;
import com.google.mediapipe.tasks.components.containers.AudioData;

AudioRecord audioRecord =
    audioClassifier.createAudioRecord(/* numChannels= */ 1, /* sampleRate= */ 16000);
audioRecord.startRecording();

...

// To get a one second clip from the AudioRecord object:
AudioData audioData =
    AudioData.create(
        16000 /*sample counts per second*/);
        AudioData.AudioDataFormat.create(audioRecord.getFormat()),
audioData.load(audioRecord)
    

Görevi çalıştırma

Çıkarımları tetiklemek için koşu modunuza karşılık gelen classify işlevini çağırabilirsiniz. Audio Classifier API, giriş ses verilerinde tanınan ses etkinlikleri için olası kategorileri döndürür.

Ses klipleri

AudioClassifierResult classifierResult = audioClassifier.classify(audioData);
    

Ses akışı

// Run inference on the audio block. The classifications results will be available
// via the `resultListener` provided in the `AudioClassifierOptions` when
// the audio classifier was created.
audioClassifier.classifyAsync(audioBlock, timestampMs);
    

Aşağıdakileri göz önünde bulundurun:

  • Ses akışı modunda çalışırken, çıkarım için akış içindeki hangi ses verilerinin kullanıldığını izlemek üzere Ses Sınıflandırıcı görevine bir zaman damgası eklemeniz gerekir.
  • Ses klipleri modelinde çalışırken, Ses Sınıflandırıcı görevi giriş sesini işlemeyi bitirene kadar mevcut ileti dizisini engeller. Kullanıcı arayüzü yanıtlarını engellemekten kaçınmak için işlemeyi bir arka plan iş parçacığında yürütün.

Ses klipleriyle Ses Sınıflandırıcı çalıştırmayla ilgili bir örnek görebilirsiniz. Kod örneğindeki AudioClassifierHelper sınıfına bakın.

Sonuçları işleme ve görüntüleme

Bir çıkarım yaptıktan sonra Ses Sınıflandırıcı görevi, giriş sesindeki ses etkinlikleri için olası kategorilerin bir listesini döndürür. Aşağıdaki listede, bu görevden elde edilen çıkış verilerinin bir örneği gösterilmektedir:

AudioClassifierResult:
  Timestamp in microseconds: 100
  ClassificationResult #0:
    Timestamp in microseconds: 100  
    Classifications #0 (single classification head):
      head index: 0
      category #0:
        category name: "Speech"
        score: 0.6
        index: 0
      category #1:
        category name: "Music"
        score: 0.2
        index: 1

Bir Android uygulamasında görev, bir ses etkinliğiyle ilgili tahminleri (kategori etiketi ve güven puanı dahil) temsil eden AudioClassifierResult nesnelerinin listesini içeren bir ClassificationResult döndürür.

Ses klipleri

// In the audio clips mode, the classification results are for the entire audio
// clip. The results are timestamped AudioClassifierResult objects, each
// classifying an interval of the entire audio clip that starts at
// ClassificationResult.timestampMs().get().

for (ClassificationResult result : audioClassifierResult.classificationResults()) {
  // Audio interval start timestamp:
  result.timestampMs().get();
  // Classification result of the audio interval.
  result.classifications();
}
    

Ses akışı

// In the audio stream mode, the classification results list only contains one
// element, representing the classification result of the audio block that
// starts at ClassificationResult.timestampMs in the audio stream.

ClassificationResult result = audioClassifierResult.classificationResults().get(0);
// The audio block start timestamp
audioClassifierResult.timestampMs();
// Alternatively, the same timestamp can be retrieved from
// result.timestampMs().get();

// Classification result.
result.classifications();
    

Bu görevden döndürülen sınıflandırma sonuçlarının nasıl görüntüleneceğini, kod örneğinin ProbabilitiesAdapter sınıfında görebilirsiniz.