Come convertire un file MP3 in testo utilizzando Whisper di OpenAI

Sviluppato in Python. Utility online e codice

Questa utility sfrutta il modello AI Whisper per trascrivere file audio direttamente online, senza la necessità di installare Python e le relative librerie. Data l'intensa richiesta di risorse, questa utility opera utilizzando il modello di riconoscimento 'medio' di Whisper. Inoltre, è possibile eseguire fino a tre operazioni contemporanee sul server per file che non superano un Megabyte ciascuno. Il modello “medium” di Whisper offre un equilibrio ottimale tra accuratezza della trascrizione e consumo di risorse, garantendo un'efficienza adeguata nelle operazioni di trascrizione lato server.

Data la significativa quantità di risorse richieste per la trascrizione, ho deciso di rendere questo script accessibile a tutti. Il processo di trascrizione, infatti, richiede un notevole impiego di risorse, che può risultare insostenibile su server con capacità limitate. Pertanto, su questa pagina troverete lo script Python, completo di commenti, disponibile per essere copiato e utilizzato localmente. Questa soluzione permette una gestione più personalizzata delle prestazioni, evitando il rischio di sovraccaricare i sistemi. Inoltre, utilizzando lo script localmente, si ha la possibilità di impiegare il modello 'large' di Whisper, che offre una maggiore accuratezza ma richiede un intensivo utilizzo di CPU e RAM.

Pur fornendo trascrizioni dettagliate, lo script non è in grado di distinguere tra diversi relatori, ovvero non effettua la diarizzazione. Nonostante questa limitazione, la soluzione è particolarmente adatta a giornalisti, studenti e professionisti che richiedono trascrizioni precise e tempestive di interviste, conferenze e altri eventi. Utilizzando questo script direttamente sul proprio dispositivo, è possibile utilizzare il modello “large”.

Whisper è un modello di intelligenza artificiale sviluppato da OpenAI specializzato nella trascrizione automatica dell'audio in vari linguaggi. Può riconoscere e trascrivere il parlato da file audio e video, ma non supporta la diarizzazione, ovvero la capacità di distinguere tra diversi relatori. Whisper è disponibile in diverse versioni che vanno dal modello "tiny" al modello "large", ognuno dei quali offre un equilibrio tra velocità di esecuzione e accuratezza della trascrizione, adattandosi a diverse esigenze e risorse hardware.

La diarizzazione è un processo avanzato che consiste nell'identificare e distinguere tra i diversi relatori presenti in una registrazione audio. Questo processo permette di assegnare le varie porzioni di audio ai rispettivi parlanti, facilitando la comprensione del flusso del dialogo e la chiarezza della trascrizione. La diarizzazione è tecnicamente complessa per vari motivi: richiede l'analisi delle caratteristiche vocali uniche di ciascun parlante, come tono, ritmo e accenti, e deve poter gestire le sovrapposizioni di voci e i cambiamenti di ambiente acustico che possono alterare la qualità del suono. Inoltre, deve essere efficace in contesti rumorosi o con molteplici interlocutori che parlano simultaneamente, il che aumenta significativamente la difficoltà di isolare e identificare le voci individuali. A causa di queste sfide, non tutti gli strumenti di trascrizione sono equipaggiati per effettuare la diarizzazione, specialmente quelli che operano con risorse limitate o che sono progettati per essere utilizzati su dispositivi individuali con capacità di elaborazione ridotte.


Seleziona il file MP3 da trascrivere

Lo script Python

Questo è lo script Python da copiare ed incollare in un file con estensione .py


import whisper
import os
import uuid
import argparse
import subprocess
import json

def converti_mp3_a_wav(input_path, output_path):
    cmd = ['ffmpeg', '-i', input_path, '-acodec', 'pcm_s16le', '-ac', '1', '-ar', '16000', output_path]
    subprocess.run(cmd, check=True)

parser = argparse.ArgumentParser(description='Trascrivi un file audio utilizzando Whisper.')
parser.add_argument('file_path', type=str, help='Il percorso del file audio da trascrivere.')
args = parser.parse_args()

model = whisper.load_model("large") # i modelli disponibili li trovi qui: https://github.com/openai/whisper 

def trascrivi_file(file_path, model):
    temp_folder = os.path.join(os.path.dirname(__file__), 'temp')
    os.makedirs(temp_folder, exist_ok=True)

    uuid_name = str(uuid.uuid4())
    temp_path_wav = os.path.join(temp_folder, uuid_name + '.wav')

    if file_path.endswith(".mp3"):
        converti_mp3_a_wav(file_path, temp_path_wav)
        file_path = temp_path_wav

    audio = whisper.load_audio(file_path)
    result = model.transcribe(audio)

    relatori = {}
    for segmento in result['segments']:
        speaker = segmento.get('speaker', 'Sconosciuto')
        if speaker not in relatori:
            relatori[speaker] = []
        relatori[speaker].append(segmento['text'])

    trascrizione_differenziata = ""
    indice_segmento = 1

    for relatore, segmenti in relatori.items():
        for segmento in segmenti:
            trascrizione_differenziata += f"Frase {indice_segmento}: {segmento}\n"
            indice_segmento += 1

    transcription_folder = os.path.join(os.path.dirname(__file__), 'trascrizioni')
    os.makedirs(transcription_folder, exist_ok=True)

    transcription_file_path = os.path.join(transcription_folder, uuid_name + '.txt')
    with open(transcription_file_path, "w") as file:
        file.write(trascrizione_differenziata)

    if os.path.exists(temp_path_wav):
        os.remove(temp_path_wav)

    # Output json (non necessario per utilizzo locale)
    # transcription_json = json.dumps({"transcription": trascrizione_differenziata}, ensure_ascii=False, indent=2)
    # print(transcription_json)

    return transcription_file_path

if __name__ == '__main__':
    transcription_path = trascrivi_file(args.file_path, model)
    print("Trascrizione salvata in:", transcription_path)
    

Guida all'Installazione delle dipendenze per questo script

Prima di procedere con l'esecuzione dello script, è importante verificare che Python 3.12.2 sia installato sul tuo sistema, poiché lo script è stato sviluppato con questa versione di Python. Puoi controllare la versione di Python installata eseguendo python --version o python3 --version nel terminale. Se non hai ancora installato questa versione, ti consigliamo di farlo prima di avviare lo script per garantire una esecuzione fluida e senza errori.

Installazione di FFmpeg

FFmpeg è essenziale per la conversione di file audio. Segui le istruzioni specifiche per il tuo sistema operativo.

Windows

  • Scarica il build più recente da FFmpeg.org.
  • Estrai il file ZIP in una directory, per esempio C:\FFmpeg.
  • Aggiungi C:\FFmpeg\bin al tuo PATH:
    • Pannello di controllo > Sistema e sicurezza > Sistema
    • Impostazioni di sistema avanzate
    • Clicca su 'Variabili d'Ambiente', poi nella sezione 'Variabili di sistema', trova e seleziona 'Path'
    • Clicca 'Modifica' e poi 'Nuovo' e aggiungi il percorso della cartella bin
    • Clicca 'OK' per chiudere tutte le finestre

macOS

  • Installa Homebrew eseguendo il seguente comando nel terminale:
    /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
  • Una volta installato Homebrew, installa FFmpeg con:
    brew install ffmpeg

Linux

  • Per la maggior parte delle distribuzioni Linux, FFmpeg può essere installato tramite il gestore pacchetti. Per esempio, su Ubuntu:
    sudo apt update && sudo apt install ffmpeg

Setup di Virtualenv per l'ambiente Python

Usare un ambiente virtuale per eseguire lo script Python aiuta a gestire le dipendenze.

  • Installare virtualenv se non è già installato:
    pip3 install virtualenv
  • Creare un nuovo ambiente virtuale:

    virtualenv nome_ambiente
  • Attivare l'ambiente virtuale:


  • Windows

    nome_ambiente\Scripts\activate

    macOS e Linux

    source nome_ambiente/bin/activate
  • Con l'ambiente virtuale attivo, installare Whisper e altre dipendenze necessarie:
    git clone https://github.com/openai/whisper.git
  • Per disattivare l'ambiente virtuale, usa:
    deactivate

Esecuzione dello script Python

  • Nella stessa cartella in cui è ubicato lo script digitare:
    python3 nome_script.py nome_file.mp3