Skip to content

b0sh-net/VideoToMemo

Repository files navigation

VideoToMemo

Trasforma i video delle riunioni in memo professionali con un comando.

VideoToMemo è un'applicazione Java per riga di comando che automatizza il flusso di lavoro di una riunione: estrae l'audio dal video, ne effettua la trascrizione tramite Whisper e sintetizza un memo strutturato con un AI Agent.


✨ Caratteristiche

  • Estrazione audio locale — Utilizza JAVE2 per estrarre l'audio dai file video senza bisogno di FFmpeg installato manualmente.
  • Segmentazione automatica — Suddivide i file audio lunghi in segmenti di 5 minuti per garantire una trascrizione affidabile e fornire feedback di progresso.
  • Trascrizione automatica — Invia i segmenti audio a un servizio Whisper (ASR) compatibile per la trascrizione.
  • Sintesi AI — Utilizza un AI Agent (es. Ollama/Qwen) per trasformare la trascrizione in un memo strutturato e professionale.
  • Completamente configurabile — Endpoint API, parametri del modello e prompt di sintesi sono gestiti tramite config.yaml.example (da copiare in config.yaml).
  • Gestione efficiente della memoria — Elaborazione segmentata per gestire file video grandi (500 MB+).

📋 Prerequisiti

  • Java 21 o superiore
  • Maven 3.6+ (per la costruzione)
  • Un servizio Whisper compatibile (per la trascrizione) — vedi onerahmet/openai-whisper-asr-webservice
  • Un AI Agent (es. Ollama con Qwen) per la sintesi
  • Docker (opzionale, per eseguire il servizio Whisper)

🚀 Installazione

1. Costruire il progetto

mvn package

Questo comando genera un JAR standalone (shaded) in target/:

target/video-to-memo-1.0-SNAPSHOT.jar

🎯 Utilizzo

Eseguire l'applicazione

java -jar target/video-to-memo-1.0-SNAPSHOT.jar "percorso/del/video.mp4"

Output

L'applicazione genera due file markdown nella directory corrente:

File Descrizione
trascrizione-{nomefile}.md Trascrizione completa della riunione
sintesi-{nomefile}.md Memo professionale strutturato

I nomi dei file di output ereditano il nome base dal file video di input (es. meeting.mp4trascrizione-meeting.md e sintesi-meeting.md).


⚙️ Configurazione

1. Copia e rinomina il file di esempio

cp config.yaml.example config.yaml

2. Modifica config.yaml per adattare l'applicazione al tuo ambiente.

Struttura della configurazione

# Speech To Text (Whisper) configuration
whisper:
  url: "http://localhost:9000/asr"    # Endpoint del servizio Whisper
  params:
    encode: "true"
    task: "transcribe"
    language: "it"                          # Lingua della trascrizione
    output: "txt"

# AI Agent (Sintesi) configurazione
ai_agent:
  url: "http://localhost:11434/api/generate"  # Endpoint AI Agent (es. Ollama)
  model: "qwen3.5:9b"                              # Modello da utilizzare
  prompt: |                                          # Prompt per la sintesi del memo
    You are an expert business writer...
    ...
    {transcript}

# Percorso locale di FFmpeg (se non presente nel PATH)
ffmpeg_path: "ffmpeg"

Parametri principali

Parametro Descrizione
whisper.url Endpoint del servizio di trascrizione Whisper
whisper.params.language Lingua da usare per la trascrizione
ai_agent.url Endpoint dell'AI Agent per la sintesi
ai_agent.model Nome del modello LLM da utilizzare
ai_agent.prompt Prompt per la generazione del memo (usa {transcript} come segnaposto)
ffmpeg_path Percorso del binary FFmpeg (opzionale)

🏗️ Architettura

Flusso di elaborazione

Video (.mp4)
    │
    ▼
[Audio Extraction]  — JAVE2
    │
    ▼
[Audio Segmentation] — Segmenti da 5 minuti
    │
    ▼
[Transcription]     — Whisper ASR API
    │
    ▼
[Synthesis]         — AI Agent (Ollama/Qwen)
    │
    ▼
Memo (.md)

Componenti

Componente Libreria / Tecnologia
Processing audio/video JAVE2
Richieste HTTP Apache HttpClient 5
Parsing JSON Jackson
Gestione configurazione SnakeYAML

🐳 Servizio Whisper (Docker)

Il servizio di trascrizione Whisper è erogato tramite il container Docker onerahmet/openai-whisper-asr-webservice.

Avviare il servizio Whisper

docker run -d -p 9000:9000 onerahmet/openai-whisper-asr-webservice:latest

Una volta attivo, il servizio sarà raggiungibile all'endpoint:

http://localhost:9000/asr

Nota: Aggiorna whisper.url in config.yaml con l'IP corretto se il servizio non è in locale.


📦 Dipendenze

Dipendenza Versione Scopo
jackson-databind 2.17.0 Parsing JSON
snakeyaml 2.2 Gestione configurazione YAML
jave-all-deps 3.5.0 Processing audio/video
httpclient5 5.3.1 Richieste HTTP multipart

💡 Consigli per file video grandi

Per file video di dimensioni significative (>500 MB):

  1. Segmentazione automatica — L'applicazione suddivide l'audio in segmenti di 5 minuti, evitando picchi di memoria.
  2. Progresso visibile — Ricevi feedback durante l'elaborazione di ogni segmento.
  3. Assicurati spazio su disco — I file audio intermedi richiedono spazio temporaneo.

🛠️ Sviluppo

Struttura del progetto

VideoToMemo/
├── pom.xml                      # Configurazione Maven
├── config.yaml.example          # Template di configurazione
├── README.md                    # Questo file
├── .gitignore                   # Pattern di ignorati Git
└── src/
    └── main/
        └── java/
            └── com/
                └── videotomemo/
                    └── MeetingMemoApp.java   # Punto di ingresso principale

I file config.yaml, target/, .mp4, sintesi-* e trascrizione-* sono ignorati da Git.

Comandi di sviluppo

# Compilare
mvn compile

# Eseguere gli test
mvn test

# Costruire il JAR
mvn package

# Esecuzione con debug
mvn exec:java -Dexec.mainClass="com.videotomemo.MeetingMemoApp" -Dexec.args="meeting.mp4"

📄 Licenza

Progetto proprietario — creato per uso interno.


🆘 Risoluzione problemi

Problema Soluzione
ffmpeg non trovato Imposta ffmpeg_path su un percorso assoluto in config.yaml
Errori di connessione Whisper Verifica che whisper.url sia raggiungibile
Errori di connessione AI Agent Verifica che ai_agent.url e il modello siano corretti
OutOfMemoryError Il file video è troppo grande; verifica lo spazio su disco per i file temporanei
Trascrizione nella lingua sbagliata Modifica whisper.params.language in config.yaml

Releases

No releases published

Packages

 
 
 

Contributors

Languages