diff --git a/.jhonny/analises.db b/.jhonny/analises.db index f3b048d..472775e 100644 Binary files a/.jhonny/analises.db and b/.jhonny/analises.db differ diff --git a/code/cep-plugin/index.html b/code/cep-plugin/index.html index 2f51e95..ecafaef 100755 --- a/code/cep-plugin/index.html +++ b/code/cep-plugin/index.html @@ -135,6 +135,10 @@ + + +
diff --git a/code/cep-plugin/main.js b/code/cep-plugin/main.js index 4db4f4c..1e073a0 100755 --- a/code/cep-plugin/main.js +++ b/code/cep-plugin/main.js @@ -2319,12 +2319,19 @@ function silenceLoadScannerAnalysis() { setStep(5, "locked", "Bloqueado"); renderizarTiposDeVideoParaEdicao(); document.getElementById("btnBuildPlan").disabled = true; - document.getElementById("btnDiarize").disabled = false; - document.getElementById("btnVoiceFeatures").disabled = false; - document.getElementById("silenceDiarizeInfo").textContent = temDiarizacao + // btnDiarize/btnVoiceFeatures/silenceDiarizeInfo/silenceVoiceFeaturesInfo ficavam no + // step3 (legado, comentado em 2026-09-09 no index.html) — checagem defensiva para não + // quebrar este fluxo (ativo) se os elementos não existirem mais no DOM. + var elBtnDiarize = document.getElementById("btnDiarize"); + if (elBtnDiarize) elBtnDiarize.disabled = false; + var elBtnVoiceFeatures = document.getElementById("btnVoiceFeatures"); + if (elBtnVoiceFeatures) elBtnVoiceFeatures.disabled = false; + var elDiarizeInfo = document.getElementById("silenceDiarizeInfo"); + if (elDiarizeInfo) elDiarizeInfo.textContent = temDiarizacao ? falantes.length + " falante(s) disponíveis no banco de dados." : "Diarização não realizada nesta análise do Scanner. Use Refazer se necessário."; - document.getElementById("silenceVoiceFeaturesInfo").textContent = temMetricasDeVoz + var elVoiceFeaturesInfo = document.getElementById("silenceVoiceFeaturesInfo"); + if (elVoiceFeaturesInfo) elVoiceFeaturesInfo.textContent = temMetricasDeVoz ? (audioDoBanco.falas_com_metricas || 0) + " trecho(s) com métricas de voz no banco." : "Métricas de voz não realizadas nesta análise do Scanner. Use Refazer se necessário."; silenceLog("Análise do Scanner carregada: " + quantidade + " trecho(s).", "ok"); @@ -2692,7 +2699,9 @@ function silenceUseCachedTranscript() { silenceState.transcribeModel = entry.model; silenceState.cachedTranscriptPath = entry.transcriptPath; silenceLoadSpeakerConfiguration(); - document.getElementById("silenceCacheInfo").textContent = + // silenceCacheInfo ficava no step2 (botão "Transcrever", legado comentado em 2026-09-09). + var elCacheInfo = document.getElementById("silenceCacheInfo"); + if (elCacheInfo) elCacheInfo.textContent = "Usando a transcrição salva em " + new Date(entry.savedAt).toLocaleString() + "."; unlockAfterTranscript(); showToast("ok", "Transcrição reaproveitada — pule para o passo 4."); @@ -2705,8 +2714,11 @@ function unlockAfterTranscript() { setStep(3, "ready", "Opcional"); setStep(4, "ready", "Sua vez"); document.getElementById("btnBuildPlan").disabled = false; - document.getElementById("btnDiarize").disabled = false; - document.getElementById("btnVoiceFeatures").disabled = false; + // btnDiarize/btnVoiceFeatures ficavam no step3 (legado, comentado em 2026-09-09). + var elBtnDiarize = document.getElementById("btnDiarize"); + if (elBtnDiarize) elBtnDiarize.disabled = false; + var elBtnVoiceFeatures = document.getElementById("btnVoiceFeatures"); + if (elBtnVoiceFeatures) elBtnVoiceFeatures.disabled = false; } // Premiere is launched by Finder/LaunchServices, not a login shell, so the CEP @@ -2773,6 +2785,11 @@ function runStreamed(bin, args, onLine, onDone, options) { return child; } +// LEGADO comentado em 2026-09-09: transcrição/diarização feitas direto nesta aba, +// duplicando o que a aba Scanner já faz e persiste no banco (.jhonny/analises.db). +// Confirmado por teste real que o Scanner cobre o mesmo fluxo de ponta a ponta. +// Mantido comentado (não removido) a pedido do usuário, para referência futura. +/* function silenceTranscribe() { if (!silenceState.mediaPath) return; document.getElementById("silenceCacheInfo").textContent = ""; @@ -2906,6 +2923,7 @@ function silenceDiarizeSpeakers(onFinished) { hfSpawnOptions() ); } +*/ function speakerNameDefault(speakerId) { return speakerId; @@ -3116,6 +3134,10 @@ function syncTranscriptToCache() { } } +// LEGADO comentado em 2026-09-09: calculava métricas de voz direto nesta aba, +// duplicando o que a aba Scanner já faz e persiste no banco (.jhonny/analises.db). +// Mantido comentado (não removido) a pedido do usuário, para referência futura. +/* function silenceComputeVoiceFeatures() { if (!silenceState.transcriptPath) return; if (!silenceState.mediaPath) { @@ -3158,6 +3180,7 @@ function silenceComputeVoiceFeatures() { } ); } +*/ // Não gera decisões de corte: só empacota transcrição + tempos + locutores + // métricas de voz + configurações de edição num JSON para um agente de IA diff --git a/code/engine/requirements-audio.txt b/code/engine/requirements-audio.txt new file mode 100644 index 0000000..7a7a124 --- /dev/null +++ b/code/engine/requirements-audio.txt @@ -0,0 +1,4 @@ +# Dependência que faltava no venv whisperx-transcricao e derrubava silenciosamente +# a diarização e a detecção de emoção (integracoes/huggingface/provider_de_diarizacao_local.py +# e provider_de_emocao_local.py importam soundfile para ler o áudio extraído). +soundfile