Guida ChinesePod Pipeline, Karaoke, Sincronizzazione
Raccolta note tecniche β Novembre 2025
1. Riassunto Progetto ChinesePod
1.1 Cosa fa il sistema
Una PWA per studiare cinese che:
- Legge un JSON con il dialogo (cinese, pinyin, traduzione letterale/naturale)
- Riproduce un MP3 con le frasi del dialogo
- Mostra vocabolario chiave e supplementare
1.2 Problemi identificati
- Bug risolto: cliccando βΆ su una singola frase non parte piΓΉ la sequenza automatica
- Problema principale: il karaoke non funziona β le parole cinesi NON cambiano colore in sincronia con l’audio
- L’audio dei dialoghi non Γ¨ per nulla associato al testo
2. Pipeline di Generazione
2.1 FASE 1 β Preparazione
- Scaricare
chinesepod_E0429.pdf(originale) inscaricatiAB/E0429/ - Lanciare
split_pdf.pyβ divide in pagine singole inscaricatiABC
2.2 FASE 2 β Traduzione
- Lanciare
chinesepod_traduci_v8.pyβ genera per ogni pagina:chinesepod_E0429_1_italiano.pdfchinesepod_E0429_1_dati.json
2.3 FASE 3 β Merge
- Lanciare
merge_pdf_json.pyβ legge dascaricatiABCe scrive inscaricatiAB:chinesepod_E0429_italiano.pdfβ PDF unicochinesepod_E0429_dati.jsonβ JSON unico
2.4 FASE 4 β Audio
- Lanciare
ai_studio_code.pysuscaricatiABβ generachinesepod_E0429_cinese.mp3
2.5 FASE 5 β Timestamp
- Lanciare
analizza_silenzi.pyβ generachinesepod_E0429_timestamps.json
2.6 RISULTATO FINALE in scaricatiAB
chinesepod_E0429.pdfβ originalechinesepod_E0429_italiano.pdfβ tradottochinesepod_E0429_dati.jsonβ dati strutturatichinesepod_E0429_cinese.mp3β audiochinesepod_E0429_timestamps.jsonβ per karaoke
βοΈ Tutto pronto per la PWA!
3. Bug Fix – toggleLine()
3.1 Problema
Avviando l’audio di una conversazione, partivano poi in sequenza tutte le altre invece di terminare.
3.2 Soluzione
Aggiungere isPlayingAll = false prima di stopAll() nella funzione toggleLine():
function toggleLine(i) {
if (currentBtn === i && !isPaused) {
if (useMP3) audioEl.pause();
else window.speechSynthesis.pause();
isPaused = true;
setBtnState(i, 'paused');
return;
}
if (currentBtn === i && isPaused) {
if (useMP3) audioEl.play();
else window.speechSynthesis.resume();
isPaused = false;
setBtnState(i, 'playing');
return;
}
// Frase singola β ferma la sequenza
isPlayingAll = false;
document.getElementById('btn-play-all').innerHTML = 'βΆ';
stopAll();
startLine(i);
}
βοΈ Risolto: cliccando βΆ su una singola frase non parte piΓΉ la sequenza.
4. Karaoke – Problema e Soluzioni
4.1 PerchΓ© non funziona il karaoke
- Carica i
_timestamps.json(con start/end per frase intera) β - Ma il testo cinese Γ¨ renderizzato come stringa unica in
<span class="chinese-text">β non Γ¨ spezzato parola per parola - Manca un ciclo
requestAnimationFrameosetIntervalche confrontiaudioEl.currentTimecon i timestamp
4.2 Cosa serve per il karaoke
- Timestamp per ogni singolo carattere o parola
- Oppure interpolazione lineare tra start e end distribuendo i caratteri equamente nel tempo
4.3 Opzioni
- Opzione A: Karaoke con interpolazione lineare (funziona subito, senza rigenerare JSON)
- Opzione B: Rigenerare i JSON con timestamp per ogni carattere (piΓΉ preciso, richiede modificare
analizza_silenzi.py)
π Domanda: Quale preferisci? Opzione A o B?
5. Struttura Timestamp JSON
5.1 Struttura attuale
Il file _cinese_timestamps.json contiene probabilmente:
[
{ 'start': 0.5, 'end': 2.3 },
{ 'start': 2.5, 'end': 4.1 },
...
]
5.2 Struttura desiderata
[
{
'frase': 'δ½ ε₯½',
'start': 0.5,
'end': 2.3,
'parole': [
{ 'char': 'δ½ ', 'start': 0.5, 'end': 1.2 },
{ 'char': 'ε₯½', 'start': 1.2, 'end': 2.3 }
]
}
]
π Per ottenere la struttura desiderata,
analizza_silenzi.py deve essere modificato per generare timestamp per ogni carattere.6. Struttura Remota
6.1 Struttura proposta
TRADUZIONI/
scaricatiAB/
E0429/
chinesepod_E0429.pdf
chinesepod_E0429_italiano.pdf
chinesepod_E0429_dati.json
chinesepod_E0429_cinese.mp3
chinesepod_E0429_timestamps.json
newbie/
elementary/
advanced/
βοΈ La struttura remota Γ¨ una copia esatta del locale.
7. genera_indice.py
7.1 Procedura di aggiornamento
- Aggiungi i PDF in
scaricatiAB - Lancia la pipeline (split β traduci β merge β chinesepod_mp3_v3)
- Lancia
genera_indice.pyβ rigeneralezioni.json - Carica sul server i nuovi file +
lezioni.jsonaggiornato
7.2 Come funziona
genera_indice.pyscansiona le cartelle e ricostruisce l’indice completo- Non devi modificare niente a mano
βοΈ Tutto automatico!