A classificação de áudio é um caso de uso comum do machine learning para classificar os tipos de sons diferentes. Por exemplo, ele consegue identificar as espécies de aves pelo canto delas.
A API Task Library AudioClassifier
pode ser usada para implantar seu áudio personalizado
ou pré-treinados ao seu app para dispositivos móveis.
Principais recursos da API AudioClassifier
Processamento de áudio de entrada, por exemplo, Conversão da codificação PCM de 16 bits para PCM Codificação de ponto flutuante e a manipulação do buffer de anel de áudio.
Localidade do mapa do rótulo.
Compatibilidade com o modelo de classificação de vários cabeçalhos.
Compatibilidade com classificação de rótulo único e vários rótulos.
Limite de pontuação para filtrar os resultados.
Resultados da classificação Top-K.
Lista de permissões de rótulos e lista de bloqueio.
Modelos de classificador de áudio compatíveis
Os modelos a seguir têm a garantia de compatibilidade com o AudioClassifier
API.
Modelos criados pela TensorFlow Lite Model Maker para classificação de áudio.
A modelos de classificação de eventos de áudio pré-treinados no TensorFlow Hub.
Modelos personalizados que atendem aos requisitos de compatibilidade do modelo.
Executar inferência em Java
Consulte a
App de referência de classificação de áudio
um exemplo que usa AudioClassifier
em um app Android.
Etapa 1: importar a dependência do Gradle e outras configurações
Copie o arquivo modelo .tflite
para o diretório de assets do módulo Android.
em que o modelo será executado. Especifique que o arquivo não deve ser compactado.
Adicione a biblioteca do TensorFlow Lite ao arquivo build.gradle
do módulo:
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'
}
Etapa 2: uso do modelo
// 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);
Consulte a
código-fonte e o javadoc (em inglês)
para mais opções de configuração do AudioClassifier
.
Executar inferência no iOS
Etapa 1: instalar as dependências
A biblioteca de tarefas oferece suporte à instalação usando o CocoaPods. Verifique se o CocoaPods está instalado no seu sistema. Consulte a Guia de instalação do CocoaPods para obter instruções.
Consulte a Guia de CocoaPods para detalhes sobre como adicionar pods a um projeto do Xcode.
Adicione o pod TensorFlowLiteTaskAudio
ao Podfile.
target 'MyAppWithTaskAPI' do
use_frameworks!
pod 'TensorFlowLiteTaskAudio'
end
O modelo .tflite
que você vai usar para inferência precisa estar presente
seu pacote de apps.
Etapa 2: uso do modelo
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];
});
}
}];
Consulte a
código-fonte
para mais opções de configuração do TFLAudioClassifier
.
Executar inferência em Python
Etapa 1: instalar o pacote pip
pip install tflite-support
- Linux: execute
sudo apt-get update && apt-get install libportaudio2
- Mac e Windows: o PortAudio é instalado automaticamente ao instalar o
Pacote PIP
tflite-support
.
Etapa 2: uso do modelo
# 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)
Consulte a
código-fonte
para mais opções de configuração do AudioClassifier
.
Executar inferência em C++
// 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();
Consulte a
código-fonte
para mais opções de configuração do AudioClassifier
.
Requisitos de compatibilidade do modelo
A API AudioClassifier
espera um modelo TFLite com valores obrigatórios
Metadados de modelo do TFLite. Confira exemplos de
criar metadados para classificadores de áudio usando o
API TensorFlow Lite Metadata Writer
Os modelos de classificador de áudio compatíveis precisam atender aos seguintes requisitos:
Tensor de áudio de entrada (kTfLiteFloat32)
- clipe de áudio de tamanho
[batch x samples]
. - A inferência em lote não é compatível (
batch
precisa ser 1). - Para modelos multicanais, os canais precisam ser intercalados.
- clipe de áudio de tamanho
Tensor de pontuação de saída (kTfLiteFloat32)
- A matriz
[1 x N]
comN
representa o número da classe. - mapa (s) de rótulo opcional(mas recomendado) como AssociatedFile-s com tipo
TENSOR_AXIS_LABELS, contendo um rótulo por linha. A primeira
AssociatedFile (se houver) é usado para preencher o campo
label
(chamado comoclass_name
em C++) dos resultados. O campodisplay_name
está preenchido do AssociatedFile (se houver), cuja localidade corresponde ao Campodisplay_names_locale
doAudioClassifierOptions
usado em hora de criação ("en" por padrão, isto é, inglês). Se nenhuma delas for disponível, apenas o campoindex
dos resultados será preenchido.
- A matriz