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 yapmanıza olanak tanır. Şunları yapabilirsiniz: bu görevi, eğitilmiş bir grup kategoriden ses etkinliklerini belirlemek için kullanın. Bu talimatlarında Android uygulamalarıyla Ses Sınıflandırıcı'nın nasıl kullanılacağı gösterilmektedir.

Özellikler, modeller ve yapılandırma seçenekleri hakkında daha fazla bilgi Bu görev hakkında daha fazla bilgi için Genel Bakış'ı inceleyin.

Kod örneği

MediaPipe Tasks örnek kodu, bir Ses Sınıflandırıcı'nın basit bir uygulamasıdır Android için uygulama. Örnekte, şu işlemler için fiziksel bir Android cihazdaki mikrofon kullanılmaktadır: sesleri sürekli olarak sınıflandırır ve sınıflandırıcıyı ses dosyalarında da çalıştırabilir cihazınızda depolanır.

Uygulamayı kendi Android uygulamanız için başlangıç noktası olarak kullanabilir veya buna başvurabilirsiniz mevcut bir uygulamada değişiklik yaparken. Ses Sınıflandırıcı örnek kodu, GitHub'a gidin.

Kodu indirme

Aşağıdaki talimatlarda, örneğin yerel bir kopyasını nasıl oluşturacağınız gösterilmektedir kodu oluşturmak için git komut satırı aracını kullanın.

Ö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 seyrek ödeme yöntemini kullanacak şekilde yapılandırın, Böylece, yalnızca Ses Sınıflandırıcı örnek uygulamasına ilişkin dosyalara sahip olursunuz:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/audio_classifier/android
    

Örnek kodun yerel sürümünü oluşturduktan sonra projeyi içe aktarabilirsiniz. Android Studio'ya gidip uygulamayı çalıştırın. Talimatlar için Android için Kurulum Kılavuzu.

Temel bileşenler

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

Kurulum

Bu bölümde, geliştirme ortamınızı ve ayarlarınızı yönetmeyle ilgili Ses Sınıflandırıcı'yı kullanmak için özel olarak kod projeleri. Şu konularda genel bilgi için: dahil olmak üzere MediaPipe görevlerini kullanmak için geliştirme ortamınızı daha fazla bilgi için Android için kurulum kılavuzu.

Bağımlılıklar

Ses Sınıflandırıcı, com.google.mediapipe:tasks-audio kitaplığını kullanır. Bunu ekle dosyanızın build.gradle dosyasına bağımlılığı Android uygulama geliştirme projesi. Gerekli bağımlılıkları şu kodu kullanın:

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

Model

MediaPipe Ses Sınıflandırıcı görevi bu görevi görebilir. Ses Sınıflandırıcı için eğitilmiş mevcut modeller hakkında daha fazla bilgi için bkz. göreve genel bakış Modeller bölümü.

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

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

Yolu belirtmek için BaseOptions.Builder.setModelAssetPath() yöntemini kullanın modeli tarafından kullanılır. Bu yöntem, bölümüne ekleyin.

Ses Sınıflandırıcı örnek kodu, model, AudioClassifierHelper.kt dosyası olarak kaydedebilirsiniz.

Görevi oluşturma

Görevi oluşturmak için createFromOptions işlevini kullanabilirsiniz. İlgili içeriği oluşturmak için kullanılan createFromOptions işlevi, çalıştırma da dahil olmak üzere yapılandırma seçeneklerini kabul eder mod, görünen adlar yerel ayarı, maksimum sonuç sayısı, güven eşiği, izin verilenler listesi veya ret listesi ekleyin. Yapılandırma hakkında daha fazla bilgi için Yapılandırmaya Genel Bakış bölümüne göz atın.

Ses Sınıflandırıcı görevi şu giriş verisi türlerini destekler: ses klipleri ve ses akışları kullanılabilir. Hedefe uygun koşu modunu giriş veri türünüzü gözden geçirmelisiniz. Şuna karşılık gelen sekmeyi seçin: giriş veri türünüzü inceleyerek görevi nasıl oluşturacağınızı ve çıkarımda bulunacağınızı öğrenin.

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 yayını

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 farklı olabilir. Bu yaklaşım, görev oluşturma kodunu daha karmaşık hale kullanım alanınıza uygun olmayabilir. Mod geçiş kodunu görebilirsiniz initClassifier() AudioClassifierHelper

Yapılandırma seçenekleri

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

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

. AUDIO_CLIPS: Bağımsız ses kliplerinde ses görevini çalıştırma modu.
.
. AUDIO_STREAM: Ses görevinin mikrofon gibi bir ses akışında çalıştırılması modu. Bu modda, resultListener, sınıflandırma sonuçlarını almak üzere bir dinleyici ayarlamak için çağrıldı eşzamansız olarak ayarlayabilirsiniz.
{AUDIO_CLIPS, AUDIO_STREAM} AUDIO_CLIPS
displayNamesLocale görev modelinin meta verileri (varsa). Şunun için varsayılan: en İngilizce. Özel bir modelin meta verilerine yerelleştirilmiş etiketler ekleyebilirsiniz TensorFlow Lite Metadata Writer API'yi kullanarak Yerel ayar kodu en
maxResults İsteğe bağlı maksimum puanlı sınıflandırma sonucu sayısını şu değere ayarlar: dön. < 0 ise tüm mevcut sonuçlar döndürülür. Pozitif sayılar -1
scoreThreshold Şu kriterde sağlanan tahmini geçersiz kılan bir tahmin puanı eşiğini belirler: model meta verileri (varsa). Bu değerin altındaki sonuçlar reddedilir. [0,0, 1,0] Ayarlanmadı
categoryAllowlist İzin verilen kategori adlarının isteğe bağlı listesini ayarlar. Boş değilse kategori adı bu kümede bulunmayan sınıflandırma sonuçları filtrelendi. Yinelenen veya bilinmeyen kategori adları yoksayılır. Bu seçenek categoryDenylist ile birlikte kullanılamaz ve her ikisi de hataya neden olur. Tüm dizeler Ayarlanmadı
categoryDenylist İzin verilmeyen kategori adlarının isteğe bağlı listesini ayarlar. Eğer Boş olmayan, kategori adı bu kümede bulunan sınıflandırma sonuçları filtrelenir çıkar. Yinelenen veya bilinmeyen kategori adları yoksayılır. Bu seçenek birlikte hariç tutmanın yanı sıra her iki sonucun da hatalı olarak kullanılmasıdır.categoryAllowlist Tüm dizeler Ayarlanmadı
resultListener Sonuç işleyiciyi sınıflandırma sonuçlarını alacak şekilde ayarlar Ses Sınıflandırıcı ses akışında olduğunda eşzamansız olarak yatırım yapmanız önemlidir. Yalnızca koşu modu AUDIO_STREAM olarak ayarlandığında kullanılabilir Yok Ayarlanmadı
errorListener İsteğe bağlı bir hata işleyici ayarlar. Yok Ayarlanmadı

Verileri hazırlama

Ses Sınıflandırıcı, ses klipleri ve ses akışlarıyla çalışır. Görev yeniden örnekleme, arabelleğe alma ve çerçeveleme dahil olmak üzere veri girişi ön işlemesini yönetir. Ancak, giriş ses verilerini com.google.mediapipe.tasks.components.containers.AudioData nesnesini tanımlayın.

Ses klipleri

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

// Load an audio on the users device as a float array.

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

Ses yayını

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

Koşu modunuza karşılık gelen classify işlevini çağırarak şunları yapabilirsiniz: çıkarımları tetikler. Audio Classifier API, olabilecek tüm kategoriler için giriş ses verilerinde algılanan ses etkinlikleri.

Ses klipleri

AudioClassifierResult classifierResult = audioClassifier.classify(audioData);
    

Ses yayını

// 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 yayını modunda çalışırken ayrıca Hangi ses verilerini takip ettiğini belirten bir zaman damgası içeren Ses Sınıflandırıcı görevi bu akış çıkarım için kullanılmıştır.
  • Ses klibi modelinde çalışırken Ses Sınıflandırıcı görevi, devam eder. Kullanıcı arayüzü yanıtlarının engellenmesini önlemek için arka plan ileti dizisi.

Ses klipleriyle Ses Sınıflandırıcı'nın çalıştırıldığına dair bir örnek görebilirsiniz. AudioClassifierHelper sınıf kod örneği.

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

Bir çıkarım çalıştırdıktan sonra Ses Sınıflandırıcı görevi, mümkün olan giriş sesindeki sesli etkinliklere ilişkin kategorilerdir. Aşağıdaki giriş , bu görevdeki çıkış verilerinin bir örneğini gösterir:

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, şunları içeren bir ClassificationResult döndürür: AudioClassifierResult nesneden oluşan bir liste tüm sesli etkinlikleri, yani kategori etiketi ve güven puanı gibi bilgileri içerir.

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 yayını

// 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();
    

Sınıflandırmanın nasıl görüntüleneceğine dair şunun ProbabilitiesAdapter sınıfında bu görevden sonuç döndürüldü: kod örneği.