Ricerca nel sito web

Trascrizione audio senza sforzo con Distill Whisper AI


Introduzione

La tecnologia del deep learning si è evoluta rapidamente ed è diventata un attore chiave nella nostra vita quotidiana, in particolare in quest’era di applicazioni di sintesi vocale. Che si tratti di alimentare l'A.I. sistemi di chiamata, assistenti vocali come SIRI o Alexa o integrazione perfetta con i motori di ricerca: questa funzionalità migliora notevolmente l'esperienza dell'utente. La sua diffusa adozione lo ha reso parte integrante della nostra vita.

Emergendo come un formidabile contendente nell'arena dell'intelligenza artificiale open source, il modello Whisper di Audio Speech Recognition (ASR) di OpenAI ha guadagnato un'enorme popolarità. Presenta un livello di efficacia paragonabile ad altri modelli di livello produttivo, il tutto pur essendo accessibile agli utenti a costo zero. Inoltre, fornisce una gamma di modelli pre-addestrati che consentono agli utenti di sfruttare la potenza dell'A.I. per trascrivere e tradurre qualsiasi brano audio.

In questo articolo, esamineremo il progetto Distil Whisper recentemente rilasciato. Quest'ultima iterazione del modello Whisper offre una velocità fino a 6 volte superiore nell'esecuzione del modello. In questo articolo, daremo uno sguardo più approfondito a questo modello di rilascio, a cosa lo ha reso possibile, per poi concludere con una dimostrazione del codice.

Prenditi un momento per esplorare l'articolo completo su Whisper fornito da DigitalOcean.

Prerequisiti

  • Python 3.8+ installato.
  • PyTorch 2.0+ con supporto CUDA (per l'accelerazione GPU).
  • Installa le dipendenze: pip installa i set di dati dei trasformatori torchaudio.
  • Familiarità con il modello Whisper e nozioni di base sull'elaborazione audio.

Cos'è la distillazione della conoscenza (KD)?

Prima di approfondire il modello stesso, discutiamo di ciò che rende possibili le accelerazioni per Distill Whisper. La distillazione della conoscenza (KD) si riferisce al processo di addestramento di un modello più piccolo ed efficiente dal punto di vista computazionale, noto anche come studente, che cerca di imitare il comportamento di un modello più grande e complesso o dell'insegnante. Essenzialmente, è una forma di compressione del modello che aiuta a trasferire la conoscenza da un modello più grande per addestrare un modello più piccolo senza alcuna perdita significativa di prestazioni. In questo caso, la conoscenza si riferisce ai pesi e ai pregiudizi appresi, che rappresentano la comprensione del modello in un modello addestrato.

Il modello grande, ovvero l'insegnante, viene formato su un compito di interesse, come compiti di PNL, riconoscimento di immagini e molto altro. Questo modello di deep learning è computazionalmente molto costoso. Successivamente, viene creato e addestrato un modello studente sugli stessi compiti e questo modello conserva la conoscenza del modello insegnante. In questo caso, l’idea chiave è utilizzare le previsioni del modello dell’insegnante, le probabilità attenuate o i logit, come obiettivi per addestrare il modello dello studente.

Durante il processo di formazione, il modello dello studente mira a imitare non solo le previsioni finali del modello dell'insegnante, ma anche la conoscenza incorporata nei passaggi intermedi. Questo trasferimento di conoscenze aiuta il modello dello studente a generalizzare meglio e a svolgere bene il compito riducendo le complessità.

Questa distillazione del modello ha dimostrato di dimostrare una sostanziale riduzione delle dimensioni del modello e dei requisiti computazionali con un degrado minimo o nullo delle prestazioni.

Fonte

Nel caso di Distil-Whisper, il modello insegnante è Whisper e il modello studente è Distil-Whisper. Entrambi i modelli condividono la stessa architettura Seq2Seq ma con dimensionalità diversa.

Il modello della distillazione

Ora diamo un'occhiata al modello Distil Whisper stesso. Innanzitutto, è importante capire cosa differenzia la nuova versione del modello dall’originale. Le principali modifiche proposte nel documento di ricerca per comprimere il modello sono brevemente discusse di seguito:

Riduci e perfeziona: per il modello Distilled, i ricercatori hanno implementato la compressione basata su livelli. Ciò viene fatto inizializzando il modello studente attraverso la replica dei pesi da strati che sono distanziati al massimo nel modello insegnante. Ad esempio, quando si imposta un modello studente a 2 livelli basato su un modello insegnante a 32 livelli, vengono replicati i pesi del primo e del 32° livello dall'insegnante allo studente.

Pseudo etichettatura: questa forma di distillazione può anche essere vista come KD “a livello di sequenza”, in questo processo la conoscenza viene trasferita al modello dello studente in una sequenza. Questa sequenza viene generata in pseudo-etichette.

Divergenza di Kullback-Leibler: nella divergenza di KL, la distribuzione di probabilità completa del modello dello studente viene addestrata per allinearsi con la distribuzione del modello dell'insegnante. Questo allineamento si ottiene riducendo al minimo la divergenza Kullback-Leibler (KL) nell'intero insieme di potenziali token successivi nella _i_esima posizione. Questo può essere interpretato come una distillazione della conoscenza “a livello di parola”, in cui la conoscenza viene passata dal modello dell’insegnante al modello dello studente attraverso i logit associati ai potenziali token.

Distill-Whisper

I recenti sviluppi nell'elaborazione del linguaggio naturale (NLP) hanno mostrato progressi significativi nella compressione dei modelli basati su trasformatori. Sono state osservate applicazioni di successo della distillazione della conoscenza (KD) nel ridurre le dimensioni di modelli come BERT senza alcuna perdita significativa di prestazioni. Distil-Whisper, una versione distillata di Whisper, vanta un notevole miglioramento: è 6 volte più veloce, ha dimensioni più piccole del 49% e raggiunge un livello di prestazioni entro l'1% di tasso di errore di parola (WER) su set di valutazione fuori distribuzione.

Per raggiungere questo obiettivo, vale la pena notare in particolare che l’obiettivo dell’addestramento è stato ottimizzato per ridurre al minimo sia la divergenza KL tra il modello distillato e il modello Whisper, sia la perdita di entropia incrociata calcolata su dati audio pseudo-etichettati.

Il Distil-Whisper è addestrato su 22.000 ore di dati audio pseudo-etichettati, costituiti da 10 domini con più di 18.000 parlanti.

Cosa c'è di nuovo in Distil Whisper?

Per garantire che la formazione incorpori esclusivamente pseudo-etichette affidabili, viene introdotto un approccio euristico semplice che perfeziona il set di dati di formazione pseudo-etichettati. Per ogni campione di addestramento, sia le etichette di verità che le pseudo-etichette generate da Whisper vengono normalizzate, utilizzando il normalizzatore Whisper English. Una volta terminato, viene calcolato il tasso di errore delle parole (WER) tra la verità di base normalizzata e le pseudo-etichette. I campioni che superano la soglia WER specificata vengono scartati. Questo metodo di filtraggio migliora la qualità della trascrizione e le prestazioni del modello.

L'articolo originale di Whisper introduce un algoritmo di trascrizione di lunga durata che trascrive sistematicamente segmenti audio di 30 secondi, regolando la finestra scorrevole in base ai timestamp previsti dal modello. In Distil Whisper, viene utilizzata una strategia alternativa in cui l'audio del file lungo viene suddiviso in frammenti più piccoli con piccoli segmenti adiacenti sovrapposti nel mezzo. Il modello elabora ogni blocco e il testo dedotto viene collegato a intervalli identificando la sequenza comune più lunga tra le porzioni sovrapposte. Questo passo facilita la trascrizione precisa tra i blocchi senza la necessità di una trascrizione sequenziale.

La decodifica speculativa (SD) è un approccio per accelerare il processo di inferenza dei modelli di trasformatore autoregressivo incorporando un modello assistente più veloce. Utilizzando il modello assistente più veloce per la generazione e limitando i passaggi successivi di convalida solo al modello principale, il processo di decodifica subisce una sostanziale accelerazione. SD aiuta a generare l'output che corrisponde alla sequenza dei token generati dal modello principale. Lo stesso approccio viene applicato utilizzando Distil Whisper come assistente del modello Whisper.

La decodifica speculativa offre miglioramenti sostanziali della latenza garantendo al tempo stesso output identici dal punto di vista matematico. Ciò lo rende un sostituto logico e senza soluzione di continuità per le pipeline Whisper esistenti.

Architettura

Nella foto sotto c'è una figura che rappresenta l'architettura del modello Distil Whisper. L'encoder, raffigurato in verde, viene interamente replicato dal docente allo studente e rimane fisso durante l'allenamento. Il decodificatore dello studente comprende solo due livelli di decodificazione, inizializzati dai livelli di decodificazione iniziale e finale dell'insegnante (raffigurati in rosso). Tutti gli altri livelli di decodificazione dell'insegnante vengono omessi.

Il modello viene sottoposto ad addestramento sulla base di una combinazione ponderata di divergenza KL e termini di perdita PL. Durante l'inferenza, è in grado di utilizzarlo per identificare in sequenza il prossimo token più probabile rispetto sia alla codifica latente del testo che all'audio. Innanzitutto, un frammento audio della forma d'onda viene immesso nel modulo codificatore. L'audio è codificato rispetto alla posizione temporale al suo interno. Il blocco decodificatore è quindi in grado di elaborare in sequenza i token di input codificati. Il blocco decodificatore accetta quindi questa codifica insieme al token precedente nella sequenza di input, utilizzando un token BOS (inizio sequenza) all'inizio, per decodificare l'output come stringa.

Fonte

Capacità

Distil-Whisper è progettato per sostituire Whisper nel riconoscimento vocale inglese. Le capacità di Distil-Whisper possono essenzialmente essere ridotte a 5 funzionalità chiave principali:

Inferenza più veloce: raggiungimento di una velocità di inferenza sei volte più veloce, mantenendo le prestazioni entro l'1% del tasso di errore di parole (WER) di Whisper su audio fuori distribuzione.

Robustezza al rumore e alle allucinazioni: la trama mostra che quando il rumore diventa più intenso, i WER'S del Distil-Whisper si degradano meno gravemente rispetto ad altri modelli addestrati sul corpus LibriSpeech. Quantificato da 1,3 volte meno casi di duplicati ripetuti di parole da 5 grammi e una riduzione del 2,1% del tasso di errore di inserimento (IER) rispetto a Whisper. Ciò suggerisce che l'entità dell'allucinazione è ridotta in Distil-Whisper rispetto al modello Whisper originale. Il tasso medio di errore di eliminazione (DER) rimane paragonabile sia per large-v2 che per distill-large-v2, con prestazioni che differiscono di circa 0,3% DER.

Progettato per la decodifica speculativa: Distil-Whisper funge da modello assistente per Whisper, fornendo un aumento doppio della velocità di inferenza e garantendo matematicamente output identici al modello Whisper. Licenza commerciale: Distil-Whisper è concesso in licenza e può essere utilizzato per applicazioni commerciali.

Demo del codice

Seguendo questa guida possiamo eseguire il modello Distil-Whisper e trascrivere campioni audio del parlato in pochissimo tempo.

Per eseguire il modello, installare prima l'ultima versione della libreria Transformers. Il modello supporta Transformers fino alla versione 4.35.

#Install the dependencies
!pip install --upgrade pip
!pip install --upgrade transformers accelerate datasets[audio]

Trascrizione in forma abbreviata

La trascrizione in forma breve prevede la trascrizione di campioni audio della durata inferiore a 30 secondi, il che si allinea con il campo recettivo massimo dei modelli Whisper.

Carica Distil-Whisper utilizzando le classi AutoModelForSpeechSeq2Seq e AutoProcessor.

import torch
from transformers import AutoModelForSpeechSeq2Seq, AutoProcessor, pipeline

device = "cuda:0" if torch.cuda.is_available() else "cpu"
torch_dtype = torch.float16 if torch.cuda.is_available() else torch.float32

model_id = "distil-whisper/distil-large-v2"

model = AutoModelForSpeechSeq2Seq.from_pretrained(
    model_id, torch_dtype=torch_dtype, low_cpu_mem_usage=True, use_safetensors=True
)
model.to(device)

processor = AutoProcessor.from_pretrained(model_id)

Successivamente, passa il modello e il processore alla pipeline

pipe = pipeline(
    "automatic-speech-recognition",
    model=model,
    tokenizer=processor.tokenizer,
    feature_extractor=processor.feature_extractor,
    max_new_tokens=128,
    torch_dtype=torch_dtype,
    device=device,
)

Caricare il set di dati dal corpus LibriSpeech,

from datasets import load_dataset

dataset = load_dataset("hf-internal-testing/librispeech_asr_dummy", "clean", split="validation")
sample = dataset[0]["audio"]

Chiama la pipeline per trascrivere l'audio di esempio,

result = pipe(sample)
print(result["text"])

Per trascrivere un audio campione archiviato localmente, assicurati di passare il percorso del file.

result = pipe("path_to_the_audio.mp3")
print(result["text"])

Trascrizione in formato lungo

Per trascrivere audio lungo (più lungo di 30 secondi) Distil-Whisper utilizza un algoritmo a blocchi. Qui utilizzeremo l'audio salvato in formato lungo dalla directory.

Caricare nuovamente il modello e il processore:

import torch
from transformers import AutoModelForSpeechSeq2Seq, AutoProcessor, pipeline

device = "cuda:0" if torch.cuda.is_available() else "cpu"
torch_dtype = torch.float16 if torch.cuda.is_available() else torch.float32

model_id = "distil-whisper/distil-large-v2"

model = AutoModelForSpeechSeq2Seq.from_pretrained(
    model_id, torch_dtype=torch_dtype, low_cpu_mem_usage=True, use_safetensors=True
)
model.to(device)

processor = AutoProcessor.from_pretrained(model_id)

Per abilitare il Chunking, utilizzeremo il parametro Chunk_length_s nella pipeline. Per Distil-Whisper, la lunghezza minima del blocco è di 15 secondi. Per attivare l'invio in batch, includere l'argomento batch_size.

pipe = pipeline(
    "automatic-speech-recognition",
    model=model,
    tokenizer=processor.tokenizer,
    feature_extractor=processor.feature_extractor,
    max_new_tokens=128,
    chunk_length_s=15,
    batch_size=16,
    torch_dtype=torch_dtype,
    device=device,
)

Ora caricheremo un lungo campione audio che è stato memorizzato nella directory per tua comodità. Passa il percorso al file audio salvato da trascrivere. Sentiti inoltre libero di caricare qualsiasi campione mp3 di tua scelta nella directory e trascriverlo utilizzando questo codice demo.

result = pipe('/content/I_used_LLaMA_2_70B_to_rebuild_GPT_Banker...and_its_AMAZING_(LLM_RAG).mp3')
print(result["text"])

Importa la libreria textwrap, possiamo utilizzare la libreria per visualizzare il risultato come un paragrafo formattato.

import textwrap

wrapper = textwrap.TextWrapper(width=80,
    initial_indent=" " * 8,
    subsequent_indent=" " * 8,
    break_long_words=False,
    break_on_hyphens=False)
print(wrapper.fill(result["text"]))

Decodifica speculativa

La decodifica speculativa garantisce risultati simili al modello Whisper, ma lo raggiunge al doppio della velocità. Questa caratteristica posiziona Distill-Whisper come un sostituto ideale e senza soluzione di continuità per le attuali tubazioni Whisper, garantendo risultati costanti e migliorando l'efficienza.

Per la decodifica speculativa, abbiamo bisogno sia del modello dell'insegnante che dello studente.

Carica il modello insegnante “openai/whisper-large-v2” e il processore.

from transformers import AutoModelForSpeechSeq2Seq, AutoProcessor
import torch

device = "cuda:0" if torch.cuda.is_available() else "cpu"
torch_dtype = torch.float16 if torch.cuda.is_available() else torch.float32

model_id = "openai/whisper-large-v2"

model = AutoModelForSpeechSeq2Seq.from_pretrained(
    model_id, torch_dtype=torch_dtype, low_cpu_mem_usage=True, use_safetensors=True
)
model.to(device)

processor = AutoProcessor.from_pretrained(model_id)

Successivamente, carica il modello studente. Il Distil-Whisper condivide esattamente lo stesso codificatore del modello insegnante, è solo necessario caricare il decoder a 2 strati, trattandolo effettivamente come un modello autonomo "solo decoder".

from transformers import AutoModelForCausalLM
assistant_model_id = "distil-whisper/distil-large-v2"

assistant_model = AutoModelForCausalLM.from_pretrained(
    assistant_model_id, torch_dtype=torch_dtype, low_cpu_mem_usage=True, use_safetensors=True
)
assistant_model.to(device)

Passare il modello studentesco alla pipeline,

pipe = pipeline(
    "automatic-speech-recognition",
    model=model,
    tokenizer=processor.tokenizer,
    feature_extractor=processor.feature_extractor,
    max_new_tokens=128,
    generate_kwargs={"assistant_model": assistant_model},
    torch_dtype=torch_dtype,
    device=device,
)

Una volta terminato, passare il campione da trascrivere,

from datasets import load_dataset

dataset = load_dataset("hf-internal-testing/librispeech_asr_dummy", "clean", split="validation")
sample = dataset[0]["audio"]

result = pipe(sample)
print(result["text"])

Per un'ulteriore ottimizzazione, utilizzare Flash Attention 2

!pip install flash-attn --no-build-isolation

Per attivare Flash Attention 2 è sufficiente passare il parametro use_flash_attention_2=True alla funzione from_pretrained durante l'inizializzazione.

Nel caso in cui la GPU non sia supportata, utilizzare BetterTransformers. Per fare ciò, installa Optimal.

!pip install --upgrade optimum

Il codice seguente converte il modello in un modello "BetterTransformer",

model = AutoModelForSpeechSeq2Seq.from_pretrained(model_id, torch_dtype=torch_dtype, low_cpu_mem_usage=True, use_safetensors=True)
model = model.to_bettertransformer()

Pensieri conclusivi

In questo articolo abbiamo introdotto Distil-Whisper, che è una versione distillata e accelerata di Whisper. Distil-Whisper si distingue come un modello eccezionalmente impressionante e funge da eccellente candidato per testare le applicazioni. Sull'audio di lunga durata fuori distribuzione, DistilWhisper supera Whisper, mostrando meno casi di allucinazioni e ripetizioni. Ciò evidenzia l’efficacia della pseudo-etichettatura su larga scala nella distillazione dei modelli ASR, soprattutto se combinata con il nostro filtro soglia WER (Word Error Rate). Abbiamo ulteriormente dimostrato Distil-Whisper e utilizzato senza problemi il modello per trascrivere audio in forma lunga e breve in inglese.

Assicurati di esplorare il documento originale e la pagina del progetto Github per ulteriori informazioni sulla ricerca coinvolta nella creazione di questo fantastico modello.

Riferimenti

  1. Documento di ricerca originale: DISTIL-WHISPER: DISTILLAZIONE CON CONOSCENZA ROBUSTA TRAMITE PSEUDO ETICHETTATURA SU LARGA SCALA
  2. Riferimento al codice del repository github di Hugging Face: distil-whisper
  3. Post del blog Whisper: crea la tua applicazione di sintesi vocale con Whisper di OpenAI e Flask

Articoli correlati: