Audioklassifikatoren einbinden

Die Audio-Klassifizierung ist ein häufiger Anwendungsfall von maschinellem Lernen, um die Soundtypen zu klassifizieren. So kann sie beispielsweise Vogelarten anhand ihrer Gesänge identifizieren.

Mit der Task Library AudioClassifier API können Sie Ihre benutzerdefinierten oder vortrainierten Audio-Klassifizierer in Ihrer mobilen App bereitstellen.

Wichtige Funktionen der AudioClassifier API

  • Verarbeitung von Audioeingaben, z.B. Konvertierung von PCM-16-Bit-Codierung in PCM-Float-Codierung und Bearbeitung des Audio-Ringpuffers.

  • Gebietsschema für Labelkarte.

  • Unterstützung von Multi-Head-Klassifizierungsmodellen.

  • Unterstützt die Klassifizierung mit einem einzelnen und mehreren Labels.

  • Schwellenwert für die Punktzahl zum Filtern von Ergebnissen.

  • Die k besten Klassifizierungsergebnisse.

  • Zulassungs- und Sperrliste für Labels.

Unterstützte Modelle für die Audio-Klassifizierung

Die folgenden Modelle sind garantiert mit der AudioClassifier API kompatibel.

Inferenz in Java ausführen

Ein Beispiel für die Verwendung von AudioClassifier in einer Android-App finden Sie in der Referenz-App zur Audio-Klassifizierung.

Schritt 1: Gradle-Abhängigkeit und andere Einstellungen importieren

Kopieren Sie die Modelldatei .tflite in das Assets-Verzeichnis des Android-Moduls, in dem das Modell ausgeführt wird. Geben Sie an, dass die Datei nicht komprimiert werden soll, und fügen Sie die TensorFlow Lite-Bibliothek der build.gradle-Datei des Moduls hinzu:

android {
    // Other settings

    // Specify that the tflite file should not be compressed when building the APK package.
    aaptOptions {
        noCompress "tflite"
    }
}

dependencies {
    // Other dependencies

    // Import the Audio Task Library dependency
    implementation 'org.tensorflow:tensorflow-lite-task-audio:0.4.4'
    // Import the GPU delegate plugin Library for GPU inference
    implementation 'org.tensorflow:tensorflow-lite-gpu-delegate-plugin:0.4.4'
}

Schritt 2: Modell verwenden

// Initialization
AudioClassifierOptions options =
    AudioClassifierOptions.builder()
        .setBaseOptions(BaseOptions.builder().useGpu().build())
        .setMaxResults(1)
        .build();
AudioClassifier classifier =
    AudioClassifier.createFromFileAndOptions(context, modelFile, options);

// Start recording
AudioRecord record = classifier.createAudioRecord();
record.startRecording();

// Load latest audio samples
TensorAudio audioTensor = classifier.createInputTensorAudio();
audioTensor.load(record);

// Run inference
List<Classifications> results = audioClassifier.classify(audioTensor);

Weitere Optionen zum Konfigurieren von AudioClassifier finden Sie im Quellcode und in der Javadoc.

Inferenz auf iOS-Geräten ausführen

Schritt 1: Abhängigkeiten installieren

Die Task Library unterstützt die Installation mit CocoaPods. Prüfen Sie, ob CocoaPods auf Ihrem System installiert ist. Eine Anleitung finden Sie im CocoaPods-Installationsleitfaden.

Weitere Informationen zum Hinzufügen von Pods zu einem Xcode-Projekt finden Sie im CocoaPods-Leitfaden.

Fügen Sie den TensorFlowLiteTaskAudio-Pod in die Podfile ein.

target 'MyAppWithTaskAPI' do
  use_frameworks!
  pod 'TensorFlowLiteTaskAudio'
end

Achten Sie darauf, dass das .tflite-Modell, das Sie für die Inferenz verwenden, in Ihrem App-Bundle enthalten ist.

Schritt 2: Modell verwenden

Swift

// Imports
import TensorFlowLiteTaskAudio
import AVFoundation

// Initialization
guard let modelPath = Bundle.main.path(forResource: "sound_classification",
                                            ofType: "tflite") else { return }

let options = AudioClassifierOptions(modelPath: modelPath)

// Configure any additional options:
// options.classificationOptions.maxResults = 3

let classifier = try AudioClassifier.classifier(options: options)

// Create Audio Tensor to hold the input audio samples which are to be classified.
// Created Audio Tensor has audio format matching the requirements of the audio classifier.
// For more details, please see:
// https://github.com/tensorflow/tflite-support/blob/master/tensorflow_lite_support/ios/task/audio/core/audio_tensor/sources/TFLAudioTensor.h
let audioTensor = classifier.createInputAudioTensor()

// Create Audio Record to record the incoming audio samples from the on-device microphone.
// Created Audio Record has audio format matching the requirements of the audio classifier.
// For more details, please see:
https://github.com/tensorflow/tflite-support/blob/master/tensorflow_lite_support/ios/task/audio/core/audio_record/sources/TFLAudioRecord.h
let audioRecord = try classifier.createAudioRecord()

// Request record permissions from AVAudioSession before invoking audioRecord.startRecording().
AVAudioSession.sharedInstance().requestRecordPermission { granted in
    if granted {
        DispatchQueue.main.async {
            // Start recording the incoming audio samples from the on-device microphone.
            try audioRecord.startRecording()

            // Load the samples currently held by the audio record buffer into the audio tensor.
            try audioTensor.load(audioRecord: audioRecord)

            // Run inference
            let classificationResult = try classifier.classify(audioTensor: audioTensor)
        }
    }
}

Objective-C

// Imports
#import <TensorFlowLiteTaskAudio/TensorFlowLiteTaskAudio.h>
#import <AVFoundation/AVFoundation.h>

// Initialization
NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"sound_classification" ofType:@"tflite"];

TFLAudioClassifierOptions *options =
    [[TFLAudioClassifierOptions alloc] initWithModelPath:modelPath];

// Configure any additional options:
// options.classificationOptions.maxResults = 3;

TFLAudioClassifier *classifier = [TFLAudioClassifier audioClassifierWithOptions:options
                                                                          error:nil];

// Create Audio Tensor to hold the input audio samples which are to be classified.
// Created Audio Tensor has audio format matching the requirements of the audio classifier.
// For more details, please see:
// https://github.com/tensorflow/tflite-support/blob/master/tensorflow_lite_support/ios/task/audio/core/audio_tensor/sources/TFLAudioTensor.h
TFLAudioTensor *audioTensor = [classifier createInputAudioTensor];

// Create Audio Record to record the incoming audio samples from the on-device microphone.
// Created Audio Record has audio format matching the requirements of the audio classifier.
// For more details, please see:
https://github.com/tensorflow/tflite-support/blob/master/tensorflow_lite_support/ios/task/audio/core/audio_record/sources/TFLAudioRecord.h
TFLAudioRecord *audioRecord = [classifier createAudioRecordWithError:nil];

// Request record permissions from AVAudioSession before invoking -[TFLAudioRecord startRecordingWithError:].
[[AVAudioSession sharedInstance] requestRecordPermission:^(BOOL granted) {
    if (granted) {
        dispatch_async(dispatch_get_main_queue(), ^{
            // Start recording the incoming audio samples from the on-device microphone.
            [audioRecord startRecordingWithError:nil];

            // Load the samples currently held by the audio record buffer into the audio tensor.
            [audioTensor loadAudioRecord:audioRecord withError:nil];

            // Run inference
            TFLClassificationResult *classificationResult =
                [classifier classifyWithAudioTensor:audioTensor error:nil];

        });
    }
}];

Weitere Optionen zum Konfigurieren von TFLAudioClassifier finden Sie im Quellcode.

Inferenz in Python ausführen

Schritt 1: pip-Paket installieren

pip install tflite-support
  • Linux: Führen Sie sudo apt-get update && apt-get install libportaudio2 aus.
  • Mac und Windows: PortAudio wird automatisch installiert, wenn das tflite-support-PIP-Paket installiert wird.

Schritt 2: Modell verwenden

# Imports
from tflite_support.task import audio
from tflite_support.task import core
from tflite_support.task import processor

# Initialization
base_options = core.BaseOptions(file_name=model_path)
classification_options = processor.ClassificationOptions(max_results=2)
options = audio.AudioClassifierOptions(base_options=base_options, classification_options=classification_options)
classifier = audio.AudioClassifier.create_from_options(options)

# Alternatively, you can create an audio classifier in the following manner:
# classifier = audio.AudioClassifier.create_from_file(model_path)

# Run inference
audio_file = audio.TensorAudio.create_from_wav_file(audio_path, classifier.required_input_buffer_size)
audio_result = classifier.classify(audio_file)

Weitere Optionen zum Konfigurieren von AudioClassifier finden Sie im Quellcode.

Inferenz in C++ ausführen

// Initialization
AudioClassifierOptions options;
options.mutable_base_options()->mutable_model_file()->set_file_name(model_path);
std::unique_ptr<AudioClassifier> audio_classifier = AudioClassifier::CreateFromOptions(options).value();

// Create input audio buffer from your `audio_data` and `audio_format`.
// See more information here: tensorflow_lite_support/cc/task/audio/core/audio_buffer.h
int input_size = audio_classifier->GetRequiredInputBufferSize();
const std::unique_ptr<AudioBuffer> audio_buffer =
    AudioBuffer::Create(audio_data, input_size, audio_format).value();

// Run inference
const ClassificationResult result = audio_classifier->Classify(*audio_buffer).value();

Weitere Optionen zum Konfigurieren von AudioClassifier finden Sie im Quellcode.

Anforderungen an die Modellkompatibilität

Für die AudioClassifier API ist ein TFLite-Modell mit obligatorischen TFLite-Modellmetadaten erforderlich. Hier finden Sie Beispiele für das Erstellen von Metadaten für Audio-Klassifizierer mit der TensorFlow Lite Metadata Writer API.

Die kompatiblen Audio-Klassifizierungsmodelle sollten die folgenden Anforderungen erfüllen:

  • Eingabe-Audio-Tensor (kTfLiteFloat32)

    • Audioclip mit einer Größe von [batch x samples].
    • Die Batch-Inferenz wird nicht unterstützt (batch muss 1 sein).
    • Bei Modellen mit mehreren Channels müssen die Channels verschachtelt sein.
  • Tensor für Ausgabebereich (kTfLiteFloat32)

    • [1 x N]-Array mit N steht für die Klassennummer.
    • Optionale (aber empfohlene) Labelzuordnung(en) als AssociatedFile-s mit dem Typ TENSOR_AXIS_LABELS, die ein Label pro Zeile enthalten. Die erste solche AssociatedFile (falls vorhanden) wird verwendet, um das Feld label (in C++ als class_name bezeichnet) der Ergebnisse zu füllen. Das Feld display_name wird aus der AssociatedFile (falls vorhanden) gefüllt, deren Gebietsschema mit dem Feld display_names_locale des bei der Erstellung verwendeten AudioClassifierOptions übereinstimmt (standardmäßig „en“, also Englisch). Wenn keine dieser Informationen verfügbar sind, wird nur das Feld index der Ergebnisse ausgefüllt.