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.
- 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 inconfig.yaml). - Gestione efficiente della memoria — Elaborazione segmentata per gestire file video grandi (500 MB+).
- 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)
mvn packageQuesto comando genera un JAR standalone (shaded) in target/:
target/video-to-memo-1.0-SNAPSHOT.jar
java -jar target/video-to-memo-1.0-SNAPSHOT.jar "percorso/del/video.mp4"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.mp4→trascrizione-meeting.mdesintesi-meeting.md).
cp config.yaml.example config.yaml# 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"| 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) |
Video (.mp4)
│
▼
[Audio Extraction] — JAVE2
│
▼
[Audio Segmentation] — Segmenti da 5 minuti
│
▼
[Transcription] — Whisper ASR API
│
▼
[Synthesis] — AI Agent (Ollama/Qwen)
│
▼
Memo (.md)
| Componente | Libreria / Tecnologia |
|---|---|
| Processing audio/video | JAVE2 |
| Richieste HTTP | Apache HttpClient 5 |
| Parsing JSON | Jackson |
| Gestione configurazione | SnakeYAML |
Il servizio di trascrizione Whisper è erogato tramite il container Docker onerahmet/openai-whisper-asr-webservice.
docker run -d -p 9000:9000 onerahmet/openai-whisper-asr-webservice:latestUna volta attivo, il servizio sarà raggiungibile all'endpoint:
http://localhost:9000/asr
Nota: Aggiorna
whisper.urlinconfig.yamlcon l'IP corretto se il servizio non è in locale.
| 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 |
Per file video di dimensioni significative (>500 MB):
- Segmentazione automatica — L'applicazione suddivide l'audio in segmenti di 5 minuti, evitando picchi di memoria.
- Progresso visibile — Ricevi feedback durante l'elaborazione di ogni segmento.
- Assicurati spazio su disco — I file audio intermedi richiedono spazio temporaneo.
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-*etrascrizione-*sono ignorati da Git.
# 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"Progetto proprietario — creato per uso interno.
| 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 |