Pular para o conteúdo principal

Detecção de Palavras-Chave com TensorFlow Lite

Introdução

Este projeto demonstra como usar o TensorFlow Lite para detecção de palavras-chave no ReSpeaker 2-Mics Pi HAT v2. A detecção de palavras-chave permite a identificação em tempo real de palavras pré-definidas a partir de entrada de áudio, possibilitando aplicações como dispositivos controlados por voz e sistemas interativos. Iremos guiá-lo pelas etapas para treinar um modelo TensorFlow Lite, implantá-lo no ReSpeaker HAT e executar o reconhecimento de voz localmente.

Requisitos de Hardware e Software

  • Hardware: Raspberry Pi com ReSpeaker 2-Mics Pi HAT v2
  • Software: TensorFlow Lite, Google Colab, Python e bibliotecas de suporte

Aplicações

A detecção de palavras-chave pode ser aplicada em:

  • Dispositivos de casa inteligente
  • Robôs controlados por voz
  • Quiosques interativos

O que é o TensorFlow Lite?

TensorFlow Lite é uma versão leve do TensorFlow projetada para dispositivos móveis e embarcados. Ele possibilita inferência de aprendizado de máquina com baixa latência e binários pequenos, tornando-o ideal para executar modelos em dispositivos de borda como o Raspberry Pi.

Treinar e Obter o Modelo TensorFlow Lite

Conjunto de Dados

Usaremos um subconjunto do conjunto de dados Speech Commands para o treinamento. O conjunto de dados contém arquivos de áudio WAV de pessoas dizendo diferentes palavras, coletados pelo Google e disponibilizados sob uma licença CC BY. O conjunto de dados pode ser baixado daqui. Para mais informações sobre conjuntos de dados, consulte este guia.

Por que Usar o Google Colab?

Google Colab é uma plataforma em nuvem para executar notebooks Jupyter. Ele oferece acesso gratuito a recursos de GPU, tornando-o uma excelente escolha para treinar modelos de aprendizado de máquina sem exigir poder de computação local.

Etapas

Agora usaremos um Notebook do Google Colab para realizar o treinamento de dados e gerar um modelo TensorFlow Lite no formato .tflite.

  • Etapa 1. Abra este Notebook Python

    Load Notebook

    Por padrão, ele carregará o conjunto de dados mini Speech Commands, que é uma versão menor do conjunto de dados Speech Commands. O conjunto de dados original consiste em mais de 105.000 arquivos de áudio no formato de arquivo de áudio WAV (Waveform) de pessoas dizendo 35 palavras diferentes. Esses dados foram coletados pelo Google e lançados sob uma licença CC BY.

  • Etapa 2. Conecte-se a um novo runtime selecionando Changing runtime type -> CPU -> Save, depois clique em Connect.

    Change runtime type - 1 Change runtime type - 2

  • Etapa 3. Navegue até Runtime > Run all para executar todas as células de código. Este processo levará cerca de 10 minutos para ser concluído.

    Run all

  • Etapa 4. Depois que todas as células de código forem executadas, anexe uma nova célula e execute o seguinte código para gerar o arquivo de modelo .tflite.

    converter = tf.lite.TFLiteConverter.from_keras_model(model)
    tflite_model = converter.convert()

    with open('model.tflite', 'wb') as f:
    f.write(tflite_model)

    Append a new cell

  • Etapa 5. Clique com o botão direito no arquivo model.tflite gerado e selecione Download para salvar o arquivo em seu computador.

    Download

Inferência Local

Executando o Script de Inferência

O script inference.py executa as seguintes etapas:

  1. Carrega o modelo TensorFlow Lite treinado.
  2. Processa o áudio de entrada em um espectrograma adequado para inferência.
  3. Executa a inferência e gera a palavra-chave detectada juntamente com as pontuações de confiança para cada rótulo.

Etapas para Execução

  1. Envie o arquivo de modelo model.tflite para o seu Pi; neste exemplo, nós o colocamos em ~/speech_recognition/model.tflite.

  2. Salve o seguinte script como ~/speech_recognition/inference.py:

    import numpy as np
    from scipy import signal
    from tflite_runtime.interpreter import Interpreter
    import soundfile as sf

    MODEL_PATH = 'model.tflite'
    LABELS = ['no', 'yes', 'down', 'go', 'left', 'up', 'right', 'stop']


    def get_spectrogram(waveform, expected_time_steps=124, expected_freq_bins=129):
    _, _, Zxx = signal.stft(
    waveform,
    fs=16000,
    nperseg=255,
    noverlap=124,
    nfft=256
    )
    spectrogram = np.abs(Zxx)

    if spectrogram.shape[0] != expected_freq_bins:
    spectrogram = np.pad(spectrogram, ((
    0, expected_freq_bins - spectrogram.shape[0]), (0, 0)), mode='constant')
    if spectrogram.shape[1] != expected_time_steps:
    spectrogram = np.pad(spectrogram, ((
    0, 0), (0, expected_time_steps - spectrogram.shape[1])), mode='constant')

    if spectrogram.shape != (expected_freq_bins, expected_time_steps):
    raise ValueError(
    f"Invalid spectrogram shape. Got {spectrogram.shape}, expected ({expected_freq_bins}, {expected_time_steps})."
    )

    spectrogram = np.transpose(spectrogram)

    return spectrogram


    def preprocess_audio(file_path):
    waveform, sample_rate = sf.read(file_path)
    if sample_rate != 16000:
    raise ValueError("Expected sample rate is 16 kHz")

    if len(waveform.shape) > 1:
    waveform = waveform[:, 0]

    spectrogram = get_spectrogram(waveform)
    spectrogram = spectrogram[..., np.newaxis]
    spectrogram = spectrogram[np.newaxis, ...]

    return spectrogram


    def run_inference(file_path):
    spectrogram = preprocess_audio(file_path)

    interpreter = Interpreter(MODEL_PATH)
    interpreter.allocate_tensors()

    input_details = interpreter.get_input_details()
    output_details = interpreter.get_output_details()

    input_shape = input_details[0]['shape']
    if spectrogram.shape != tuple(input_shape):
    raise ValueError(
    f"Expected input shape {input_shape}, got {spectrogram.shape}"
    )

    interpreter.set_tensor(
    input_details[0]['index'], spectrogram.astype(np.float32))

    interpreter.invoke()

    output_data = interpreter.get_tensor(output_details[0]['index'])[0]
    prediction = np.argmax(output_data)
    confidence = np.exp(output_data) / \
    np.sum(np.exp(output_data))

    print(f"command: {LABELS[prediction].upper()}")
    for label, conf in zip(LABELS, confidence):
    print(f"{label}: {conf:.2%}")


    if __name__ == "__main__":
    audio_file_path = 'test_audio.wav'
    run_inference(audio_file_path)
  3. Grave um som usando o seguinte comando; as palavras-chave disponíveis são: no, yes, down, go, left, up, right, stop.

    $ arecord -D "plughw:2,0" -f S16_LE -r 16000 -d 1 -t wav ~/speech_recognition/test_audio.wav
  4. Execute o script:

    $ python3 inference.py
    INFO: Created TensorFlow Lite XNNPACK delegate for CPU.
    command: YES
    no: 8.74%
    yes: 21.10%
    down: 5.85%
    go: 14.57%
    left: 11.02%
    up: 8.25%
    right: 10.53%
    stop: 19.94%

Interpretando os Resultados

O script gera o comando detectado (por exemplo, YES) e as pontuações de confiança para todos os rótulos. Isso fornece insights sobre as previsões do modelo e permite avaliar seu desempenho.

Suporte Técnico & Discussão de Produtos

Obrigado por escolher nossos produtos! Estamos aqui para fornecer diferentes tipos de suporte para garantir que sua experiência com nossos produtos seja a mais tranquila possível. Oferecemos vários canais de comunicação para atender a diferentes preferências e necessidades.

Loading Comments...