feat: removidos da tela Editar vídeo os passos legados de transcri

- removidos da tela Editar vídeo os passos legados de transcrição, falantes e métricas.

Resumo:
- 4 arquivos alterados
- 0 novos
- 4 modificados
- 0 removidos

 4 files changed, 35 insertions(+), 161 deletions(-)

Arquivos:
  - .jhonny/analises.db
  - admin/PremiereMCP.command
  - code/cep-plugin/index.html
  - code/cep-plugin/main.js
This commit is contained in:
João Henrique
2026-09-10 10:38:18 -04:00
parent b01482d0e7
commit e16244d68d
4 changed files with 35 additions and 161 deletions
Binary file not shown.
+8 -9
View File
@@ -18,7 +18,7 @@
# agente de IA buscar o codigo certo. Best-effort: se o
# abre o tunel temporariamente quando necessario e fecha o
# processo que este ciclo iniciou ao terminar.
# 4. LEMBRETE reinicie o Premiere Pro por completo para o painel
# 4. LEMBRETE recarregue somente a extensao CEP para o painel
# reinstalado ser carregado - este passo so imprime isso
#
# Nao mexe em git (este projeto nao e um repositorio git) e nao sobe
@@ -199,19 +199,18 @@ elif run_step rag; then
fi
# ------------------------------------------------------------
# 4) Lembrete de recarregar o painel dentro do Premiere
# 4) Lembrete de recarregar somente a extensao dentro do Premiere
# ------------------------------------------------------------
if run_step reload; then
step "4/4 REINICIAR O PREMIERE"
echo "O painel ja foi reinstalado (passo 1), mas o Premiere so carrega a"
echo "copia nova depois de um restart completo:"
echo " 1. Feche o Premiere Pro por completo (Cmd+Q)"
echo " 2. Abra de novo e va em Window > Extensions > MCP for Adobe Premiere Pro"
echo " 3. Confira se aparecem as abas 'Bridge' e 'Cortar silencio'"
step "4/4 RECARREGAR A EXTENSAO CEP"
echo "O painel ja foi reinstalado (passo 1). Para carregar a copia nova:"
echo " 1. Feche somente o painel MCP for Adobe Premiere Pro"
echo " 2. Abra novamente em Window > Extensions > MCP for Adobe Premiere Pro"
echo " 3. Confira a aba Editar video e os passos Concluir edicao / Aplicar na timeline"
fi
echo
if [ "$FAILED" != "0" ]; then
die "ciclo terminou com pendencias - corrija os avisos acima antes de testar no Premiere."
fi
ok "Ciclo concluido. Pronto para recarregar o painel no Premiere."
ok "Ciclo concluido. Pronto para recarregar somente a extensao no Premiere."
+6 -116
View File
@@ -95,7 +95,7 @@
<section class="card scanner-analysis-card" id="scannerAnalysisCard">
<div class="card-head"><h2>Análise do Scanner</h2><span class="step-chip" id="scannerAnalysisStatus">Não carregada</span></div>
<p class="field-help" id="scannerAnalysisInfo">Carregue a análise mais recente do Scanner antes de gerar o plano de edição.</p>
<p class="field-help" id="scannerAnalysisInfo">Carregue a análise mais recente do Scanner antes de concluir a edição.</p>
<ul class="scanner-analysis-checks" id="scannerAnalysisChecks" aria-label="Componentes carregados da análise">
<li id="scannerCheckTranscription" data-state="pending"><span class="check-dot" aria-hidden="true"></span><span>Transcrição</span><em>Aguardando</em></li>
<li id="scannerCheckDiarization" data-state="pending"><span class="check-dot" aria-hidden="true"></span><span>Detecção de falantes</span><em>Aguardando</em></li>
@@ -122,124 +122,14 @@
</div>
</section>
<section class="step editar-video-legado" id="step2" data-state="locked">
<section class="step" id="step2" data-state="locked">
<div class="step-head">
<span class="step-number" aria-hidden="true">2</span>
<div class="step-title">
<h2>Transcrever a fala</h2>
<p>Gera o texto com marcação de tempo usando o Whisper local.</p>
</div>
<span class="step-chip" id="step2Chip">Bloqueado</span>
</div>
<div class="step-body">
<div class="callout callout-info" id="silenceCachedSection" hidden>
<strong>Este vídeo já foi transcrito antes</strong>
<p>Reaproveite e pule direto para o plano de cortes — leva segundos em vez de minutos.</p>
<label class="field-label" for="silenceCachedSelect">Transcrição salva</label>
<select id="silenceCachedSelect" class="select-field"></select>
<button id="btnUseCachedTranscript" class="button button-primary" onclick="silenceUseCachedTranscript()" type="button">Usar esta transcrição</button>
</div>
<!-- LEGADO comentado em 2026-09-09: transcrição/diarização/métricas de voz
feitas aqui duplicavam o que a aba Scanner já faz e persiste no banco.
Funções JS correspondentes (silenceTranscribe, silenceDiarizeSpeakers,
silenceComputeVoiceFeatures) comentadas em main.js.
<div class="field-grid">
<div>
<label class="field-label" for="silenceModel">Modelo</label>
<select id="silenceModel" class="select-field">
<option value="small" selected>small (recomendado)</option>
<option value="base">base (mais rápido)</option>
<option value="medium">medium (mais preciso)</option>
</select>
</div>
<div>
<span class="field-label">Idioma</span>
<p class="field-static" id="silenceLanguageInfo">Português</p>
</div>
</div>
<label class="checkbox-field">
<input type="checkbox" id="silenceDiarize">
<span>Detectar quem fala logo após transcrever</span>
</label>
<label class="checkbox-field">
<input type="checkbox" id="silenceVoiceFeaturesAuto">
<span>Calcular métricas de voz logo após transcrever</span>
</label>
-->
<div class="speaker-config" id="silenceSpeakerConfig" hidden>
<div class="speaker-config-head">
<strong>Falantes detectados</strong>
<span id="silenceSpeakerCount"></span>
</div>
<p class="field-help">Dê um nome a cada falante e desative quem não deve aparecer no vídeo. A decisão será enviada no JSON para a IA.</p>
<div id="silenceSpeakerList"></div>
</div>
<div class="mini-action" id="silenceRemovalRow">
<div>
<label class="checkbox-field" style="border:none;padding:0;background:none">
<input type="checkbox" id="silenceRemovalEnabled">
<span>Remoção de silêncios</span>
</label>
<span>Só grava a preferência no JSON — não corta nada aqui. A IA decide os cortes usando esse valor.</span>
</div>
<div style="display:flex;align-items:center;gap:6px;flex:0 0 auto">
<label class="field-label" for="silenceRemovalMinDuration" style="margin:0">Mín. (s)</label>
<input type="number" id="silenceRemovalMinDuration" class="select-field" style="width:64px" step="0.1" min="0" value="0.8">
</div>
</div>
<!-- LEGADO comentado em 2026-09-09 (ver nota acima).
<button id="btnTranscribe" class="button button-primary" onclick="silenceTranscribe()" type="button" disabled>Transcrever</button>
<p class="field-help" id="silenceCacheInfo"></p>
-->
</div>
</section>
<!-- LEGADO comentado em 2026-09-09: "Refazer" chamava silenceDiarizeSpeakers()
e silenceComputeVoiceFeatures(), agora comentadas em main.js — a aba
Refinar já cobre revisão de falantes com dados vindos do Scanner.
<section class="step step-optional" id="step3" data-state="locked">
<div class="step-head">
<span class="step-number" aria-hidden="true">3</span>
<div class="step-title">
<h2>Revisar falantes e áudio <span class="badge-optional">opcional</span></h2>
<p>Confira os resultados processados e ajuste os dados antes de gerar o JSON.</p>
</div>
<span class="step-chip" id="step3Chip">Bloqueado</span>
</div>
<div class="step-body">
<div class="mini-action">
<div>
<strong>Detecção de falantes</strong>
<span id="silenceDiarizeInfo">Separa os falantes por trecho. Precisa do token Hugging Face.</span>
</div>
<button id="btnDiarize" class="button" onclick="silenceDiarizeSpeakers()" type="button" disabled>Refazer</button>
</div>
<div class="mini-action">
<div>
<strong>Métricas de voz</strong>
<span id="silenceVoiceFeaturesInfo">Pitch, energia, velocidade de fala e pausas de cada trecho.</span>
</div>
<button id="btnVoiceFeatures" class="button" onclick="silenceComputeVoiceFeatures()" type="button" disabled>Refazer</button>
</div>
</div>
</section>
-->
<section class="step" id="step4" data-state="locked">
<div class="step-head">
<span class="step-number" aria-hidden="true">4</span>
<div class="step-title">
<h2>Concluir edição</h2>
<p>Salva no banco a análise carregada, o tipo de vídeo e as configurações editoriais escolhidas. O JSON para a IA poderá ser gerado depois, quando necessário.</p>
</div>
<span class="step-chip" id="step4Chip">Bloqueado</span>
<span class="step-chip" id="step2Chip">Bloqueado</span>
</div>
<div class="step-body">
<button id="btnBuildPlan" class="button button-primary" onclick="silenceConcluirEdicao()" type="button" disabled>Concluir edição</button>
@@ -255,14 +145,14 @@
</div>
</section>
<section class="step" id="step5" data-state="locked">
<section class="step" id="step3" data-state="locked">
<div class="step-head">
<span class="step-number" aria-hidden="true">5</span>
<span class="step-number" aria-hidden="true">3</span>
<div class="step-title">
<h2>Aplicar na timeline</h2>
<p>Selecione o plano de edição que a IA devolveu (cortes, zooms, textos, marcadores) e execute na sequência.</p>
</div>
<span class="step-chip" id="step5Chip">Bloqueado</span>
<span class="step-chip" id="step3Chip">Bloqueado</span>
</div>
<div class="step-body">
<label class="field-label" for="editorialPlanJson">JSON de ações devolvido pela IA</label>
+21 -36
View File
@@ -2151,11 +2151,13 @@ function silenceSelecionarTipoVideo() {
if (!tipo) {
document.getElementById("silenceTipoVideoInfo").textContent = "Selecione um tipo cadastrado para continuar.";
setStep(1, "ready", "Selecione um tipo");
setStep(2, "locked", "Selecione o tipo");
document.getElementById("btnBuildPlan").disabled = true;
return;
}
document.getElementById("silenceTipoVideoInfo").textContent = tipo.nome + " · instruções serão incluídas no JSON para a IA.";
setStep(1, "done", "Selecionado");
setStep(2, "ready", "Pronto para concluir");
document.getElementById("btnBuildPlan").disabled = false;
silenceLog("Tipo de vídeo selecionado: " + tipo.nome + ".", "ok");
}
@@ -2371,10 +2373,9 @@ function silenceLoadScannerAnalysis() {
info.textContent = silenceState.sequenceName + " · " + quantidade + " trecho(s) · " +
(audioDoBanco.metricas_de_voz_disponiveis ? "métricas disponíveis" : "métricas não realizadas") + " · " +
(audioDoBanco.diarizacao_disponivel ? falantes.length + " falante(s)" : "diarização não realizada");
setStep(3, "ready", "Pronto");
setStep(2, "locked", "Selecione o tipo");
setStep(1, "ready", "Selecione um tipo");
setStep(4, "locked", "Selecione o tipo");
setStep(5, "locked", "Bloqueado");
setStep(3, "locked", "Aguardando conclusão");
renderizarTiposDeVideoParaEdicao();
document.getElementById("btnBuildPlan").disabled = true;
// btnDiarize/btnVoiceFeatures/silenceDiarizeInfo/silenceVoiceFeaturesInfo ficavam no
@@ -2712,10 +2713,8 @@ function silenceDetectClip() {
// muda — evita aplicar um plano gerado para outro material.
function lockStepsFrom(first) {
var buttons = {
2: ["btnTranscribe"],
3: ["btnDiarize", "btnVoiceFeatures"],
4: ["btnBuildPlan"],
5: ["btnApplyEditorialActions"],
2: ["btnBuildPlan"],
3: ["btnApplyEditorialActions"],
};
for (var n = first; n <= 5; n++) {
setStep(n, "locked", "Bloqueado");
@@ -2769,8 +2768,7 @@ function silenceUseCachedTranscript() {
// Passos que dependem de existir uma transcrição, seja nova ou reaproveitada.
function unlockAfterTranscript() {
setStep(2, "done", "Transcrito");
setStep(3, "ready", "Opcional");
setStep(4, "ready", "Sua vez");
setStep(2, "ready", "Pronto para concluir");
document.getElementById("btnBuildPlan").disabled = false;
// btnDiarize/btnVoiceFeatures ficavam no step3 (legado, comentado em 2026-09-09).
var elBtnDiarize = document.getElementById("btnDiarize");
@@ -3264,14 +3262,6 @@ function silenceConcluirEdicao() {
configuracao: {
nome_do_tipo: silenceState.tipoVideo.nome,
instrucoes_do_tipo: tipoVideoResumoParaJson(silenceState.tipoVideo),
configuracoes_de_fala: speakerConfigurationForJson(),
configuracoes_de_edicao: {
remocao_de_silencio: {
habilitada: document.getElementById("silenceRemovalEnabled").checked,
duracao_minima_segundos: Number(document.getElementById("silenceRemovalMinDuration").value) || 0.8,
},
legendas: carregarConfiguracaoDeLegendas(),
},
transcricao: {
caminho: silenceState.transcriptPath,
origem: "Scanner",
@@ -3287,7 +3277,7 @@ function silenceConcluirEdicao() {
}
setBusy("btnBuildPlan", true);
setStep(4, "running", "Salvando…");
setStep(2, "running", "Salvando…");
taskStart("Concluindo a edição", "Salvando a configuração no banco");
silenceLog("Salvando o tipo de vídeo e as configurações editoriais no banco…");
runStreamed(
@@ -3297,14 +3287,14 @@ function silenceConcluirEdicao() {
function (codigo, ultimoErro) {
setBusy("btnBuildPlan", false);
if (codigo !== 0) {
setStep(4, "error", "Falhou");
setStep(2, "error", "Falhou");
taskEnd(false, "Não foi possível concluir a edição.", ultimoErro);
silenceLog("Falha ao salvar a configuração editorial.", "err");
showToast("err", ultimoErro || "Não foi possível salvar a edição no banco.");
return;
}
setStep(4, "done", "Edição concluída");
setStep(5, "locked", "Aguardando plano da IA");
setStep(2, "done", "Edição concluída");
setStep(3, "locked", "Aguardando plano da IA");
taskEnd(true, "Edição concluída e salva no banco.");
silenceLog("Edição concluída e salva no banco de análises.", "ok");
showToast("ok", "Edição concluída e salva no banco.");
@@ -3323,20 +3313,15 @@ function silenceGenerateJson() {
return;
}
setBusy("btnBuildPlan", true);
setStep(4, "running", "Gerando…");
setStep(2, "running", "Gerando…");
silenceLog("Gerando arquivo JSON para a IA…");
try {
var transcript = JSON.parse(fs.readFileSync(silenceState.transcriptPath, "utf-8"));
var silenceEnabled = document.getElementById("silenceRemovalEnabled").checked;
var minSilence = parseFloat(document.getElementById("silenceRemovalMinDuration").value);
if (!isFinite(minSilence) || minSilence < 0) minSilence = 0.8;
transcript.sequence = {
name: silenceState.sequenceName,
media_path: silenceState.mediaPath,
};
transcript.settings = Object.assign({}, transcript.settings, {
silence_removal: { enabled: silenceEnabled, min_silence_seconds: minSilence },
legendas: carregarConfiguracaoDeLegendas(),
});
transcript.speaker_configuration = speakerConfigurationForJson();
@@ -3361,13 +3346,13 @@ function silenceGenerateJson() {
document.getElementById("silencePlanInfo").textContent =
"Envie este arquivo a um agente de IA externo. Ele deve devolver o plano de edição em JSON para o passo 5.";
setStep(4, "done", "JSON pronto");
setStep(5, "ready", "Sua vez");
setStep(2, "done", "JSON pronto");
setStep(3, "ready", "Sua vez");
document.getElementById("btnApplyEditorialActions").disabled = false;
showToast("ok", "JSON gerado: " + path.basename(out));
silenceLog("JSON gerado em " + out + " (" + segCount + " trechos).", "ok");
} catch (e) {
setStep(4, "error", "Falhou");
setStep(2, "error", "Falhou");
showToast("err", "Falha ao gerar o JSON: " + e.message);
silenceLog("Falha ao gerar o JSON: " + e.message, "err");
}
@@ -3442,7 +3427,7 @@ function applyEditorialActions() {
if (typeof window.confirm === "function" && !window.confirm(summary)) return;
setBusy("btnApplyEditorialActions", true);
setStep(5, "running", "Aplicando…");
setStep(3, "running", "Aplicando…");
taskStart("Aplicando o plano de edição", "Criando backup da sequência");
silenceLog("Criando backup da sequência…");
cs.evalScript(
@@ -3457,7 +3442,7 @@ function applyEditorialActions() {
var caminhoDoPlano = path.join(silenceState.outputDir || os.tmpdir(), "plano-editorial-" + Date.now() + ".json");
try { fs.writeFileSync(caminhoDoPlano, JSON.stringify(plan, null, 2), "utf-8"); } catch (erroEscrita) {
setBusy("btnApplyEditorialActions", false);
setStep(5, "error", "Falhou");
setStep(3, "error", "Falhou");
taskEnd(false, "Não foi possível salvar o plano.", erroEscrita.message);
return;
}
@@ -3474,12 +3459,12 @@ function applyEditorialActions() {
processoAplicacao = null;
setBusy("btnApplyEditorialActions", false);
if (code !== 0) {
setStep(5, "error", "Falhou");
setStep(3, "error", "Falhou");
taskEnd(false, "Falha ao aplicar o plano (código " + code + ").", lastErr);
silenceLog("Falha ao aplicar o plano (código " + code + ").", "err");
return;
}
setStep(5, "done", "Aplicado");
setStep(3, "done", "Aplicado");
taskEnd(true, numActions + " ação(ões) aplicadas na timeline!");
silenceLog("Plano de edição aplicado com sucesso!", "ok");
}
@@ -4134,8 +4119,8 @@ function downloadModel(model, btn, approxMB) {
setStep(1, "locked", "Scanner");
setStep(2, "locked", "Scanner");
setStep(3, "locked", "Aguardando análise");
setStep(4, "locked", "Aguardando análise");
setStep(5, "locked", "Aguardando plano");
setStep(2, "locked", "Aguardando análise");
setStep(3, "locked", "Aguardando análise");
log("MCP for Adobe Premiere Pro CEP connector loaded");
setStatus("waiting", "Aguardando — a ponte está iniciando");